WA on test#8,不知道为啥,求调qwq
#include<bits/stdc++.h>
#define MAXN 500010
using namespace std;
int n,Q,ans[MAXN];
int a[MAXN],b[MAXN];
struct qnode{int l,r,q,lb,rb,t;}que[MAXN];
struct tnode{int t,p,val;}upd[MAXN];
bool cmp(qnode a,qnode b){
if(a.lb!=b.lb)return a.lb<b.lb;
if(a.rb!=b.rb)return a.rb<b.rb;
return a.t<b.t;
}
int cnt[MAXN],ccnt[MAXN],l,r;
void add(int x){ccnt[cnt[a[x]]]--;cnt[a[x]]++;ccnt[cnt[a[x]]]++;}
void del(int x){ccnt[cnt[a[x]]]--;cnt[a[x]]--;ccnt[cnt[a[x]]]++;}
void update(int x){
if(l<=upd[x].p&&upd[x].p<=r){
del(upd[x].p);
swap(upd[x].val,a[upd[x].p]);
add(upd[x].p);
}else swap(upd[x].val,a[upd[x].p]);
}
int query(){
for(int i=1;;i++)
if(ccnt[i]==0)return i;
}
int main(){
scanf("%d%d",&n,&Q);int bl=pow(n,2.0/3),N=0;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[++N]=a[i];
int qcnt=0,ucnt=0;
for(int i=1;i<=Q;i++){
int opt;scanf("%d",&opt);
if(opt==1){
qcnt++;
scanf("%d%d",&que[qcnt].l,&que[qcnt].r);
que[qcnt].q=qcnt;que[qcnt].t=upd[ucnt].t;
que[qcnt].lb=que[qcnt].l/bl+1;
que[qcnt].rb=que[qcnt].r/bl+1;
}else{
ucnt++;
scanf("%d%d",&upd[ucnt].p,&upd[ucnt].val);
upd[ucnt].t=ucnt;b[++N]=upd[ucnt].val;
}
}
sort(b+1,b+N+1);N=unique(b+1,b+N+1)-b-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+N+1,a[i])-b;
for(int i=1;i<=ucnt;i++)upd[i].val=lower_bound(b+1,b+N+1,upd[i].val)-b;
sort(que+1,que+qcnt+1,cmp);
int tim=0;l=1,r=0;cnt[0]=n;ccnt[n]=1;
for(int i=1;i<=qcnt;i++){
int ql=que[i].l,qr=que[i].r,qt=que[i].t;
while(r<qr)r++,add(r);
while(l>ql)l--,add(l);
while(r>qr)del(r),r--;
while(l<ql)del(l),l++;
while(tim<qt)tim++,update(tim);
while(tim>qt)tim--,update(tim);
ans[que[i].q]=query();
}
for(int i=1;i<=qcnt;i++)printf("%d\n",ans[i]);
return 0;
}