#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e6+5;
ll n,q;
ll a[N];
ll cnt[N];
ll ans[N];
ll block;
char op;
struct Que{
ll id,l,r,time;
bool operator<(const Que&b) const{
if( (l/block) != (b.l/block))return (l/block)<(b.l/block);
else if((r/block) != (b.l/block))return (r/block)<(b.r/block);
return time<b.time;
}
}Q[N];
ll numQ;
struct Modui{
ll num,col;
}M[N];
ll numM;
void add(ll x,ll& number){
cnt[x]++;
if(cnt[x]==1)
number++;
}
void del(ll x,ll& number){
cnt[x]--;
if(cnt[x]==0)
number--;
}
signed main(){
scanf("%lld%lld",&n,&q);block=pow(n,2.0/3.0);
for(register ll i=1;i<=n;++i)
scanf("%lld",&a[i]);
for(register ll i=1;i<=q;++i){
while(op=getchar())
if(op=='Q'||op=='R')
break;
if(op == 'R'){
ll a,b;
scanf("%lld%lld",&a,&b);
M[++numM].num=a;
M[numM].col=b;
}
else{
ll l,r;
scanf("%lld%lld",&l,&r);
Q[++numQ].id=numQ;
Q[numQ].l=l;
Q[numQ].r=r;
Q[numQ].time=numM;
}
}
sort(Q+1,Q+1+numQ);
for(register ll l1=1,r1=0,tmp=0,res=0,id,l,r,tim,j=1;j<=numQ;++j){
id=Q[j].id,l=Q[j].l,r=Q[j].r,tim=Q[j].time;
while(r1<r)
add(a[++r1],res);
while(r1>r)
del(a[r1--],res);
while(l1<l)
del(a[l1++],res);
while(l1>l)
add(a[--l1],res);
while(tmp<tim){
if(l<=M[++tmp].num && M[tmp].num<=r){
del(a[M[tmp].num],res);
add(M[tmp].col,res);
}
ll t=a[M[tmp].num];
a[M[tmp].num]=M[tmp].col;
M[tmp].col=t;
}
while(tmp>tim){
if(l<=M[tmp].num && M[tmp].num<=r){
del(a[M[tmp].num],res);
add(M[tmp].col,res);
}
ll t=a[M[tmp].num];
a[M[tmp].num]=M[tmp].col;
M[tmp].col=t;
tmp--;
}
ans[id]=res;
}
for(register ll i=1;i<=numQ;++i)
printf("%lld\n",ans[i]);
return 0;
}