#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m;
struct sgt {
int n;
vector<int> seg, lazy;
void init(int sz) {
n = sz;
seg.assign(4*n+10, 0);
lazy.assign(4*n+10, 0);
}
void push(int l, int r, int node) {
if(lazy[node] == 0) return;
seg[node] += (r-l+1)*lazy[node];
if(l != r) {
lazy[node*2+1] += lazy[node];
lazy[node*2+2] += lazy[node];
}
lazy[node] = 0;
}
void update(int l, int r, int idl, int idr, int val, int node) {
push(l, r, node);
if(l > idr || r < idl) return;
if(idl <= l && r <= idr) {
lazy[node] += val;
push(l, r, node);
return;
}
int mid = (l+r)/2;
update(l, mid, idl, idr, val, node*2+1);
update(mid+1, r, idl ,idr, val, node*2+2);
seg[node] = seg[node*2+1] + seg[node*2+2];
}
int query(int l, int r, int ql, int qr, int node) {
push(l, r, node);
if(l > qr || r < ql) return 0;
if(l >= ql && r <= qr) return seg[node];
int mid = (l+r)/2;
return query(l, mid, ql, qr, node*2+1) + query(mid+1, r, ql, qr, node*2+2);
}
void upd(int idl, int idr, int val) {
update(0, n, idl, idr, val, 0);
}
int qry(int ql, int qr) {
return query(0, n, ql, qr, 0);
}
};
sgt seg;
int ubound(int val) {
int l=1, r=n;
if(val < seg.qry(1, 1)) return 0;
if(val > seg.qry(n, n)) return -1;
while(l < r) {
int mid = (l+r)/2;
if(seg.qry(mid, mid) <= val) l = mid+1;
else r = mid;
}
if(seg.qry(l, l) <= val) return l;
return l-1;
}
int lbound(int val) {
int l=1, r=n;
if(val < seg.qry(1, 1)) return 0;
if(val > seg.qry(n, n)) return -1;
while(l < r) {
int mid = (l+r)/2;
if(seg.qry(mid, mid) < val) l = mid+1;
else r = mid;
}
return l;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
seg.init(n);
vector<int> v;
for(int i=1; i<=n; i++) {
int in;
cin >> in;
v.push_back(in);
}
sort(v.begin(), v.end());
for(int i=1; i<=n; i++) {
seg.upd(i, i, v[i-1]);
}
while(m--) {
char t;
int c, h;
cin >> t >> c >> h;
if(t == 'F') {
int l = lbound(h), r, idx, val;
if(l == -1) continue;
if(l == 0) l++;
r = l+c-1;
if(r >= n) {
seg.upd(l, n, 1);
continue;
}
val = seg.qry(r, r);
if(val != seg.qry(l, l)) {
int tidx = ubound(val-1);
seg.upd(l, tidx, 1);
c -= tidx-l+1;
}
if(c == 0) continue;
idx = ubound(val);
seg.upd(idx-c+1, idx, 1);
} else {
int l = lbound(c), r = ubound(h);
if(l == -1 || r == 0) {
cout << "0\n";
continue;
}
if(r == -1) r = n;
if(l == 0) l = 1;
cout << r-l+1 << "\n";
}
}
}