#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e6+5;
struct node{
ll l,r,t,id;
}e[N],er[N];
ll n,m,k,t,ans[N],a[N],tr[N],mp[N],cnt,qu,nxtl=1,nxtr,c,cnte,l,r;
char opt;
bool cmp(node x,node y){
if(x.l/qu!=y.l/qu) return x.l/qu<y.l/qu;
if(x.r/qu!=y.r/qu) return x.r/qu<y.r/qu;
return x.t<y.t;
}
void del(ll x){
mp[x]--;
if(mp[x]==0) c--;
}
void add(ll x){
mp[x]++;
if(mp[x]==1) c++;
}
void pre(ll t){
if(er[t].l>=nxtl&&er[t].r<=nxtr){
del(a[er[t].l]);
add(er[t].r);
}
swap(a[er[t].l],er[t].r);
}
int main(){
// freopen("24531.in","r",stdin);
// freopen("24531.oot","w",stdout);
scanf("%lld%lld",&n,&m);
qu=pow(n,2.0/3.0);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=m;i++){
cin>>opt;
scanf("%lld%lld",&l,&r);
if(opt=='Q')
e[++cnte].l=l,e[cnte].r=r,e[cnte].t=cnt,e[cnte].id=cnte;
else er[++cnt].l=l,er[cnt].r=r;
}
sort(e+1,e+1+cnte,cmp);
for(int i=1;i<=cnte;i++){
while(nxtl<e[i].l) del(a[nxtl++]);
while(nxtl>e[i].l) add(a[--nxtl]);
while(nxtr<e[i].r) add(a[++nxtr]);
while(nxtr>e[i].r) del(a[nxtr--]);
while(t<e[i].t) pre(++t);
while(t>e[i].t) pre(t--);
ans[e[i].id]=c;
}
for(int i=1;i<=cnte;i++) printf("%lld\n",ans[i]);
return 0;
}
就对了最后三个点,其余全WA