#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1000005
struct node
{
int val,ch[2],cnt;
}rec[MAXN<<5];
int root[MAXN],num[MAXN],v[MAXN],vsz,tot=0,n,m;
struct opt
{
char ops[3];
int l,r,k;
}opz[MAXN];
#define lowbit(x) (x&-x)
void insert(int &now,int pos,int l,int r,int flag)//不要last参数了。
{
rec[++tot]=rec[now];
now=tot;
int temp=now;
while(l<r)
{
int mid=(l+r)>>1;
if(pos<=mid)
{
rec[++tot]=rec[rec[temp].ch[0]];
rec[temp].ch[0]=tot;
temp=tot;
r=mid;
}
else
{
rec[++tot]=rec[rec[temp].ch[1]];
rec[temp].ch[1]=tot;
temp=tot;
l=mid+1;
}
}
rec[tot].cnt+=flag;
}
int query(int now,int pos,int l,int r)
{
while(l!=r)
{
int mid=(l+r)>>1;
if(pos<=mid)
{
r=mid;
now=rec[now].ch[0];
}
else
{
now=rec[now].ch[1];
l=mid+1;
}
}
return rec[now].cnt;
}
int getans(int x,int pos)
{
int ans=0;
while(x>0)
{
ans+=query(root[x],pos,1,vsz);
x-=lowbit(x);
}
return ans;
}
void upd(int x,int pos,int flag)
{
while(x<=n)
{
insert(root[x],pos,1,vsz,flag);
x+=lowbit(x);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
v[i]=num[i];
}
vsz=n;
for(int i=1;i<=m;i++)
{
scanf("%s",opz[i].ops);
if(opz[i].ops[0]==‘C‘)
{scanf("%d %d",&opz[i].l,&opz[i].k);
v[vsz++]=opz[i].k;
}
else scanf("%d %d %d",&opz[i].l,&opz[i].r,&opz[i].k);
}
sort(v,v+vsz);
vsz=unique(v,v+vsz)-v;
for(int i=0;i<n;i++)
{
int pos=lower_bound(v,v+vsz,num[i])-v+1;
upd(i+1,pos,1);
}
int t1,t2,t3;
for(int i=1;i<=m;i++)
{
if(opz[i].ops[0]==‘C‘)
{
t1=opz[i].l,t2=num[t1-1];
t2=lower_bound(v,v+vsz,t2)-v+1;
upd(t1,t2,-1);
t2=opz[i].k;
num[t1-1]=t2;
t2=lower_bound(v,v+vsz,t2)-v+1;
upd(t1,t2,1);
}
else
{
t1=opz[i].l,t2=opz[i].r,t3=opz[i].k;
t3=lower_bound(v,v+vsz,t3)-v+1;
printf("%d\n",getans(t2,t3)-getans(t1-1,t3));
}
}
return 0;
}