#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 1000010
struct data
{
int num,tag;
}d[N];
int l[N],pos[N],r[N],tag[N];
int n,q;
bool cp(data x,data y)
{
return x.num+x.tag<y.num+y.tag;
}
void add(int a,int b,int delta)
{
while(a<=b)
{
if(a==l[pos[a]]&&b>=r[pos[a]])
{
d[pos[a]].tag+=delta;
}
else
{
for(int i=a;i<=min(r[pos[a]],b);i++)
d[i].num+=delta;
sort(d+l[pos[a]],d+r[pos[a]]+1,cp);
}
a=r[pos[a]]+1;
}
}
int query(int a,int b,int delta)
{
int ret=0;
// printf("%d %d\n",d[1].num,d[2].num);
for(int i=a;i<=b;i=r[pos[i]]+1)
{
int ll=i,rr=min(r[pos[i]],b);
while(rr-ll>1)
{
int mid=(ll+rr)/2;
if(d[mid].num+d[pos[mid]].tag>=delta) rr=mid;
else ll=mid;
}
while (d[ll].num+d[pos[ll]].tag<delta&&ll<=rr) ll++;
// printf("ll=%d r[pos[i]]=%d\n",ll,r[pos[i]]);
ret+=min(r[pos[i]],b)-ll+1;
}
return ret;
}
int main()
{
memset(l,0x3f3f,sizeof(l));
scanf("%d%d",&n,&q);
int size=(int)(sqrt(n));
for(int i=1;i<=n;i++)
{
scanf("%d",&d[i].num);
pos[i]=(i-1)/size+1;
l[pos[i]]=min(l[pos[i]],i);
r[pos[i]]=max(r[pos[i]],i);
}
for(int i=1;i<=pos[n];i++)
{
// printf("l=%d r=%d\n",l[i],r[i]);
sort(d+l[i],d+r[i]+1,cp);
}
// for(int i=1;i<=n;i++)
// {
// printf("%d ",d[i].num);
// }
// printf("\n");
while(q--)
{
char s[10]; scanf("%s",s);
int a,b,c; scanf("%d%d%d",&a,&b,&c);
if(s[0]==‘M‘) add(a,b,c);
else printf("%d\n",query(a,b,c));
}
return 0;
}