好像我这份代码才会出现这种问题
还有,为什么要在每次区间操作的时候都要 pushdown.... 附代码:
//https://www.luogu.com.cn/problem/P3372
#include <iostream>
using namespace std;
#define MAX 100010
#define ROOT 1
struct segment
{
int l,r;
long long val,lazy;
}segtree[MAX*4];
int a[MAX],n,m,x,y,op;
long long k;
void build(int p,int l,int r)
{
segtree[p].l=l;
segtree[p].r=r;
if(l==r)
{
segtree[p].val=a[l];
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
segtree[p].val=segtree[p*2].val+segtree[p*2+1].val;
}
inline void pd(int p)
{
if(!segtree[p].lazy)
return;
if(segtree[p].l!=segtree[p].r)
{
segtree[p*2].lazy+=segtree[p].lazy;
segtree[p*2+1].lazy+=segtree[p].lazy;
}
segtree[p*2].val+=segtree[p].lazy*(segtree[p*2].r-segtree[p*2].l+1);
segtree[p*2+1].val+=segtree[p].lazy*(segtree[p*2+1].r-segtree[p*2+1].l+1);
segtree[p].lazy=0;
}
void add(long long x,int l,int r,int p=ROOT)
{
pd(p);
// cout << segtree[p].l << ',' << segtree[p].r << ':' << segtree[p].val << endl;
if(l<=segtree[p].l&&r>=segtree[p].r)
{
segtree[p].val+=x*(segtree[p].r-segtree[p].l+1);
segtree[p].lazy+=x;
// cout << segtree[p].l << ',' << segtree[p].r << ':' << segtree[p].val << endl;
return;
}
int mid=(segtree[p].l+segtree[p].r)/2;
if(r<=mid)
add(x,l,r,p*2);
else if(l>mid)
add(x,l,r,p*2+1);
else
{
add(x,l,r,p*2);
add(x,l,r,p*2+1);
}
segtree[p].val=segtree[p*2].val+segtree[p*2+1].val;
// cout << segtree[p].l << ',' << segtree[p].r << ':' << segtree[p].val << endl;
}
long long query(int l,int r,int p=ROOT)
{
pd(p);
if(l<=segtree[p].l&&r>=segtree[p].r)
return segtree[p].val;
int mid=(segtree[p].l+segtree[p].r)/2;
if(r<=mid)
return query(l,r,p*2);
else if(l>mid)
return query(l,r,p*2+1);
return query(l,r,p*2)+query(l,r,p*2+1);
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i = 1;i<=n;i++)
cin >> a[i];
build(ROOT,1,n);
while(m--)
{
cin >> op >> x >> y;
switch(op)
{
case 1:
cin >> k;
add(k,x,y);
break;
case 2:
cout << query(x,y) << endl;
}
}
return 0;
}