#include<bits/stdc++.h>
using namespace std;
typedef long long inr;
const inr maxn=2000190;
inr n,m,a[maxn],sum[maxn<<2],tag[maxn<<2],mn[maxn];
#define ls(y) y<<1
#define rs(y) (y<<1)+1
inline void up(inr y) {
//push the tag up
sum[y]=sum[ls(y)]+sum[rs(y)];
mn[y]=min(mn[ls(y)],mn[rs(y)]);
}
inline void build(inr p,inr l,inr r) {
//now, left, right
tag[p]=0;
if(l==r) {
sum[p]=mn[p]=a[l];
return;
}
inr m=(l+r)/2;
build(ls(p),l,m);
build(rs(p),m+1,r);
up(p);
}
inline void chan(inr p,inr l,inr r,inr k) {
//now, now left, now right, plus sum
tag[p]+=k;
sum[p]=sum[p]+k*(r-l+1);
mn[p]+=k;
}
inline void down(inr p,inr l,inr r) {
//now, now left, now right
//push the tag down
inr m=(l+r)>>1;
chan(ls(p),l,m,tag[p]);
chan(rs(p),m+1,r,tag[p]);
tag[p]=0;
}
inline void update(inr sl,inr sr,inr l,inr r,inr p,inr k) {
//left, right, now left, now right, now, plus
if(sl<=l&&r<=sr) {//if included
sum[p]+=k*(r-l+1);
tag[p]+=k;
mn[p]+=k;
return;
}
//if not included
down(p,l,r);
inr m=(l+r)>>1;
if(sl<=m) update(sl,sr,l,m,ls(p),k);
if(sr>m) update(sl,sr,m+1,r,rs(p),k);
up(p);
}
inline inr quesum(inr qx,inr qy,inr l,inr r,inr p) {
//left, right, now left, now right, now
inr res=0;
if(qx<=l&&r<=qy) return sum[p];
inr m=(l+r)>>1;
down(p,l,r);
if(qx<=m) res+=quesum(qx,qy,l,m,ls(p));
if(qy>m) res+=quesum(qx,qy,m+1,r,rs(p));
return res;
}
inline inr quemin(inr qx,inr qy,inr l,inr r,inr p) {
//left, right, now left, now right, now
inr res1=1e7,res2=1e7;
if(qx<=l&&r<=qy) return mn[p];
inr m=(l+r)>>1;
down(p,l,r);
if(qx<=m) res1=quemin(qx,qy,l,m,ls(p));
if(qy>m) res2=quemin(qx,qy,m+1,r,rs(p));
return min(res1,res2);
}
inr x,y,k;
char sc;
int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(inr i=1; i<=n; i++) cin>>a[i];
build(1,1,n);
while(m--) {
cin>>sc;
if(sc=='M') {
cin>>x>>y;
cout<<quemin(x,y,1,n,1)<<endl;//find
} else if(sc=='P'){
cin>>x>>y>>k;
update(x,y,1,n,1,k);
}else{
cin>>x>>y;
cout<<quesum(x,y,1,n,1)<<endl;
}
}
return 0;
}