#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
const int M=sqrt(N)+5;
int n,m;
char op;
int x,y,k,ans;
int sum[M],a[N],in[N];
int b[M][M];
int st[N],fn[N];
int bloxd,len;
bool cmp(int a,int b){return a<b;}
void update(int s,int t,int k)
{
int S=in[s],T=in[t];
for(int i=S+1;i<=T-1;i++) sum[i]+=k;
//整块
for(int i=s;i<=fn[S];i++)
a[i]+=k;
for(int i=st[S];i<=fn[S];i++)
b[S][i-st[S]+1]=a[i];
sort(b[S]+1,b[S]+(fn[S]-st[S]+1)+1,cmp);
//左碎
for(int i=st[T];i<=t;i++)
a[i]+=k;
for(int i=st[T];i<=fn[T];i++)
b[T][i-st[T]+1]=a[i];
sort(b[T]+1,b[T]+(fn[T]-st[T]+1)+1,cmp);
//右碎
}
int query(int s,int t,int c)
{
ans=0;
int S=in[s],T=in[t];
for(int i=in[s]+1;i<=in[t]-1;i++)
{
int k=lower_bound(b[i]+1,b[i]+(fn[i]-st[i]+1)+1,c-sum[i])-b[i];
if(upper_bound(b[i]+1,b[i]+(fn[i]-st[i]+1)+1,c-sum[i])-b[i]!=k) k++;
ans+=bloxd-k+1;
}
//整块
int k=lower_bound(b[S]+(s-st[S]+1),b[S]+(fn[S]-st[S]+1)+1,c-sum[S])-b[S];
if(upper_bound(b[S]+(s-st[S]+1),b[S]+(fn[S]-st[S]+1)+1,c-sum[S])-b[S]!=k) k++;
ans+=bloxd-k+1;
k=lower_bound(b[T]+1,b[T]+(t-st[T]+1)+1,c-sum[T])-b[T];
if(upper_bound(b[T]+1,b[T]+(t-st[T]+1)+1,c-sum[T])-b[T]!=k) k++;
ans+=bloxd-k+1;
return ans;
}
signed main()
{
cin>>n;
cin>>m;
bloxd=sqrt(n);//块长
len=n/bloxd;//块数5 3
if(n%bloxd) len++;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=len;i++)
{
st[i]=(i-1)*bloxd+1;
if(i==len) fn[len]=n;
else fn[i]=i*bloxd;
for(int j=st[i];j<=fn[i];j++) b[i][j-st[i]+1]=a[j],in[j]=i;
sort(b[i]+1,b[i]+(fn[i]-st[i]+1)+1,cmp);
}//分块+排序
while(m--)
{
cin>>op>>x>>y>>k;
if(op=='M') update(x,y,k);
else cout<<query(x,y,k)<<'\n';
}
return 0;
}