#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif
struct LazySegmentTree {
int n;
vector<int> mn, mx, lz;
LazySegmentTree(int _n) {
n = _n;
mn.assign(4 * n, 0);
mx.assign(4 * n, 0);
lz.assign(4 * n, 0);
}
void apply(int id, int v) {
mn[id] += v;
mx[id] += v;
lz[id] += v;
}
void push(int id, int tl, int tr) {
if (lz[id] == 0 || tl == tr) return;
int x = (id << 1) + 1, y = x + 1;
apply(x, lz[id]);
apply(y, lz[id]);
lz[id] = 0;
}
void pull(int id) {
int x = (id << 1) + 1, y = x + 1;
mn[id] = mn[x];
mx[id] = mx[y];
}
void update(int id, int tl, int tr, int l, int r, int v) {
push(id, tl, tr);
if (r < tl || tr < l) return;
if (l <= tl && tr <= r) {
apply(id, v);
return;
}
int tm = (tl + tr) >> 1;
int x = (id << 1) + 1, y = x + 1;
update(x, tl, tm, l, r, v);
update(y, tm + 1, tr, l, r, v);
pull(id);
}
int get(int id, int tl, int tr, int pos) {
push(id, tl, tr);
if (tl == tr) return mn[id];
int tm = (tl + tr) >> 1;
int x = (id << 1) + 1, y = x + 1;
if (pos <= tm) return get(x, tl, tm, pos);
else return get(y, tm + 1, tr, pos);
}
int f(int id, int tl, int tr, int x) {
if (mn[id] > x) return 0;
if (mx[id] <= x) return tr - tl + 1;
push(id, tl, tr);
int tm = (tl + tr) >> 1;
int left = f((id << 1) + 1, tl, tm, x);
int right = f((id << 1) + 2, tm + 1, tr, x);
return left + right;
}
void update(int l, int r, int v) { update(0, 0, n - 1, l, r, v); }
int get(int pos) { return get(0, 0, n - 1, pos); }
int f(int x) { return f(0, 0, n - 1, x); }
};
constexpr int N = 1e5 + 5;
int n, q, a[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
LazySegmentTree st(n);
for (int i = 0; i < n; i++) {
st.update(i, i, a[i]);
}
while (q--) {
char t;
cin >> t;
if (t == 'F') {
int c, h;
cin >> c >> h;
int L = st.f(h - 1);
int R = L + c - 1;
if (R >= n) {
st.update(L, n - 1, 1);
continue;
}
int val = st.get(R);
int pos = st.f(val);
if (pos == R + 1) {
st.update(L, R, 1);
continue;
}
int pos2 = max(st.f(val - 1), L);
st.update(pos - c + (pos2 - L), pos - 1, 1);
st.update(L, pos2 - 1, 1);
} else {
int l, r;
cin >> l >> r;
cout << st.f(r) - st.f(l - 1) << '\n';
}
}
return 0;
}