#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <unordered_map>
#include <cstdlib>
#define int long long
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define f first
#define s second
#define endl '\n'
#define all(x) begin(x),end(x)
int const N = 2e5+10;
struct Node{
int sum;
int lazy;
Node() : sum(0),lazy(0) {}
};
Node segment[4*N];
int si;
int arr[N];
void push(int node,int l,int r){
if(l != r){
segment[node*2].lazy += segment[node].lazy;
segment[node*2+1].lazy += segment[node].lazy;
int md = l+(r-l)/2;
segment[node*2].sum += segment[node].lazy*(md-l+1);
segment[node*2+1].sum += segment[node].lazy*(r-md);
segment[node].lazy = 0;
}
}
void builder(int node,int l,int r){
if(l == r) segment[node].sum = arr[l];
else{
int md = l+(r-l)/2;
builder(node*2,l,md);
builder(node*2+1,md+1,r);
segment[node].sum = segment[node*2].sum + segment[node*2+1].sum;
}
}
void update(int node,int l,int r,int ql,int qr,int val){
push(node,l,r);
if(l >= ql && r <= qr){
//cout << node << " " << l << " " << r << " " << ql << " " << qr << " " << val << endl;
segment[node].lazy += val;
segment[node].sum += val*(r-l+1);
push(node,l,r);
}
else if(l > qr || r < ql) return;
else{
int md = l+(r-l)/2;
update(node*2,l,md,ql,qr,val);
update(node*2+1,md+1,r,ql,qr,val);
segment[node].sum = segment[node*2].sum+segment[node*2+1].sum;
}
}
void update(int l,int r,int val){
if(r < l) return;
update(1,1,si,l,r,val);
}
int query(int node,int l,int r,int ql,int qr){
push(node,l,r);
if(l >= ql && r <= qr) return segment[node].sum;
else if(l > qr || r < ql) return 0;
else{
int md = l+(r-l)/2;
int q1 = query(node*2,l,md,ql,qr);
int q2 = query(node*2+1,md+1,r,ql,qr);
return q1+q2;
}
}
int query(int l,int r){
return query(1,1,si,l,r);
}
int segmentlower(int x){
int l = 1;
int r = si+1;
while(l < r){
int md = l+(r-l-1)/2;
if(query(md,md) < x) l = md+1;
else r = md;
}
return l;
}
int segmentupper(int x){
int l = 1;
int r = si+1;
while(l < r){
int md = l+(r-l-1)/2;
if(query(md,md) <= x) l = md+1;
else r = md;
}
return l;
}
signed main(){
int n;cin >> n;
si = n;
int q;cin >> q;
for(int i{1};i <= n;i++){
cin >> arr[i];
}
sort(arr+1,arr+1+n);
builder(1,1,n);
for(int i{};i < q;i++){
char c;cin >> c;
// for(int i{1};i <= n;i++){
// cout << query(i,i) << " ";
// }
// cout << endl;
if(c == 'F'){
int a,b;cin >> b >> a;
int p1 = segmentlower(a);
if(p1 == n+1) continue;
int endpos = min(n,p1+b-1);
int endval = query(endpos,endpos);
int valbegin = segmentlower(endval);
int valend = segmentupper(endval)-1;
int remain = endpos-valbegin;
update(p1,valbegin-1,1);
update(max(valbegin,valend-remain),valend,1);
}
else{
int a,b;cin >> a >> b;
int p1 = segmentlower(a);
int p2 = segmentupper(b);
cout << p2-p1 << endl;
}
}
}