#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define read(x) scanf("%d",&x)
int n,m,l,r;
int a[150000];
int cnt[1000005]={0};
char c;
struct node
{
int l,pos,r,t,id;
}q[150000];
int cc=0;
int ch[150000],to[150000],h;
int lst[150000],b[150000],ans[150000];
bool cmp(node n,node m)
{
if(n.pos^m.pos) return n.pos<m.pos;
else if(n.r^m.r) return n.r<m.r;
else return n.t<m.t;
}
int main()
{
read(n),read(m);
for(int i=1;i<=n;i++) read(a[i]),b[i]=a[i];
h=pow(n,0.66666666667);
for(int i=1;i<=m;i++)
{
cin>>c;
read(l),read(r);
if(c=='Q')
{
q[++cc].pos=n/h;
q[cc].l=l,q[cc].r=r;
q[cc].t=i;
q[cc].id=cc;
}
else
{
if(i==1) a[ch[i]]=to[i];
ch[i]=l,to[i]=r;
lst[i]=b[l];
b[l]=r;
}
}
sort(q+1,q+cc+1,cmp);
int l=1,r=0,t=0,now=0;
for(int i=1;i<=cc;i++)
{
while(q[i].l<l){l--;if(!cnt[a[l]]) now++;cnt[a[l]]++;}
while(q[i].l>l){cnt[a[l]]--;if(!cnt[a[l]]) now--;l++;}
while(q[i].r>r){r++;if(!cnt[a[r]]) now++;cnt[a[r]]++;}
while(q[i].r<r){cnt[a[r]]--;if(!cnt[a[r]]) now--;r--;}
while(q[i].t>t)
{
t++;
if(ch[t])
{
if(ch[t]>=l&&ch[t]<=r)
{
cnt[lst[t]]--;
if(!cnt[lst[t]]) now--;
if(!cnt[to[t]]) now++;
cnt[to[t]]++;
}
a[ch[t]]=to[t];
}
}
while(q[i].t<t)
{
if(ch[t])
{
if(ch[t]>=l&&ch[t]<=r)
{
cnt[to[t]]--;
if(!cnt[to[t]]) now--;
if(!cnt[lst[t]]) now++;
cnt[lst[t]]++;
}
a[ch[t]]=lst[t];
}
t--;
}
ans[q[i].id]=now;
}
for(int i=1;i<=cc;i++) printf("%d\n",ans[i]);
return 0;
}
谢谢大佬