我对着之前的代码看了好几遍,然而并没有发现哪里出问题了。若出现伞兵错误,还望大佬轻喷指点
附:代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int num[1001000];
struct node{
int l,r;
ll sum,lz;
}tree[1001000];
void pushup(int id)
{
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void pushdown(int id)
{
if(!tree[id].lz)return;
tree[id*2].lz+=tree[id].lz;
tree[id*2+1].lz+=tree[id].lz;
int mid=(tree[id].l+tree[id].r)/2;
tree[id*2].sum+=(mid-tree[id].l+1)*tree[id].lz;
tree[id*2+1].sum+=(tree[id].r-mid)*tree[id].lz;
tree[id].lz=0;
}
void build(int id,int l,int r)
{
tree[id].l=l;tree[id].r=r;tree[id].lz=0;
if(l==r)
{
tree[id].sum=num[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
pushup(id);
}
void add(int id,int l,int r,ll k)
{
if(l<=tree[id].l&&tree[id].r<=r)
{
tree[id].lz+=k;
tree[id].sum+=(tree[id].r-tree[id].l)*k;
return;
}
pushdown(id);
int mid=(tree[id].l+tree[id].r)/2;
if(l<=mid)add(id*2,l,r,k);
if(r>mid)add(id*2+1,l,r,k);
pushup(id);
}
ll find(int id,int l,int r)
{
if(l<=tree[id].l&&tree[id].r<=r)return tree[id].sum;
pushdown(id);
ll sum=0;
int mid=(tree[id].l+tree[id].r)/2;
if(l<=mid)sum+=find(id*2,l,r);
if(r>mid)sum+=find(id*2+1,l,r);
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",&num[i]);
build(1,1,n);
for(int i=1;i<=m;++i)
{
int a,b;
ll c;
scanf("%d",&a);
if(a==1)
{
scanf("%d%d%lld",&a,&b,&c);
add(1,a,b,c);
}
else
{
scanf("%d%d",&a,&b);
printf("%lld\n",find(1,a,b));
}
}
return 0;
}