#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,t,x,y,z,w_num,w_block,a[1000005],w_sorted[1000005],w_left[1005],w_right[1005],w_belong[1000005],w_lazy_tag[1005];
char c[5];
void w_build()
{
w_block=(int)(sqrt((double)n));
w_num=(int)(sqrt((double)n))+(n%w_block!=0);
for(int i=1;i<=w_num;i++)
{
w_left[i]=w_block*(i-1)+1;
w_right[i]=min(w_block*i,n);
sort(w_sorted+w_left[i],w_sorted+w_right[i]+1);
}
for(int i=1;i<=n;i++)
w_belong[i]=(i+w_block-1)/w_block;
}
void w_change_block(int w_id,int w_start,int w_end,int k)
{
for(int i=w_start;i<=w_end;i++)
{
a[i]+=k;
w_sorted[i]=a[i];
}
sort(w_sorted+w_left[w_id],w_sorted+w_right[w_id]+1);
}
void w_change(int x,int y,int k)
{
if(w_belong[x]==w_belong[y])
{
w_change_block(w_belong[x],x,y,k);
return;
}
w_change_block(w_belong[x],x,w_right[w_belong[x]],k);
w_change_block(w_belong[y],w_left[w_belong[y]],y,k);
for(int i=w_belong[x]+1;i<w_belong[y];i++)
w_lazy_tag[i]+=k;
}
int w_query_block(int w_id,int w_start,int w_end,int k)
{
int w_temp=0;
for(int i=w_start;i<=w_end;i++)
{
if(a[i]+w_lazy_tag[w_id]>=k)
w_temp++;
}
return w_temp;
}
int w_query(int x,int y,int k)
{
if(w_belong[x]==w_belong[y])
return w_query_block(w_belong[x],x,y,k);
int w_temp=0;
w_temp+=w_query_block(w_belong[x],x,w_right[w_belong[x]],k);
w_temp+=w_query_block(w_belong[y],w_left[w_belong[y]],y,k);
for(int i=w_belong[x]+1;i<w_belong[y];i++)
w_temp+=w_right[i]-(lower_bound(w_sorted+w_left[i],w_sorted+w_right[i]+1,k-w_lazy_tag[i])-w_sorted)+1;
return w_temp;
}
int main()
{
scanf("%d %d",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
w_sorted[i]=a[i];
}
w_build();
while(t--)
{
scanf("%s %d %d %d",c+1,&x,&y,&z);
if(c[1]=='M')
w_change(x,y,z);
else
printf("%d\n",w_query(x,y,z));
}
return 0;
}