调了一天了QAQ
对着题解看感觉是哪里越界了
但是改了就变成 WA #2了,求大佬查错
WA#2 WA#3
//program 0_1.cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+4;
int numq,numf,n,m;
int A[maxn],bel[maxn],ans[maxn],cnt[maxn],num[maxn];//cnt次数,num次数的次数
int Map[maxn<<1],K[maxn<<1],C[maxn<<1]; //map记录离散化
struct section{
int l,r;
int times;
int index;
} S[maxn];
struct Modify{
int pos;
int number;
int value; //离散后的值
} M[maxn];
inline int read()
{
char ch=getchar();
int x=0,f=1;
while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
bool cmp(section a,section b)
{
if(bel[a.l]^bel[b.l]) return bel[a.l]<bel[b.l];
if(bel[a.r]^bel[b.r]) return bel[a.r]<bel[b.r];
return a.times<b.times;
}
void add(int pos)
{
num[cnt[Map[pos]]]--;
num[++cnt[Map[pos]]]++;
}
void del(int pos)
{
num[cnt[Map[pos]]]--;
num[--cnt[Map[pos]]]++; //这里加上 if(cnt[Map[pos]]==0) break;就WA #2了
}
void lsh()
{
for(int i=1;i<=numf+n;i++)
K[i]=C[i];
sort(K+1,K+1+numf+n);
int len=unique(K+1,K+1+n+numf)-K-1;
for(int i=1;i<=n;i++)
Map[i]=lower_bound(K+1,K+1+len,C[i])-K;
for(int i=1;i<=numf;i++)
M[i].value=lower_bound(K+1,K+1+len,C[i+n])-K;
}
void swap(int& a,int& b)
{
a=a^b;
b=a^b;
a=a^b;
}
int main()
{
n=read(),m=read();
num[0]=2147483647;
for(int i=1;i<=n;i++)
C[i]=A[i]=read(); //A记录原数组,C记录原数组与修改值
numq=0,numf=0;
for(int i=1;i<=m;i++)
{
int opt=read();
if(opt==1)
{
S[++numq].l=read();
S[numq].r=read();
S[numq].index=numq;
S[numq].times=numf;
}
if(opt==2)
{
M[++numf].pos=read();
C[numf+n]=M[numf].number=read(); //C记录修改
}
}
lsh(); //离散化
int size=pow(n,2.0/3.0);
for(int i=1;i<=n;i++)
bel[i]=(i-1)/size+1; //belong
sort(S+1,S+1+numq,cmp); //S数组记录查询
int L=1,R=0,T=0;
for(int i=1;i<=numq;i++)
{
int ql=S[i].l;
int qr=S[i].r;
int qt=S[i].times;
while(L<ql) del(L++);
while(L>ql) add(--L);
while(R<qr) add(++R);
while(R>qr) del(R--);
while(T<qt)
{
T++;
if(M[T].pos>=ql&&M[T].pos<=qr)
{
del(M[T].pos);
num[cnt[M[T].value]]--; //add
num[++cnt[M[T].value]]++;
}
//swap(M[T].number,A[M[T].pos]);
swap(M[T].value,Map[M[T].pos]);
}
while(T>qt)
{
if(M[T].pos>=ql&&M[T].pos<=qr)
{
del(M[T].pos);
num[cnt[M[T].value]]--; //add
num[++cnt[M[T].value]]++;
}
//swap(M[T].number,A[M[T].pos]);
swap(M[T].value,Map[M[T].pos]);
T--;
}
for(int j=1;j<maxn;j++)
if(!num[j]) {ans[S[i].index]=j;break;}
}
for(int i=1;i<=numq;i++)
printf("%d\n",ans[i]);
return 0;
}