rt,76pts TLE
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();};
while(ch<='9'&&ch>='0'){x=x*10+ch-48,ch=getchar();};
return x*f;
}
int a[maxn];
struct node{
int l,r,i,t;
}d[maxn];
node g[maxn];
int sum;
int top,tot;
int gi;
bool cmp(node x,node y){
if(x.l/gi!=y.l/gi)return x.l<y.l;
else if(x.r/gi!=y.r/gi) return x.r<y.r;
else if(x.r/gi&1) return x.t<y.t;
else return x.t>y.t;
}
int t[maxn];
void add(int x){
t[a[x]]++;
if(1==t[a[x]])sum++;
}
void del(int x){
t[a[x]]--;
if(!t[a[x]])sum--;
}
void mod(int ti,int i){
int x=g[ti].l;
if(x<=d[i].r&&x>=d[i].l){
if(--t[a[x]]==0)sum--;
if(++t[g[ti].r]==1)sum++;
}
swap(g[ti].r,a[x]);
}
int ans[maxn];
int main(){
int n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
for(int i=1;i<=m;i++){
char ch;
cin>>ch;
if(ch=='R'){
int x=read(),c=read();
g[++top]={x,c};
}
else {
int l=read(),r=read();
d[++tot]={l,r,tot,top};
}
}
gi=sqrt(n);
sort(d+1,d+tot+1,cmp);
for(int i=1,l=1,r=0,ti=0;i<=tot;i++){
while(l>d[i].l)add(--l);
while(r<d[i].r)add(++r);
while(l<d[i].l)del(l++);
while(r>d[i].r)del(r--);
while(ti<d[i].t)mod(++ti,i);
while(ti>d[i].t)mod(ti--,i);
ans[d[i].i]=sum;
}
for(int i=1;i<=tot;i++)cout<<ans[i]<<endl;
}