#include<bits/stdc++.h>
#define int long long
#define inf LONG_LONG_MAX
#define endl '\n'
#define ls(t) (t<<1)
#define rs(t) (t<<1|1)
using namespace std;
int n,q,x,l,r,w,c,lasl,lasr,lasc,sum,laz[4100010];
char op,lastop;
struct N{
int mx,mi;
}tr[4100100];
inline int read(){
int x=1,sum=0;
char ch;
ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
x=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
sum=(sum<<3)+(sum<<1)+ch-'0';
ch=getchar();
}
return x*sum;
}
inline void pushup(int p){
tr[p].mx=max(tr[ls(p)].mx,tr[rs(p)].mx);
tr[p].mi=min(tr[ls(p)].mi,tr[rs(p)].mi);
}
inline void pushdown(int p){
if(laz[p]!=0){
laz[ls(p)]+=laz[p];
laz[rs(p)]+=laz[p];
tr[ls(p)].mx+=laz[p];
tr[rs(p)].mx+=laz[p];
tr[ls(p)].mi+=laz[p];
tr[rs(p)].mi+=laz[p];
laz[p]=0;
}
}
inline void update(int pl,int pr,int l,int r,int w,int p){
if(l<=pl&&pr<=r){
tr[p].mx+=w;
tr[p].mi+=w;
laz[p]+=w;
return;
}
pushdown(p);
int mid=pl+pr>>1;
if(l<=mid)update(pl,mid,l,r,w,ls(p));
if(r>mid)update(mid+1,pr,l,r,w,rs(p));
pushup(p);
}
inline int query(int pl,int pr,int l,int r,int c,int p){
if(l<=pl&&pr<=r){
if(c<=tr[p].mi){
return (pr-pl+1);
}
if(c>tr[p].mx){
return 0;
}
}
pushdown(p);
int mid=pl+pr>>1,ans=0;
if(l<=mid)ans+=query(pl,mid,l,r,c,ls(p));
if(r>mid)ans+=query(mid+1,pr,l,r,c,rs(p));
pushup(p);
return ans;
}
inline void build(int l,int r,int p){
if(l==r){
x=read();
tr[p].mx=x;
tr[p].mi=x;
return ;
}
int mid=l+r>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
}
signed main(){
n=read();
q=read();
build(1,n,1);
for(int i=1;i<=q;i++){
cin>>op;
l=read();
r=read();
w=read();
if(lastop==op&&op=='A'&&lasl==l&&lasr==r&&lasc==w){
cout<<sum<<endl;
continue;
}
if(op=='M'){
update(1,n,l,r,w,1);
}else{
sum=query(1,n,l,r,w,1);
cout<<sum<<endl;
}
lastop=op;
lasl=l;
lasr=r;
lasc=w;
}
return 0;
}
同学用线段树乱搞过了,求hack