#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
#define pb emplace_back
#define ll long long
#define inf int(1e9)
char Ch;
int ff;
inline void rd(int &x) {
x=0,ff=1,Ch=getchar();
while((Ch<'0'||Ch>'9')&&Ch!='-') Ch=getchar();
if(Ch=='-')Ch=getchar(),ff=-1;
while(Ch>='0'&&Ch<='9') {
x=(x<<1)+(x<<3)+Ch-'0';
Ch=getchar();
}
x*=ff;
}
using namespace std;
namespace fast_IO {
#define FASTIO
#define IOSIZE 100000
char ibuf[IOSIZE], obuf[IOSIZE];
char *p1 = ibuf, *p2 = ibuf, *p3 = obuf;
#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,IOSIZE,stdin),p1==p2)?(EOF):(*p1++))
#define putchar(x) ((p3==obuf+IOSIZE)&&(fwrite(obuf,p3-obuf,1,stdout),p3=obuf),*p3++=x)
#endif
#define isdigit(ch) (ch>47&&ch<58)
#define isspace(ch) (ch<33)
template<typename T> inline T read() {
T s = 0;
int w = 1;
char ch;
while (ch = getchar(), !isdigit(ch) and (ch != EOF)) if (ch == '-') w = -1;
if (ch == EOF) return false;
while (isdigit(ch)) s = s * 10 + ch - 48, ch = getchar();
return s * w;
}
template<typename T> inline bool read(T &s) {
s = 0;
int w = 1;
char ch;
while (ch = getchar(), !isdigit(ch) and (ch != EOF)) if (ch == '-') w = -1;
if (ch == EOF) return false;
while (isdigit(ch)) s = s * 10 + ch - 48, ch = getchar();
return s *= w, true;
}
inline bool read(char &s) {
while (s = getchar(), isspace(s));
return true;
}
inline bool read(char *s) {
char ch;
while (ch = getchar(), isspace(ch));
if (ch == EOF) return false;
while (!isspace(ch)) *s++ = ch, ch = getchar();
*s = '\000';
return true;
}
template<typename T> inline void print(T x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) print(x / 10);
putchar(x % 10 + 48);
}
inline void print(char x) {
putchar(x);
}
inline void print(char *x) {
while (*x) putchar(*x++);
}
inline void print(const char *x) {
for (register int i = 0; x[i]; i++) putchar(x[i]);
}
#ifdef _GLIBCXX_STRING
inline bool read(std::string& s) {
s = "";
char ch;
while (ch = getchar(), isspace(ch));
if (ch == EOF) return false;
while (!isspace(ch)) s += ch, ch = getchar();
return true;
}
inline void print(std::string x) {
for (register int i = 0, n = x.size(); i < n; i++)
putchar(x[i]);
}
#endif
template<typename T, typename... T1> inline int read(T& a, T1&... other) {
return read(a) + read(other...);
}
template<typename T, typename... T1> inline void print(T a, T1... other) {
print(a);
print(other...);
}
struct Fast_IO {
~Fast_IO() {
fwrite(obuf, p3 - obuf, 1, stdout);
}
} io;
template<typename T> Fast_IO& operator >> (Fast_IO &io, T &b) {
return read(b), io;
}
template<typename T> Fast_IO& operator << (Fast_IO &io, T b) {
return print(b), io;
}
#define cout io
#define cin io
#define endl '\n'
}
using namespace fast_IO;
const int N=1e5+5,M=4e5+5;
int n,Q;
int a[N],t[M];
int add[M],mx[M],mn[M];
#define ls x<<1
#define rs x<<1|1
inline void push_up(register int x) {
mn[x]=min(mn[ls],mn[rs]);
mx[x]=max(mx[ls],mx[rs]);
}
inline void push_down(register int x) {
if(add[x]) {
add[ls]+=add[x];
add[rs]+=add[x];
mx[ls]+=add[x];
mn[ls]+=add[x];
mx[rs]+=add[x];
mn[rs]+=add[x];
add[x]=0;
}
}
void build(register int x,register int l,register int r) {
if(l==r) return mn[x]=mx[x]=a[l],void();
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(x);
}
int ask_max(register int x,register int l,register int r,register int L,register int R) {
if(L>R) return 0;
if(l>=L && r<=R) return mx[x];
push_down(x);
int mid=l+r>>1,ans=0;
if(L<=mid) ans=ask_max(ls,l,mid,L,R);
if(R>mid) ans=max(ans,ask_max(rs,mid+1,r,L,R));
return ans;
}
int ask_min(register int x,register int l,register int r,register int L,register int R) {
if(L>R) return inf;
if(l>=L && r<=R) return mn[x];
push_down(x);
int mid=l+r>>1,ans=inf;
if(L<=mid) ans=ask_min(ls,l,mid,L,R);
if(R>mid) ans=min(ans,ask_min(rs,mid+1,r,L,R));
return ans;
}
void upd(register int x,register int l,register int r,register int L,register int R) {
if(L>R) return ;
if(l>=L && r<=R)
return mx[x]++,mn[x]++,add[x]++,void();
push_down(x);
int mid=l+r>>1;
if(L<=mid) upd(ls,l,mid,L,R);
if(R>mid) upd(rs,mid+1,r,L,R);
push_up(x);
}
void modify(register int h,int c) {
int l=1,r=n,mid,bg=n,len=0,P,L,R;
if(mx[1]<h) return ;
while(l<=r) {
mid=l+r>>1;
if(ask_max(1,1,n,mid,mid)>=h)
bg=mid,r=mid-1;
else l=mid+1;
}
P=min(n,bg+c-1),l=bg,r=P;
while(l<=r) {
mid=l+r>>1;
if(ask_max(1,1,n,mid,P)==ask_min(1,1,n,mid,P))
L=mid,r=mid-1;
else l=mid+1;
}
upd(1,1,n,bg,L-1);
int res=P-L+1;
l=P,r=n;
while(l<=r) {
int mid=l+r>>1;
if(ask_max(1,1,n,L,mid)==ask_min(1,1,n,L,mid))
R=mid,l=mid+1;
else r=mid-1;
}
upd(1,1,n,R-res+1,R);
}
inline int query(register int x,register int y) {
int l=1,r=n,mid,L=0,R=1e9;
if(x>mx[1] || y<mn[1]) return 0;
while(l<=r) {
int mid=l+r>>1;
if(ask_max(1,1,n,mid,mid)>=x)
L=mid,r=mid-1;
else l=mid+1;
}
l=1,r=n;
while(l<=r) {
int mid=l+r>>1;
if(ask_max(1,1,n,mid,mid)<=y)
R=mid,l=mid+1;
else r=mid-1;
}
return R-L+1;
}
char op;
signed main() {
cin>>n>>Q;
for(register int i=1; i<=n; i++)
cin>>a[i];
sort(a+1,a+1+n);
build(1,1,n);
for(register int x,y,c,h; Q--; ) {
cin>>op;
if(op=='F') {
cin>>c>>h;
modify(h,c);
}
else {
cin>>x>>y;
printf("%d\n",query(x,y));
}
}
return 0;
}