算法和思路是对的,应该是错了一个小细节,52WA
#include<bits/stdc++.h>
using namespace std;
int a[8005],q,n,ans[8005];
struct node{
int x,id;
bool operator <(const node &t) const{
return x==t.x?id<t.id:x<t.x;
}
}f[8005];
int find(int k,int l,int r){
int mid=(l+r)>>1;
if(f[mid].x==k)
return mid;
else if(f[mid].x<k)
return find(k,mid+1,r);
else
return find(k,l,mid-1);
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),f[i]=node({a[i],i});
stable_sort(f+1,f+n+1);
for(int i=1;i<=n;i++)
ans[f[i].id]=i;
for(int i=1;i<=q;i++){
int opt,x,y;
scanf("%d%d",&opt,&x);
if(opt==2)
printf("%d\n",ans[x]);
else{
scanf("%d",&y);
int u=a[x];
if(y!=u){
int k=find(a[x],1,n);
a[x]=f[k].x=y;
if(u<y){
for(int j=k+1;j<=n;j++){
if(f[j]<f[j-1])
swap(f[j],f[j-1]),swap(ans[f[j].id],ans[f[j-1].id]);
else
break;
}
} else{
for(int j=k-1;j>=1;j--)
if(f[j+1]<f[j])
swap(f[j],f[j+1]),swap(ans[f[j].id],ans[f[j+1].id]);
else
break;
}
}
}
}
return 0;
}