TLE#7至#12
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+20;
int s,n,cnt,num,tot,m;
int a[N],b[N],c;
int ans[N];
struct node{
int l,r,time,id;
}z[N],g[N];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
bool cmp(node x,node y){
if(x.l!=y.l){
return x.l<y.l;
}
if(x.r!=y.r){
return x.r<x.r;
}
return x.time<y.time;
}
/*bool cmp (const node &a, const node &b)
{
return a.l / s == b.l / s ? a.r / s == b.r / s ? a.time < b.time : a.r < b.r : a.l < b.l;
}*/
inline void add(int x){
if(b[x]==0){
c++;
}
b[x]++;
}
inline void del(int x){
if(b[x]==1){
c--;
}
b[x]--;
}
void xiu(int i,int x){
if(z[i].l<=g[x].l&&g[x].l<=z[i].r ){
add(g[x].r);
del(a[g[x].l]);
}
swap(a[g[x].l],g[x].r);
//aacout<<a[g[x].l]<<endl;
}
int main(){
n=read(),m=read();
s = pow(n, 2.0/3.0);
for(int i=1;i<=n;i++){
a[i]=read();
}
for(int i=1;i<=m;i++){
int x,y;
char opt;
cin>>opt;
x=read(),y=read();
//cout<<x<<" "<<y<<endl;
if(opt=='Q'){
cnt++;
z[cnt].l=x;
z[cnt].r=y;
z[cnt].id=cnt;
z[cnt].time=tot;
}
else{
tot++;
g[tot].l=x;
g[tot].r=y;
}
}
sort(z+1,z+1+cnt,cmp);
int ll=1,rr=0,tt=0;
for(int i=1;i<=cnt;i++){
int il=z[i].l,ir=z[i].r,it=z[i].time;
while(ll>il){
ll--;
add(a[ll]);
}
while(rr>ir){
del(a[rr]);
rr--;
}
while(ll<il){
del(a[ll]);
ll++;
}
while(rr<ir){
rr++;
add(a[rr]);
}
while(tt<it){
tt++;
xiu(i,tt);
}
while(tt>it){
xiu(i,tt);
tt--;
}
ans[z[i].id]=c;
//cout<<c<<endl;
}
for(int i=1;i<=cnt;i++){
printf("%d\n",ans[i]);
}
}