直接搬运题解的就不用了
输出答案错误
有题解,不用搬运,只是找不出自己的问题
#include<stdio.h>
int a[4000000];
typedef struct node
{
int l,r;
int w;
int mark;
}Tree[4000000];
Tree tree;
void build(int l,int r,int k)//建树
{
tree[k].mark=0;
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
tree[k].w=a[k];
return;
}
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
void pushdown(int k)//下移
{
tree[k<<1].mark+=tree[k].mark;
tree[k<<1|1].mark+=tree[k].mark;
int mid;
mid=(tree[k].l+tree[k].r)>>1;
tree[k<<1].w+=(tree[k].mark)*(mid-tree[k].l+1);
tree[k<<1|1].w+=(tree[k].mark)*(tree[k].r-mid+1);
tree[k].mark=0;
}
void modifytheinterval(int n,int x,int y,int k)//区间修改
{
if(x>=tree[k].l&&y<=tree[k].r)//全覆盖的情况
{
tree[k].w+=(tree[k].l-tree[k].r+1)*n;
tree[k].mark+=n;
return;
}
if(tree[k].mark)
{
pushdown(k);
}
int mid=(tree[k].l+tree[k].r)>>1;
if(x<=mid)
{
modifytheinterval(n,x,y,k<<1);
}
if(y>=mid)
{
modifytheinterval(n,x,y,k<<1|1);
}
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
int querytheintervalnew(int x,int y,int k)//区间查询
{
int res=0;
if(x>=tree[k].l&&y<=tree[k].r)//全覆盖的情况
{
return tree[k].w;
}
if(tree[k].mark)
{
pushdown(k);
}
int mid=(tree[k].l+tree[k].r)>>1;
if(x<=mid)
{
res+=querytheintervalnew(x,y,k<<1);
}
if(y>=mid)
{
res+=querytheintervalnew(x,y,k<<1|1);
}
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
return res;
}
int main()
{
int m,n;
scanf("%d %d\n",&n,&m);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
build(1,n,1);
}
for(i=1;i<=m;i++)
{
int flag;
scanf("%d",&flag);
if(flag==1)
{
int x,y,k;
scanf("%d %d %d\n",&x,&y,&k);
modifytheinterval(k,x,y,1);
}
if(flag==2)
{
int x,y;
scanf("%d %d\n",&x,&y);
printf("%d\n",querytheintervalnew(x,y,1));
}
}
return 0;
}