#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 100;
bool flag = 0;
long long n,q,te;
long long block, be[maxn], l[maxn], ad1[maxn],a[maxn],b[maxn];
void blad(int l1, int r1, int val) {
for (int i = l1; i <= r1; i++) {
a[i] += val;
}
for (int i = l[be[l1]]; i <= l[be[l1] + 1] - 1; i++) {
b[i] = a[i];
}
if (be[l1] != block + 1)sort(b + l[be[l1]], b + l[be[l1]] + block);
else sort(b + l[be[l1]], b + l[be[l1]] + te);
}
void ad(int l1, int r1, int val) {
if (be[l1] == be[r1]) {
blad(l1, r1, val);
return;
}
blad(l1, l[be[l1] + 1] - 1, val);
blad(l[be[r1]], r1, val);
for (int j = be[l1] + 1; j < be[r1]; j++) {
ad1[j] += val;
}
return;
}
int qz(int l, int r, int val) {
int ans = 0;
if (ad1[be[l]] >= val)return (r - l + 1);
ans = lower_bound(b + l, b + r + 1, val-ad1[be[l]]) - b;
//cout << l << r << ans<<endl;
if (b[ans] >= val - ad1[be[l]]) {
//cout << ans<<" "<<213123<<endl;
return r - ans + 1;
}
else {
//cout << 222;
return 0;
}
}
int blqz(int l1, int r1, int val) {
int ans = 0;
for (int i = l1; i <= r1; i++) {
if (a[i] +ad1[be[i]] >= val)ans++;
}
return ans;
}
int query(int l1, int r1, int val) {
int ans = 0;
if (be[l1] == be[r1]) {
for (int i = l1; i <= r1; i++) {
if (a[i] + ad1[be[i]] >= val)ans++;
}
return ans;
//cout << l1 << "到" << r1 << "有" << ans << endl;
}
ans += blqz(l1, l[be[l1] + 1] - 1, val);
//cout << l1 << "到" << l[be[l1] + 1] - 1 << "有" << ans << endl;
ans += blqz(l[be[r1]], r1, val);
//cout << l[be[r1]] << "到" << r1 << "有" << ans << endl;
for (int i = be[l1] + 1; i < be[r1]; i++) {
//cout << l[i] << " " << l[i] + block - 1 << endl;
//if (qz(l[i], l[i] + block - 1, val) < 0)cout << "出错了" << endl;
if (i != block + 1)ans += qz(l[i], l[i] + block - 1,val);
else ans += qz(l[i], l[i] + te - 1, val);
}
//cout << l[be[l1] + 1] << "到" << l[be[r1]]-1 << "有" << ans << endl;
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> q;
block = sqrt(n);
if (block * block != n)flag = 1;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
be[i] = (i - 1) / block + 1;
if (be[i] != be[i - 1])l[be[i]] = i;
//cout << l[2] << endl;
}
for (int i = 1; i <= block; i++) {
sort(b + l[i], b + l[i] + block);
//cout << l[be[i]] << endl;
}
te = n - block * block;
if (te>0)sort(b + l[block+1], b + l[block + 1] + te);
l[be[n] + 1] = n + 1;
//int x1 = lower_bound(b + 1, b + 1 + n, 5)-b;
//cout << x1 << endl;
//for (int i = 1; i <= n; i++)cout << b[i] << " ";
char c; int x, y, z;
for (int i = 1; i <= q; i++) {
cin >> c >> x >> y >> z;
if (c == 'A') {
cout << query(x, y, z)<<endl;
}
else {
ad(x, y, z);
}
}
return 0;
}有什么错误吗