看了几天,硬是没看出哪里有毛病,就过了后三个点....
#include <bits/stdc++.h>
using namespace std;
inline void qr(register int &ret){register int x=0,f=0;register char ch=getchar();while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();ret=f?-x:x;}
struct node{
int l,r,id,lb,rb,ti;
}p[143338];
bool cmp(node x,node y){
return x.lb==y.lb?(x.rb==y.rb?x.ti<y.ti:x.rb<y.rb):x.l<y.l;
}
char Q;
int n,m,s,l,r,tim,tot,a[143338],aa[143338],cnt[1000005],cha[143338][3],c1,c2,ans[143338];
void add(int x){if(++cnt[x]==1) ++tot;}
void del(int x){if(--cnt[x]==0) --tot;}
int main() {
qr(n),qr(m);
s=pow(n,2.0/3);
for(int i=1;i<=n;++i){
qr(a[i]);
aa[i]=a[i];
}
int o,u;
for(int i=1;i<=m;++i){
cin >> Q;qr(o),qr(u);
if(Q=='Q') p[++c1]=(node){o,u,c1,(o+s-1)/s,(u+1-1)/s,c2};
else cha[++c2][0]=o,cha[c2][1]=aa[o],cha[c2][2]=aa[o]=u;
}
sort(p+1,p+c1+1,cmp);
l=1,r=tim=0;
for(int i=1;i<=c1;++i){
while(tim<p[i].ti){
++tim;
if(cha[tim][0]>=l&&cha[tim][0]<=r) add(cha[tim][2]),del(cha[tim][1]);
a[cha[tim][0]]=a[cha[tim][2]];
}
while(tim>p[i].ti){
if(cha[tim][0]>=l&&cha[tim][0]<=r) add(cha[tim][1]),del(cha[tim][2]);
a[cha[tim][0]]=a[cha[tim][1]];
--tim;
}
while(l>p[i].l) add(a[--l]);
while(r<p[i].r) add(a[++r]);
while(l<p[i].l) del(a[l++]);
while(r>p[i].r) del(a[r--]);
ans[p[i].id]=tot;
}
for(int i=1;i<=c1;++i){
printf("%d\n",ans[i]);
}
return 0;
}