

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <climits>
#include <string>
using namespace std;
typedef long long ll;
const int N = 200005;
struct Tree{
int l,r;
ll sum,add,min_g;
}tr[N*4];
int n,m;
ll a[N];
void pushup(int p){
tr[p].sum = tr[p << 1].sum + tr[p << 1 | 1].sum;
tr[p].min_g = min(tr[p << 1].min_g,tr[p << 1 | 1].min_g);
}
void pushdown(int p){
if(tr[p].add){
tr[p << 1].sum += tr[p].add*ll(tr[p << 1].r - tr[p<<1].l + 1);
tr[p << 1].min_g += tr[p].add;
tr[p << 1].add += tr[p].add;
tr[p << 1 | 1].sum += tr[p].add * ll(tr[p << 1 | 1].r - tr[p << 1 | 1].l + 1);
tr[p << 1 | 1].add += tr[p].add;
tr[p << 1 | 1].min_g += tr[p].add;
tr[p].add = 0;
}
}
void build(int p,int l,int r){
tr[p].l = l;
tr[p].r = r;
tr[p].add = 0;
if(l == r){
tr[p].sum = tr[p].min_g = a[l];
return;
}
int mid = l+r >> 1;
build(p<<1,l,mid);
build(p<<1 | 1,mid+1,r);
pushup(p);
}
ll query_sum(int p,int l,int r){
if(tr[p].l >= l && tr[p].r <= r) return tr[p].sum;
pushdown(p);
int mid = tr[p].l + tr[p].r >> 1;
ll res = 0;
if(l <= mid) res += query_sum(p << 1,l,r);
if(r > mid) res += query_sum(p<<1|1,l,r);
return res;
}
ll query_min(int p,int l,int r){
if(tr[p].l >= l && tr[p].r <= r) return tr[p].min_g;
pushdown(p);
int mid = tr[p].l + tr[p].r >> 1;
ll res = LONG_LONG_MAX;
if(l <= mid) res = min(query_min(p<<1,l,r),res);
if(r > mid) res = min(query_min(p<<1|1,l,r),res);
return res;
}
void modify(int p,int l,int r,int k){
if(tr[p].l >= l && tr[p].r <= r){
tr[p].sum += k*(tr[p].r - tr[p].l + 1);
tr[p].min_g += k;
tr[p].add += k;
return;
}
pushdown(p);
int mid = tr[p].l + tr[p].r >> 1;
if(l <= mid) modify(p << 1,l,r,k);
if(r > mid) modify(p << 1 | 1,l,r,k);
pushup(p);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> a[i];
}
build(1,1,n);
while(m--){
char op;
int x,y,z;
cin >> op >> x >> y;
if(op == 'M') cout << query_min(1,x,y) << '\n';
else if(op == 'P'){
cin >> z;
modify(1,x,y,z);
}
else cout << query_sum(1,x,y) << '\n';
}
return 0;
}
调了很久,不知道哪里错了,希望DALAO指出