#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline
#define endl "\n"
int cnt[1001000],a[1001000],ans,print[1001000],qlen,m,n,l,r,t,pre[1001000],bl,br;
int t2,t3;
bool b[1001000];
struct xy
{
int x,y,z;
}ask[1001000],cg[1001000];
char t1;
il bool cmp(xy qwe,xy wer)
{
if(qwe.x/bl!=wer.x/bl)return qwe.x/bl<wer.x/bl;
else if(qwe.y/br!=wer.y/br)return qwe.y/br<wer.y/br;
else return qwe.z<wer.z;
}
il void del(int k)
{
cnt[k]--;
if(cnt[k]==0)ans--;
}
il void add(int k)
{
cnt[k]++;
if(cnt[k]==1)ans++;
}
il void movel(int k)
{
if(l<=k)
{
for(int i=l;i<k;++i)
{
del(a[i]);
}
l=k;
}
else
{
for(int i=k;i<l;++i)
{
add(a[i]);
}
l=k;
}
}
il void mover(int k)
{
if(r<=k)
{
for(int i=r+1;i<=k;++i)
{
add(a[i]);
}
r=k;
}
else
{
for(int i=k+1;i<=r;++i)
{
del(a[i]);
}
r=k;
}
}
il void movet(int k)
{
if(k>=t)
{
for(int i=t+1;i<=k;++i)
{
if(cg[i].x!=-1)
{
if(l<=cg[i].x&&cg[i].x<=r)
{
del(a[cg[i].x]);
add(cg[i].y);
}
a[cg[i].x]=cg[i].y;
}
}
t=k;
}
else
{
for(int i=k;i<t;++i)
{
if(cg[i].x!=-1)
{
if(l<=cg[i].x&&cg[i].x<=r)
{
add(a[cg[i].x]);
del(cg[i].y);
}
a[cg[i].x]=pre[i];
}
}
t=k;
}
}
il void getpre()
{
for(t=1;t<=n;++t)
{
if(cg[t].x!=-1)
{
pre[t]=a[cg[t].x];
a[cg[t].x]=cg[t].y;
}
}
for(t=n;t>=1;--t)
{
if(cg[t].x!=-1)
{
a[cg[t].x]=pre[t];
}
}
t=0;
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
bl=br=(int)(1.0*n/sqrt(m));
qlen=0;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=1;i<=m;++i)
{
cin>>t1>>t2>>t3;
if(t1=='R')
{
cg[i].x=t2;
cg[i].y=t3;
}
else if(t1=='Q')
{
cg[i].x=-1;
ask[++qlen].x=t2;
ask[qlen].y=t3;
ask[qlen].z=i;
b[i]=1;
}
}
sort(ask+1,ask+1+qlen,cmp);
getpre();
for(int i=1;i<=qlen;++i)
{
movel(ask[i].x);
mover(ask[i].y);
movet(ask[i].z);
print[ask[i].z]=ans;
}
for(int i=1;i<=m;++i)
{
if(b[i])
{
cout<<print[i]<<endl;
}
}
return 0;
}