#include <bits/stdc++.h>
#define MAXN 300000
struct node
{
int left,right,lazy,val;
node(){ val=0; lazy=0; }
} tree[MAXN];
void build(int i,int l,int r)
{
tree[i].left=l; tree[i].right=r;
if(tree[i].left == tree[i].right) {std::scanf("%d",&tree[i].val); return ;}
if(r>l)
{
int mid=(l+r)/2;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
tree[i].val=tree[i<<1].val+tree[i<<1|1].val;
return ;
}
void Insert(int i,int l,int r,int k)
{
if(l<=r)
{
if(tree[i].left==l && tree[i].right==r) tree[i].lazy+=k;
else
{
int mid=(tree[i].left+tree[i].right)/2;
if(r<=mid) Insert(i<<1,l,r,k);
else if(l>mid) Insert(i<<1|1,l,r,k);
else
{
Insert(i<<1,l,mid,k);
Insert((i<<1)|1,mid+1,r,k);
}
}
}
return ;
}
int get_sum(int i,int l,int r)
{
int ans=0,mid=(tree[i].left+tree[i].right)/2;
if(tree[i].left==l && tree[i].right==r)
return tree[i].val+tree[i].lazy*(tree[i].right-tree[i].left+1);
//下传
tree[i<<1].lazy+=tree[i].lazy;
tree[i<<1|1].lazy+=tree[i].lazy;
tree[i].val+=tree[i].lazy*(tree[i].right-tree[i].left+1);
tree[i].lazy=0;
if(r<=mid) ans=get_sum(i<<1,l,r);
else if(l>mid) ans=get_sum(i<<1|1,l,r);
else ans=get_sum(i<<1,l,mid)+get_sum(i<<1|1,mid+1,r);
return ans;
}
int main()
{
std::freopen("in.txt","r",stdin);
int n,m,ans;
std::scanf("%d%d",&n,&m);
build(1,1,n);
for(int i=1;i<=m;++i)
{
int flag;
std::scanf("%d",&flag);
if(flag==1)
{
int x,y,k;
std::scanf("%d%d%d",&x,&y,&k);
Insert(1,x,y,k);
}
else
{
int x,y;
std::scanf("%d%d",&x,&y);
ans=get_sum(1,x,y);
printf("%d\n",ans);
}
}
return 0;
}
求助,样例过不去,应该是懒标记 || 下传 || 求和写错了。
我的输出一直是11 8 16
第三个 16 与 样例中的 20 不符。
先在这里谢谢了