1 #include<bits/stdc++.h>
2 using namespace std;
3 #define MAXN 1000010
4 int N,a[MAXN],h[MAXN],pos[MAXN],add[1010],block;
5 int read()
6 {
7 int s=0,fh=1;char ch=getchar();
8 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();}
9 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();}
10 return s*fh;
11 }
12 void cl(int k)
13 {
14 int l=(k-1)*block+1,r=min(k*block,N),i;
15 for(i=l;i<=r;i++)a[i]=h[i];
16 sort(a+l,a+r+1);
17 }
18 void Add(int l,int r,int c)
19 {
20 int i;
21 if(pos[l]==pos[r])
22 {
23 for(i=l;i<=r;i++)h[i]+=c;
24 cl(pos[l]);
25 }
26 else
27 {
28 for(i=l;i<=pos[l]*block;i++)h[i]+=c;
29 for(i=(pos[r]-1)*block+1;i<=r;i++)h[i]+=c;
30 for(i=pos[l]+1;i<=pos[r]-1;i++)add[i]+=c;
31 cl(pos[l]);cl(pos[r]);
32 }
33 }
34 int Find(int k,int c)
35 {
36 int l=(k-1)*block+1,r=min(k*block,N),t=0,mid;
37 while(l<=r)
38 {
39 mid=(l+r)/2;
40 if(a[mid]<c)l=mid+1;
41 else t=mid,r=mid-1;
42 }
43 if(t==0)return 0;
44 return min(k*block,N)-t+1;
45 }
46 int Query(int l,int r,int c)
47 {
48 int ans=0,i;
49 if(pos[l]==pos[r])
50 {
51 for(i=l;i<=r;i++)if(h[i]+add[pos[i]]>=c)ans++;
52 }
53 else
54 {
55 for(i=l;i<=pos[l]*block;i++)if(h[i]+add[pos[i]]>=c)ans++;
56 for(i=(pos[r]-1)*block+1;i<=r;i++)if(h[i]+add[pos[i]]>=c)ans++;
57 for(i=pos[l]+1;i<=pos[r]-1;i++)ans+=Find(i,c-add[i]);
58 }
59 return ans;
60 }
61 int main()
62 {
63 int Q,i,m,L,R,W;
64 char fh[2];
65 N=read();Q=read();
66 block=(int)sqrt(N);
67 for(i=1;i<=N;i++)
68 {
69 h[i]=read();
70 pos[i]=(i-1)/block+1;
71 }
72 if(N==block*block)m=block;
73 else m=block+1;
74 for(i=1;i<=m;i++)cl(i);
75 for(i=1;i<=Q;i++)
76 {
77 scanf("\n%s",fh);L=read();R=read();W=read();
78 if(fh[0]==‘M‘)Add(L,R,W);
79 else printf("%d\n",Query(L,R,W));
80 }
81 return 0;
82 }