#include #define ll long long using namespace std; const int maxn=2e5+5; struct node { ll mx,sum,t,sv,add,tag,len; }; node tr[maxn<<2]; int n,q; ll d[maxn<<2]; inline void mdf(int id,int k,ll w) { if(k==0) { tr[id].mx+=w; tr[id].t+=w*w*tr[id].len+tr[id].sv*w+tr[id].sum*w; tr[id].sum+=w*tr[id].len; tr[id].sv+=w*tr[id].len; tr[id].add+=w; } if(k==1) { tr[id].mx=w,tr[id].t=w*w*tr[id].len,tr[id].sum=w*tr[id].len,tr[id].sv=w*tr[id].len; tr[id].add=0,tr[id].tag=w; } } inline void pushdown(int id) { if(tr[id].tag) { mdf(id<<1,1,tr[id].tag); mdf(id<<1|1,1,tr[id].tag); } if(tr[id].add) { mdf(id<<1,0,tr[id].add); mdf(id<<1|1,0,tr[id].add); } tr[id].tag=tr[id].add=0; } node calc(node nd,int id) { node ret=nd; if(tr[id].len==1) { ret.mx=max(ret.mx,tr[id].mx); ret.sum+=tr[id].sum; ret.t+=tr[id].sum*ret.mx; ret.sv+=ret.mx; ret.len+=tr[id].len; } else { pushdown(id); if(tr[id<<1].mx>=nd.mx) { ret=calc(nd,id<<1); ret.mx=max(ret.mx,tr[id<<1|1].mx); ret.sum+=tr[id<<1|1].sum; ret.t+=tr[id].t-tr[id<<1].t; ret.sv+=tr[id].sv-tr[id<<1].sv; ret.len+=tr[id<<1|1].len; } else { nd.sum+=tr[id<<1].sum; nd.t+=tr[id<<1].sum*nd.mx; nd.sv+=tr[id<<1].len*nd.mx; nd.len+=tr[id<<1].len; ret=calc(nd,id<<1|1); } } return ret; } inline void pushup(int id) { tr[id]=calc(tr[id<<1],id<<1|1); tr[id].tag=tr[id].add=0; } void build(int id,int l,int r) { if(l==r) { tr[id]=(node){d[l],d[l],d[l]*d[l],d[l],0,0,1}; return; } int mid=(l+r)>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r); pushup(id); } void update(int id,int l,int r,int x,int y,int k,ll w) { if(l>=x && r<=y) { mdf(id,k,w); return; } int mid=(l+r)>>1; pushdown(id); if(x<=mid) update(id<<1,l,mid,x,y,k,w); if(y>mid) update(id<<1|1,mid+1,r,x,y,k,w); pushup(id); } int num[maxn],cnt,L[maxn],R[maxn]; void get_num(int id,int l,int r,int x,int y) { if(l>=x && r<=y) { cnt++; num[cnt]=id,L[cnt]=l,R[cnt]=r; return; } int mid=(l+r)>>1; pushdown(id); if(x<=mid) get_num(id<<1,l,mid,x,y); if(y>mid) get_num(id<<1|1,mid+1,r,x,y); } int get_pos(int id,int l,int r,node nd,ll t) { if(l==r) return l; int mid=(l+r)>>1; pushdown(id); node dt=calc(nd,id<<1); if(dt.t<=t) return get_pos(id<<1|1,mid+1,r,dt,t); else return get_pos(id<<1,l,mid,nd,t); } int main() { //system("fc training.out training6.ans /W"); //return 0; ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); //freopen("training6.in","r",stdin); //freopen("training.out","w",stdout); int fl; node nd,dt; char opt; ll s,t,w; cin>>n>>q; for(int i=0;i>d[i]; build(1,0,n-1); while(q--) { cin>>opt>>s>>t; if(opt=='P') { cin>>w; if(s<=t) update(1,0,n-1,s,t,0,w); else update(1,0,n-1,0,t,0,w),update(1,0,n-1,s,n-1,0,w); } if(opt=='R') { cin>>w; if(s<=t) update(1,0,n-1,s,t,1,w); else update(1,0,n-1,0,t,1,w),update(1,0,n-1,s,n-1,1,w); } if(opt=='Q') { fl=0,cnt=0,nd=(node){0,0,0,0,0,0,0}; get_num(1,0,n-1,s,n-1); get_num(1,0,n-1,0,n-1); for(int i=1;i<=cnt;i++) { dt=calc(nd,num[i]); if(dt.t>t) { fl=1; cout<