#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=300010;
struct node{
int sum;
int min;
}tree[4*N];
int l,r,value,n,q,a[N],tag[4*N];
char op;
void maketag(int u,int l,int r,int value){
tag[u]+=value;
tree[u].sum+=value*(r-l+1);
tree[u].min+=value;
return ;
}
void pushdown(int u,int l,int r){
if(tag[u]){
int mid=(l+r)>>1;
maketag(2*u,l,mid,tag[u]);
maketag(2*u+1,mid+1,r,tag[u]);
tag[u]=0;
}
return ;
}
void pushup(int u){
tree[u].sum=tree[2*u].sum+tree[2*u+1].sum;
tree[u].min=min(tree[2*u].min,tree[2*u+1].sum);
return ;
}
void build(int u,int l,int r){
if(l==r){
tree[u].sum=a[l];
tree[u].min=a[l];
return ;
}
int mid=(l+r)>>1;
build(2*u,l,mid);
build(2*u+1,mid+1,r);
pushup(u);
return ;
}
void update(int u,int l,int r,int targetl,int targetr,int value){
if(targetl<=l && r<=targetr){
maketag(u,l,r,value);
return ;
}
pushdown(u,l,r);
int mid=(l+r)>>1;
if(targetl<=mid){
update(2*u,l,mid,targetl,targetr,value);
}
if(targetr>mid){
update(2*u+1,mid+1,r,targetl,targetr,value);
}
pushup(u);
return ;
}
int querysum(int u,int l,int r,int targetl,int targetr){
if(targetl<=l && r<=targetr){
return tree[u].sum;
}
pushdown(u,l,r);
int ans=0;
int mid=(l+r)>>1;
if(targetl<=mid){
ans+=querysum(2*u,l,mid,targetl,targetr);
}
if(targetr>mid){
ans+=querysum(2*u+1,mid+1,r,targetl,targetr);
}
return ans;
}
int querymin(int u,int l,int r,int targetl,int targetr){
if(targetl<=l && r<=targetr){
return tree[u].min;
}
pushdown(u,l,r);
int ans=1e18;
int mid=(l+r)>>1;
if(targetl<=mid){
ans=min(ans,querymin(2*u,l,mid,targetl,targetr));
}
if(targetr>mid){
ans=min(ans,querymin(2*u+1,mid+1,r,targetl,targetr));
}
return ans;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(q--){
cin>>op;
if(op=='P'){
cin>>l>>r>>value;
update(1,1,n,l,r,value);
}
else if(op=='M'){
cin>>l>>r;
cout<<querymin(1,1,n,l,r)<<"\n";
}
else{
cin>>l>>r;
cout<<querysum(1,1,n,l,r)<<"\n";
}
}
return 0;
}