RT
#include<bits/stdc++.h>
using namespace std;
const int N=133338,M=133338;
int n,m,k=0,up=0,a[N],cnt[N],belong[N];
struct node{
int pos,jiu,xin;
}upd[M];
struct Cmd{
int l,r,x,id;
bool operator < (const Cmd& c) const{
if(belong[l]!=belong[c.l]) return belong[l]<belong[c.l];
if(belong[r]!=belong[c.r]) return belong[r]<belong[c.r];
return x<c.x;
}
}cmd[M];
int L=1,R=0,now=0,ans[M],nowup=0;
void change(int pos,int xin,int jiu,int tmp)
//tmp=1: xiu gai; tmp=-1: hui tui
{
// printf("change %d %d %d %d\n",pos,xin,jiu,tmp);
if(pos>=L&&pos<=R)
{
cnt[xin]+=tmp;
cnt[jiu]-=tmp;
if(tmp==1)
{
if(cnt[xin]==1) now++;
if(cnt[jiu]==0) now--;
}
else
{
if(cnt[jiu]==1) now++;
if(cnt[xin]==0) now--;
}
}
if(tmp==1) a[pos]=xin;
else a[pos]=jiu;
}
void add(int p) {if (++cnt[a[p]]==1) ++now;}
void remove(int p) {if(--cnt[a[p]]==0) --now;}
int main()
{
scanf("%d%d",&n,&k);
int s=n/floor(pow(k,2.0/3.0)+0.5);
char yyy[3];
for(int i=1;i<=n;i++) scanf("%d",&a[i]),belong[i]=(i-1)/s+1;
for(int i=1;i<=k;i++)
{
scanf("%s",yyy);
if(yyy[0]=='R')
{
up++;
scanf("%d%d",&upd[up].pos,&upd[up].xin);
upd[up].jiu=a[upd[up].pos];
// printf("upd[up].pos=%d a=%d\n",upd[up].pos,upd[up].jiu);
}
else
{
m++;
scanf("%d%d",&cmd[m].l,&cmd[m].r);
cmd[m].id=m;
cmd[m].x=up;
}
}
sort(cmd+1,cmd+m+1);
for(int i=1;i<=m;i++)
{
// printf("i=%d\n",i);
// for(int i=1;i<=5;i++) printf("%d ",cnt[i]); printf("\n");
while(nowup<cmd[i].x)
{
nowup++;
change(upd[nowup].pos,upd[nowup].xin,upd[nowup].jiu,1);
// printf("nowup=%d %d\n",nowup,upd[nowup].jiu);
}
while(nowup>cmd[i].x)
{
nowup--;
change(upd[nowup].pos,upd[nowup].xin,upd[nowup].jiu,-1);
}
while(L>cmd[i].l) add(--L);
while(R<cmd[i].r) add(++R);
while(L<cmd[i].l) remove(L++);
while(R>cmd[i].r) remove(R--);
ans[cmd[i].id]=now;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}