【题目来源】
https://www.luogu.com.cn/problem/P7910
https://www.acwing.com/problem/content/description/4090/
【算法代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=8005;
int n,Q;
int o2x[maxn]; //o2x[i] represents the position in the new sequence
struct node {
int v,id; //p[i].id represents the original sequence
} p[maxn];
bool cmp(node x,node y) {
if(x.v!=y.v) return x.v<y.v;
return x.id<y.id;
}
int main() {
scanf("%d%d",&n,&Q);
for(int i=1; i<=n; i++) {
scanf("%d",&p[i].v);
p[i].id=i;
}
sort(p+1,p+1+n,cmp);
for(int i=1; i<=n; i++) o2x[p[i].id]=i;
while(Q--) {
int op;
scanf("%d",&op);
if(op==1) {
int x,y;
scanf("%d%d",&x,&y);
p[o2x[x]].v=y;
for(int j=o2x[x]; j>=2; j--)
if(p[j].v<p[j-1].v || p[j].v==p[j-1].v&&p[j].id<p[j-1].id) {
swap(p[j],p[j-1]);
o2x[p[j].id]=j;
o2x[p[j-1].id]=j-1;
} else break;
for(int j=o2x[x]; j<=n-1; j++)
if(p[j].v>p[j+1].v || p[j].v==p[j+1].v&&p[j].id>p[j+1].id) {
swap(p[j],p[j+1]);
o2x[p[j].id]=j;
o2x[p[j+1].id]=j+1;
} else break;
}
else {
int x;
scanf("%d",&x);
printf("%d\n",o2x[x]);
}
}
return 0;
}
/*
in:
3 4
3 2 1
2 3
1 3 2
2 2
2 3
out:
1
1
2
*/