#include <bits/stdc++.h>

using namespace std;
#define M 200005
typedef long long LL;
int A[M],n,q;
struct YD{
    struct TNode{
        int l,r,mark,mx,ad;
        LL ans,sum,mx_s;
        int len(){
            return r-l+1;
        }
        void Reset(int ty,int v){
            if(ty==1){
                if(mark!=-1)mark+=v;
                else ad+=v;
                mx+=v;
                ans+=1ll*v*v*len()+sum*v;
                ans+=mx_s*v;
                sum+=1ll*len()*v;
                mx_s+=1ll*len()*v;
            }else{
                ad=0;
                mark=mx=v;
                mx_s=sum=1ll*len()*v;
                ans=1ll*v*v*len();
            }
        }
    }tree[M<<2];
    #define fa tree[p]
    #define lson tree[p<<1]
    #define rson tree[p<<1|1]
    void Down(int p){
        if(fa.ad!=0)lson.Reset(1,fa.ad),rson.Reset(1,fa.ad),fa.ad=0;
        if(fa.mark!=-1)lson.Reset(2,fa.mark),rson.Reset(2,fa.mark),fa.mark=-1;
    }
    LL get_mx_s(int p,int mx){
        LL ret=0;
        while(fa.l^fa.r){
            Down(p);
            if(lson.mx<=mx)ret+=1LL*mx*lson.len(),p=p<<1|1;
            else ret+=fa.mx_s-lson.mx_s,p<<=1;
        }
        return ret+max(mx,fa.mx);
    }
    LL get_ans(int p,int mx){
        LL ret=0;
        while(fa.l^fa.r){
            Down(p);
            if(lson.mx<=mx)ret+=lson.sum*mx,p=p<<1|1;
            else ret+=fa.ans-lson.ans,p<<=1;
        }
        return ret+1LL*fa.mx*max(fa.mx,mx);
    }
    void Up(int p){
        fa.mx=max(lson.mx,rson.mx);
        fa.sum=lson.sum+rson.sum;
        fa.ans=lson.ans+get_ans(p<<1|1,lson.mx);
        fa.mx_s=lson.mx_s+get_mx_s(p<<1|1,lson.mx);
    }
    int pos[M];
    void build(int l,int r,int p=1){
        fa.l=l,fa.r=r;
        fa.mark=-1;
        fa.ad=0;
        if(l==r){
            pos[l]=p;
            fa.mx=A[l];
            fa.ans=1ll*A[l]*A[l];
            fa.sum=A[l];
            fa.mx_s=A[l];
            return;
        }
        int mid=l+r>>1;
        build(l,mid,p<<1);
        build(mid+1,r,p<<1|1);
        Up(p);
    }
    void Update(int l,int r,int ty,int v,int p=1){
        if(l==fa.l&&r==fa.r)return void(fa.Reset(ty,v));
        Down(p);
        int mid=fa.l+fa.r>>1;
        if(r<=mid)Update(l,r,ty,v,p<<1);
        else if(l>mid)Update(l,r,ty,v,p<<1|1);
        else Update(l,mid,ty,v,p<<1),Update(mid+1,r,ty,v,p<<1|1);
        Up(p);
    }
    int stk[M],top;
    void Pb(int x){
        for(int i=pos[x]>>1;i;i>>=1)stk[++top]=i;
        while(top)Down(stk[top--]);
    }
    LL sum,tmp;
    int mx;
    int Ask_r(int x,LL t){
        Pb(x);
        int p=pos[x];
        if(1LL*fa.mx*max(mx,fa.mx)>=t)return x-1;
        int ret=x;
        sum=1LL*max(mx,fa.mx)*fa.mx;
        mx=max(mx,fa.mx);
        while(p!=1){
            if(p&1)p>>=1;
            else{
                p>>=1;
                if(sum+(tmp=get_ans(p<<1|1,mx)) < t){
                    ret=rson.r,mx=max(mx,rson.mx),sum+=tmp;
                }
                else {
                    Down(p);
                    p=p<<1|1;
                    while(fa.l^fa.r){
                        Down(p);
                        if(sum+(tmp=get_ans(p<<1,mx)) < t)ret=lson.r,mx=max(mx,lson.mx),sum+=tmp,p=p<<1|1;
                        else p<<=1;
                    }
                    if(sum+(tmp=1LL*fa.mx*max(fa.mx,mx)) < t)ret=fa.l,mx=max(mx,lson.mx),sum+=tmp;
                    return ret;
                }
            }
        }
        return ret;
    }
    int Query(int x,LL t){
        mx=sum=0;
        int r=Ask_r(x,t);
        if(r<n-1)return r+1;
        else{
            t-=sum;
            sum=0;
            r = Ask_r(0,t);
            if(r<n-1)return r+1;
            t-=sum;
            sum=0;
            LL tt = tree[1].sum * mx;
            LL k = t/tt-(t%tt==0);
            t-=tt*k;
            return Ask_r(0,t)+1;
        }
    }
    #undef fa
    #undef lson
    #undef rson
}Seg;
int main(){
    scanf("%d%d",&n,&q);
    for(int i=0;i<n;i++)scanf("%d",&A[i]);
    Seg.build(0,n-1);
    for(int i=1;i<=q;i++){
        LL l,r,v;
        char op[3];
        scanf("%s%lld%lld",op,&l,&r);
        if(op[0]=='Q'){
            printf("%d\n",Seg.Query(l,r+1));
        }else {
            scanf("%lld",&v);
            if(l<=r)Seg.Update(l,r,op[0]=='P'?1:2,v);
            else {
                Seg.Update(l,n-1,op[0]=='P'?1:2,v);
                Seg.Update(0, r ,op[0]=='P'?1:2,v);
            }
        }
    }
    return 0;
}
