#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n,m,block,num,st[1000010],ed[1000010],pos[1000010];
ull tag[1000010],a[1000010],b[1000010];
void build() {
block = sqrt(n);
num = n / block;
if (n % block) ++ num;
for (int i = 1;i <= num;i ++) {
st[i] = (i - 1) * block + 1;
ed[i] = i * block;
}
ed[num] = n;
for (int i = 1;i <= n;i ++)
pos[i] = (i - 1) / block + 1;
for (int i = 1;i <= num;i ++)
sort(b + st[i],b + ed[i] + 1);
return;
}
void update(int l,int r,ull d) {
if (pos[l] == pos[r]) {
for (int i = st[pos[l]];i <= ed[pos[l]];i ++) {
if (i >= l && i <= r) a[i] += d;
b[i] = a[i];
}
sort(b + st[pos[l]],b + ed[pos[l]] + 1);
} else {
for (int i = pos[l] + 1;i <= pos[r] - 1;i ++)
tag[i] += d;
for (int i = l;i <= ed[pos[l]];i ++) {
a[i] += d;
b[i] = a[i];
}
sort(b + l,b + ed[pos[l]] + 1);
for (int i = st[pos[r]];i <= r;i ++) {
a[i] += d;
b[i] = a[i];
}
sort(b + st[pos[r]],b + r + 1);
}
return;
}
int query(int l,int r,ull k) {
int res = 0;
if (pos[l] == pos[r]) {
res = (b + r + 1 - lower_bound(b + l,b + r + 1,k - tag[pos[l]]));
} else {
for (int i = pos[l] + 1;i <= pos[r] - 1;i ++)
res += (b + ed[i] + 1 - lower_bound(b + st[i],b + ed[i] + 1,k - tag[i]));
res += (b + ed[pos[l]] + 1 - lower_bound(b + l,b + ed[pos[l]] + 1,k - tag[pos[l]]));
res += (b + r + 1 - lower_bound(b + st[pos[r]],b + r + 1,k - tag[pos[r]]));
}
return res;
}
int main() {
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i ++) {
scanf("%lld",&a[i]);
b[i] = a[i];
}
build();
for (int i = 1;i <= m;i ++) {
char ch;
int l,r;
ull k;
cin >> ch >> l >> r >> k;
if (ch == 'M') {
update(l,r,k);
} else {
printf("%d\n",query(l,r,k));
}
}
return 0;
}