#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200001;
int n,q;
int a[N];
struct node{
    int mx;
    ll sm,smx,tt;
    int tg1,tg2;
}t[N*4];
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
void build(int p,int l,int r){
    for(int i=l;i<=r;i++){
        t[p].mx=max(t[p].mx,a[i]);
        t[p].sm+=a[i];
        t[p].smx+=t[p].mx;
        t[p].tt+=1ll*t[p].mx*a[i];
    }
    if(l==r)return;
    build(ls,l,mid);
    build(rs,mid+1,r);
}
void pushdown(int p,int l,int r){
    int tg;
    if(t[p].tg1){
        tg=t[p].tg1;
        t[p].tg1=0;
        t[ls].mx=t[rs].mx=tg;
        t[ls].sm=1ll*(mid-l+1)*tg,t[rs].sm=1ll*(r-mid)*tg;
        t[ls].smx=t[ls].sm,t[rs].smx=t[rs].sm;
        t[ls].tt=t[ls].sm*tg,t[rs].tt=t[rs].sm*tg;
        t[ls].tg1=t[rs].tg1=tg;
        t[ls].tg2=t[rs].tg2=0;
    }
    if(t[p].tg2){
        tg=t[p].tg2;
        t[p].tg2=0;
        t[ls].mx+=tg,t[rs].mx+=tg;
        t[ls].tt+=tg*(1ll*tg*(mid-l+1)+t[ls].sm+t[ls].smx),t[rs].tt+=tg*(1ll*tg*(r-mid)+t[rs].sm+t[rs].smx);
        t[ls].sm+=1ll*(mid-l+1)*tg,t[rs].sm+=1ll*(r-mid)*tg;
        t[ls].smx+=1ll*(mid-l+1)*tg,t[rs].smx+=1ll*(r-mid)*tg;
        t[ls].tg2+=tg,t[rs].tg2+=tg;
    }
}
int qmx;
ll qsmx,qtt;
void query(int p,int l,int r){
    if(l==r){
        if(qmx>t[p].mx)qsmx+=qmx,qtt+=qmx*t[p].sm;
        else qsmx+=t[p].mx,qtt+=t[p].tt,qmx=t[p].mx;
        return;
    }
    pushdown(p,l,r);
    if(qmx>t[ls].mx){
        qsmx+=1ll*qmx*(mid-l+1);
        qtt+=qmx*t[ls].sm;
        query(rs,mid+1,r);
    }
    else{
        qsmx+=t[p].smx-t[ls].smx;
        qtt+=t[p].tt-t[ls].tt;
        query(ls,l,mid);
        qmx=t[p].mx;
    }
}
void update(int p,int l,int r){
    t[p].mx=max(t[ls].mx,t[rs].mx);
    t[p].sm=t[ls].sm+t[rs].sm;
    qmx=t[ls].mx;
    qsmx=t[ls].smx;
    qtt=t[ls].tt;
    query(rs,mid+1,r);
    t[p].smx=qsmx;
    t[p].tt=qtt;
}
void modify1(int p,int l,int r,int x,int y,int d){
    if(x<=l&&r<=y){
        t[p].mx=d;
        t[p].sm=1ll*(r-l+1)*d;
        t[p].smx=t[p].sm;
        t[p].tt=t[p].sm*d;
        t[p].tg1=d;
        t[p].tg2=0;
        return;
    }
    pushdown(p,l,r);
    if(x<=mid)modify1(ls,l,mid,x,y,d);
    if(mid<y)modify1(rs,mid+1,r,x,y,d);
    update(p,l,r);
}
void modify2(int p,int l,int r,int x,int y,int d){
    if(x<=l&&r<=y){
        t[p].mx+=d;
        t[p].tt+=d*(1ll*d*(r-l+1)+t[p].sm+t[p].smx);
        t[p].sm+=1ll*(r-l+1)*d;
        t[p].smx+=1ll*(r-l+1)*d;
        t[p].tg2+=d;
        return;
    }
    pushdown(p,l,r);
    if(x<=mid)modify2(ls,l,mid,x,y,d);
    if(mid<y)modify2(rs,mid+1,r,x,y,d);
    update(p,l,r);
}
struct seg{
    int p,l,r;
}b[100];
int m;
void getseg(int p,int l,int r,int x,int y){
    if(x<=l&&r<=y){
        b[++m]=(seg){p,l,r};
        return;
    }
    pushdown(p,l,r);
    if(x<=mid)getseg(ls,l,mid,x,y);
    if(mid<y)getseg(rs,mid+1,r,x,y);
}
int gettt(int p,int l,int r,ll tm){
    if(l==r){
        query(p,l,r);
        if(qtt>tm)return l-1;
        return l;
    }
    pushdown(p,l,r);
    int mx=qmx;
    ll tt=qtt;
    query(ls,l,mid);
    if(qtt>tm){
        qmx=mx,qtt=tt;
        return gettt(ls,l,mid,tm);
    }
    return gettt(rs,mid+1,r,tm);
}
int getsm(int p,int l,int r,ll tm){
    if(l==r){
        if(t[p].sm>tm)return l-1;
        return l;
    }
    pushdown(p,l,r);
    if(t[ls].sm>tm)return getsm(ls,l,mid,tm);
    return getsm(rs,mid+1,r,tm-t[ls].sm);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>q;
    for(int i=0;i<n;i++)cin>>a[i];
    build(1,0,n-1);
    while(q--){
        char op[2];
        cin>>op;
        if(op[0]=='R'){
            int l,r,d;
            cin>>l>>r>>d;
            if(l<=r)modify1(1,0,n-1,l,r,d);
            else modify1(1,0,n-1,l,n-1,d),modify1(1,0,n-1,0,r,d);
        }
        if(op[0]=='P'){
            int l,r,d;
            cin>>l>>r>>d;
            if(l<=r)modify2(1,0,n-1,l,r,d);
            else modify2(1,0,n-1,l,n-1,d),modify2(1,0,n-1,0,r,d);
        }
        if(op[0]=='Q'){
            int s;
            ll tm;
            cin>>s>>tm;
            m=0;
            getseg(1,0,n-1,s,n-1);
            if(s)getseg(1,0,n-1,0,s-1);
            bool flag=0;
            int mx=0;
            ll tt=0;
            for(int i=1;i<=m;i++){
                qmx=mx,qtt=tt;
                query(b[i].p,b[i].l,b[i].r);
                if(qtt>tm){
                    qmx=mx,qtt=tt;
                    cout<<(gettt(b[i].p,b[i].l,b[i].r,tm)+1)%n<<'\n';
                    flag=1;
                    break;
                }
                mx=qmx,tt=qtt;
            }
            if(flag)continue;
            tm-=qtt;
            tm/=t[1].mx;
            tm%=t[1].sm;
            for(int i=1;i<=m;i++){
                if(t[b[i].p].sm>tm){
                    cout<<(getsm(b[i].p,b[i].l,b[i].r,tm)+1)%n<<'\n';
                    break;
                }
                tm-=t[b[i].p].sm;
            }
        }
    }
    return 0;
}
