for (int i = 1; i <= n; i++) for (int j = i; j>=2; j‐‐) if ( a[j] < a[j‐1] ){ int t = a[j‐1]; a[j‐1] = a[j]; a[j] = t; }这下面是Pascal 的示范代码
for i:=1 to n do for j:=i downto 2 do if a[j]<a[j‐1] then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end;
为了帮助小 更好的理解插入排序,小
的老师
老师留下了这么一道家庭作业:
老师给了一个长度为
的数组
,数组下标从
开始,并且数组中的所有元素均为非负整数。小
需要支持在数组
上的
次操作,操作共两种,参数分别如下:
: 这是第一种操作,会将
的第
个元素,也就是
的值,修改为
。保证
。 注意这种操作会改变数组的元素, 修改得到的数组会被保留, 也会影响后续的操作。
: 这是第二种操作,假设 H 老师按照上面的伪代码对
数组进行排序,你需要告诉
老师原来
的第
个元素,也就是
,在排序后的新数组所处的位置。保证
。 注意这种操作不会改变数组的元素, 排序后的数组不会被保留, 也不会影响后续的操作 。
老师不喜欢过多的修改,所以他保证类型
的操作次数不超过
。
输入的第一行包含两个正整数
,表示数组长度和操作次数。保证
。
输入的第二行包含
个空格分隔的非负整数,其中第
个非负整数表示
。保证
。
接下来
行,每行
个正整数,表示一次操作,操作格式见题目描述。
对于每一次类型为的询问,输出一行一个正整数表示答案。
对于所有测试数据,满足
。对于所有测试数据,保证在所有
次操作中,至多有
次操作属于类型一。
各测试点的附加限制及分值如下表所示。