#include<cstdio>
#include<algorithm>
using namespace std;
struct que
{
int l,r,t,ans,p;
}q[2000005];
pair<int,int> c[3000005];
int n,m,cnt[3000005],ans,sum,a[200005],tot;
int b[2000005],k1,k2=1,x,y,l=1,r,t,lst[2000005];
int read()
{
int ret=0;
char ch=getchar();
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9')
{
ret=(ret<<3)+(ret<<1)+(ch-'0');
ch=getchar();
}
return ret;
}
bool cmp1(que x,que y) {return x.l<y.l;}
bool cmp2(que x,que y) {return x.r<y.r;}
bool cmp3(que x,que y) {return x.t<y.t;}
bool cmp4(que x,que y) {return x.p<y.p;}
void upd(int col,int v)
{
if(!cnt[col] && v==1) ans++;
if(cnt[col]==1 && v==-1) ans--;
cnt[col]+=v;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++) b[i]=a[i]=read();
for(int i=1;i<=m;i++)
{
char ch=getchar();
while(ch!='Q' && ch!='R') ch=getchar();
x=read();y=read();
if(ch=='Q')
{
q[++sum].l=x;q[sum].r=y;
q[sum].p=sum;q[sum].t=tot;
}
else c[++tot]=make_pair(x,y);
}
for(int i=1;i<=tot;i++)
{
int x=c[i].first,y=c[i].second;
lst[i]=b[x];b[x]=y;
}
k1=max(sum/50,1);k2=max(k1/50,1);
sort(q+1,q+sum+1,cmp1);
for(int i=1;i<=sum;i+=k1)
{
int t=min(i+k1,sum+1);
sort(q+i,q+t,cmp2);
for(int j=i;j<=t;j+=k2)
{
int tt=min(j+k2,t);
sort(q+j,q+tt,cmp3);
}
}
for(int i=1;i<=sum;i++)
{
while(t<q[i].t)
{
int x=c[++t].first,y=c[t].second;
if(x>=l && x<=r) {upd(a[x],-1);a[x]=y;upd(y,1);}
else a[x]=y;
}
while(t>q[i].t)
{
int x=c[t].first,y=c[t--].second;
if(x>=l && x<=r) {upd(y,-1);a[x]=lst[t+1];upd(a[x],1);}
else a[x]=lst[t+1];
}
while(l<q[i].l) upd(a[l++],-1);
while(l>q[i].l) upd(a[--l],1);
while(r<q[i].r) upd(a[++r],1);
while(r>q[i].r) upd(a[r--],-1);
q[i].ans=ans;
}
sort(q+1,q+sum+1,cmp4);
for(int i=1;i<=sum;i++) printf("%d\n",q[i].ans);
return 0;
}
在upd中如果我把v==1 删了就会全WA.但cnt[col]=0时还能再减吗,为什么会出现cnt[col]<0啊