假如现在有一个序列a[],有两种操作
1、给出k,在原序列第k和k+1个数之间插入一个数
2、给出k,询问当前第k个数是多少
假如我们使用数组维护,那么插入操作的时间复杂度是O(n),查询操作的时间复杂度是O(1)
同时我们也知道了用指针可以完成这个问题,那么我们是否可以用数组来模拟指针的情况呢?
请聪明的读者自行思考这个问题
Input
第一行两个数 n,q,表示原序列长度为 n,操作次数为 q
第二行包括 n 个数,表示原序列
接下来 q 行每行第一个数 op 表示操作类型
1 操作包括两个数 k,val 表示在第 k 和第 k+1 个数之间插入一个数 val
2 操作包括一个数 k 表示询问第 k 个数的值
Output
输出包括若干行,每行对应一个 2 操作询问的结果
Constraint
2≤n≤200000
询问次数 ≤200000
其中 2 操作次数 ≤100
Sample Input
3 2
3 2 1
1 2 4
2 3
Sample Output
4
#include<bits/stdc++.h>
using namespace std;
int n,q,a[400010]={},op;
int main(){
int k,val;
scanf("%d %d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
while(q--){
scanf("%d",&op);
if(op==1){
scanf("%d%d",&k,&val);
for(int i=n;i>k;i--){
a[i+1]=a[i];
}
a[k+1]=val;
n=n+1;
}else{
scanf("%d",&k);
printf("%d\n",a[k]);
}
}
return 0;
}