Kyoma_T @ 2024-04-29 21:42:39
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
const int N=1e5+10;
int a[N];
long long ans=0;
int n,q;
struct node{
int l;
int r;
long long sum;
long long lz;
}tr[4*N];
void build(int p,int l,int r)
{
tr[p].l=l,tr[p].r=r;tr[p].lz=0;
if(l==r)
{
tr[p].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
void push_down(int p)
{
int k=tr[p].lz;
if(tr[p].lz!=0)
{
tr[p<<1].sum+=k*(tr[p<<1].r-tr[p<<1].l+1);
tr[p<<1].lz+=k;
//push_down(p<<1);
tr[p<<1|1].sum+=k*(tr[p<<1|1].r-tr[p<<1|1].l+1);
tr[p<<1|1].lz+=k;
//push_down(p<<1|1);
tr[p].lz=0;
}
return;
}
void modify(int p,int l,int r,int x)
{
int a=tr[p].l,b=tr[p].r;
if(tr[p].l>=l&&tr[p].r<=r)
{
tr[p].sum+=x*(b-a+1);
tr[p].lz+=x;
//push_down(p);
return;
}
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid)modify(p<<1,l,r,x);
if(r>=mid+1)modify(p<<1|1,l,r,x);
tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
return;
}
long long query(int p,int l,int r)
{
//printf("%d %d %d",p,l,r);
if(tr[p].l>=l&&tr[p].r<=r)
{
return tr[p].sum;
//printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
//printf("%d\n",r);
}
push_down(p);
long long s=0;
int mid=tr[p<<1].r;
//printf("mid=%d\n",mid);
if(l<=mid)
{
//printf("l=%d<mid=%d\n",l,mid);
//printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
s+=query(p<<1,l,mid);
//printf("%d\n",mid);
}
if(r>mid)
{
//printf("r=%d>mid=%d\n",r,mid);
//printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
s+=query(p<<1|1,mid+1,r);
//printf("%d %d %d\n",tr[p<<1|1].r,r,mid+1);
}
return s;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
//for(int i=1;i<=4*n;i++)
// printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].sum);
while(q--)
{
int k;
scanf("%d",&k);
if(k==1)
{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
modify(1,l,r,x);
//for(int i=1;i<=4*n;i++)
//printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].sum);
}
else if(k==2)
{
ans=0;
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",query(1,l,r));
}
}
//for(int i=1;i<=4*n;i++)
// if(tr[i].l==tr[i].r&&tr[i].l!=0)printf("%d %d\n",tr[i].l,tr[i].sum);
return 0;
}
by zzxLLL @ 2024-04-29 21:46:02
@Kyoma_T pushdown 里面 int k 变成 long long k?
by Kyoma_T @ 2024-04-29 21:53:55
@zzxLLL 改了还是不行
by zzxLLL @ 2024-04-29 21:58:12
@Kyoma_T
s+=query(p<<1,l,mid)
改成 s+=query(p<<1,l,r)
s+=query(p<<1|1,mid+1,r)
改成 s+=query(p<<1|1,l,r)
by Kyoma_T @ 2024-04-29 22:07:48
@zzxLLL 改完a了两个点,还是没过
by xxboyxx @ 2024-04-29 22:21:44
@Kyoma_T modify函数没传懒标记,加上后实测已过
by Kyoma_T @ 2024-04-29 22:48:23
@xxboyxx 确实确实,谢谢佬 ,但是为什么modify还要传啊,query查的时候不是可以把要用的懒标记都传了吗?
by xxboyxx @ 2024-04-29 22:53:12
@Kyoma_T 但是如果是一连串的修改操作呢?
by Kyoma_T @ 2024-04-29 23:33:25
@xxboyxx 啊啊啊,谢谢大佬,想了半天又画了图才明白,是因为需要lazy下传后更改原来的sum,谢谢大佬,orz