只过了#1,#3,#4,其他全部TLE,求助
#include<iostream>
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define min(x,y) ((x)<(y)?(x):(y))
#define int long long
using namespace std;
struct node{
int data,add,min;
int l,r;
}tree[800000];
int seq[300100],n,m;//数组开小了O2会RE
const int inf=(int)(114514*191981.0)<<1;//homo特有的无孔不入(
int build(int p,int l,int r){
node &root=tree[p];
root.l=l,root.r=r;
if(l==r)return root.data=root.min=seq[l];
int mid=(l+r)>>1;
root.data=build(ls(p),l,mid)+build(rs(p),mid+1,r);
root.min=min(tree[ls(p)].min,tree[rs(p)].min);
return root.data;
}//建树
void down(int p){
if(!tree[p].add)return;
tree[ls(p)].add+=tree[p].add;
tree[rs(p)].add+=tree[p].add;
tree[ls(p)].data+=tree[p].add*(tree[ls(p)].r-tree[ls(p)].l+1);
tree[rs(p)].data+=tree[p].add*(tree[rs(p)].r-tree[rs(p)].l+1);
tree[ls(p)].min+=tree[p].add;
tree[rs(p)].min+=tree[p].add;
tree[p].add=0;
}//下传
void add(int l,int r,int val,int p=1){
if(tree[p].l>r||tree[p].r<l)return;
if(tree[p].l>=l&&tree[p].r<=r){
tree[p].data+=val*(tree[p].r-tree[p].l+1);
tree[p].min+=val;
tree[p].add+=val;
return;
}
down(p);
add(l,r,val,ls(p));
add(l,r,val,rs(p));
tree[p].data=tree[ls(p)].data+tree[rs(p)].data;
tree[p].min=min(tree[ls(p)].min,tree[rs(p)].min);
}//添加
int query_sum(int l,int r,int p=1){
if(tree[p].l>r||tree[p].r<l)return 0;
if(tree[p].l>=l&&tree[p].r<=r)
return tree[p].data;
down(p);
return query_sum(l,r,ls(p))+query_sum(l,r,rs(p));
}//求和
int query_min(int l,int r,int p=1){
if(tree[p].l>r||tree[p].r<l)return inf;
if(tree[p].l>=l&&tree[p].r<=r)
return tree[p].min;
down(p);
return min(query_min(l,r,ls(p)),query_min(l,r,rs(p)));
}//求最小值
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>seq[i];
build(1,1,n);
while(m--){
char c;cin>>c;
int x,y;cin>>x>>y;
switch(c){
case 'P':{
int val;cin>>val;
add(x,y,val);
break;
}
case 'M':{
cout<<query_min(x,y)<<endl;
break;
}
case 'S':{
cout<<query_sum(x,y)<<endl;
break;
}
}
}
}