RT:
在本地评测的时候是:
return value 3221225725
你谷是 MLE
也许是爆栈???
蒟蒻找不到错误,求助啊啊(不是ssd)
code:
#include<bits/stdc++.h>
using namespace std;
const int maxsi=1e7+2;
int a[maxsi];
struct node{
int sumv[maxsi*4];
inline void pushup_a(int o){
sumv[o]=sumv[0*2]+sumv[o*2+1];
}
inline void build(int o,int l,int r){//建树操作
if(l==r){//访问到叶子节点
sumv[o]=a[l];
return;
}
int mid=(l+r)/2;
build(o*2,l,mid);//递归建左子树
build(o*2+1,mid+1,r);//递归建右子树
pushup_a(o); //子树信息合并到当前点
}
#define leftson o<<1
#define rightson (o<<1|1)
int minv[maxsi<<2];
inline int querymin(int o,int l,int r,int ql,int qr){//区间和
//ql与qr代表询问区间。
if(ql<=1&&r<=qr){
return sumv[o];
}
int mid=(l+r)>>1;
int ans=1e9+2;
if(ql<mid){//递归查找左子树
ans=min(ans,querymin(leftson,l,mid,ql,qr));
}
if(qr>mid){//递归查找右子树
ans=min(ans,querymin(rightson,mid+1,r,ql,qr));
}
return ans;
}
inline void pushup_b(int o){
minv[o]=min(minv[leftson],minv[rightson]);
}
inline void change(int o,int l,int r,int q,int v){
//单点修改 q代表修改位置,v代表修改值
if(l==r){//叶子节点,即是找到修改区间,修改
minv[o]+=v;
return;
}
int mid=(l+r)>>1;
if(q<=mid){
change(leftson,l,mid,q,v);
}
else{
change(rightson,mid+1,r,q,v);
}
pushup_b(o);
}
int addv[maxsi<<2];//这里其实就是lazy tag
inline void pushdown(int o){
if(!addv[o]){
return;
}
addv[leftson]+=addv[o];
addv[rightson]+=addv[o];
minv[leftson]+=addv[o];
minv[rightson]+=addv[o];
addv[o]=0;//标记下放 给左右子树
}
inline void update(int o,int l,int r,int ql,int qr,int v){
if(l>qr||r<ql){
return;
}
int mid=(l+r)>>1;
if(l>=ql&&r<=qr){
addv[o]+=v;
minv[o]+=(r-l+1)*v;
return;
}
if(addv[o]>0){
pushdown(o);
}
update(leftson,l,mid,ql,qr,v);
update(rightson,mid+1,r,ql,qr,v);
minv[o]+=minv[o*2]+minv[o*2+1];
}
}tree;
int n,m;
int cmd;
int x,y,k;
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(register int i=1;i<=n;++i){
cin>>a[i];
}
tree.build(1,1,n);
for(register int i=1;i<=m;++i){
cin>>cmd;
if(cmd==1){
cin>>x>>y>>k;
tree.update(1,1,n,x,y,k);
}
else{
cin>>x>>y;
cout<<tree.querymin(1,1,n,x,y)<<endl;
}
}
return 0;
}