#include <bits/stdc++.h>
#define ls tr[p].l
#define rs tr[p].r
using namespace std;
const int INF=0x3f3f3f3f;
inline int read()
{
int w=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
w=(w<<1)+(w<<3)+(ch^48);
ch=getchar();
}
return w*f;
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int maxn=1e5+10,maxv=maxn<<1;
int n,m,a[maxn],tmp[maxv];
int cnt;
int rt[maxv],tot;
struct q
{
string opt;
int a,p,b,k;
}qs[maxn];
struct node
{
int l,r,sum;
}tr[maxn<<5];
void pushup(int p)
{
tr[p].sum=tr[ls].sum+tr[rs].sum;
}
void build(int &p,int l,int r)
{
p=++tot;
if(l==r) return;
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void update(int pre,int &p,int l,int r,int pos,int k)
{
p=++tot,tr[p]=tr[pre];
if(l==r)
{
tr[p].sum+=k;
return;
}
int mid=(l+r)>>1;
if(mid>=pos) update(tr[pre].l,ls,l,mid,pos,k);
else update(tr[pre].r,rs,mid+1,r,pos,k);
pushup(p);
}
int query(int pre,int p,int l,int r,int k)
{
if(l==r) return tr[p].sum-tr[pre].sum;
int mid=(l+r)>>1;
if(mid>=k) return query(tr[pre].l,ls,l,mid,k);
else return query(tr[pre].r,rs,mid+1,r,k);
}
int main()
{
#ifndef ONLINE_JUDGE
#endif
n=read(),m=read();
for(int i=1;i<=n;++i)
{
tmp[++cnt]=a[i]=read();
}
for(int i=1;i<=m;++i)
{
cin>>qs[i].opt;
if(qs[i].opt=="C")
{
qs[i].a=read(),qs[i].p=read();
tmp[++cnt]=qs[i].p;
}
else
{
qs[i].a=read(),qs[i].b=read(),qs[i].k=read();
}
}
sort(tmp+1,tmp+cnt+1);
cnt=unique(tmp+1,tmp+cnt+1)-tmp-1;
for(int i=1;i<=n;++i)
{
a[i]=lower_bound(tmp+1,tmp+cnt+1,a[i])-tmp;
}
for(int i=1;i<=m;++i)
{
if(qs[i].opt=="C")
{
qs[i].p=lower_bound(tmp+1,tmp+cnt+1,qs[i].p)-tmp;
}
}
build(rt[0],1,cnt);
for(int i=1;i<=n;++i)
{
update(rt[i-1],rt[i],1,cnt,a[i],1);
}
for(int i=1;i<=m;++i)
{
if(qs[i].opt=="C")
{
update(rt[qs[i].a],rt[qs[i].a],1,cnt,a[qs[i].a],-1);
update(rt[qs[i].a],rt[qs[i].a],1,cnt,qs[i].p,1);
a[qs[i].a]=qs[i].p;
}
else
{
printf("%d\n",query(rt[qs[i].a-1],rt[qs[i].b],1,cnt,qs[i].k));
}
}
return 0;
}