zzzychita @ 2023-10-07 16:38:16
除了第一个点和样例能过,其他都过不了QwQ
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=100001;
struct node{
int l;
int r;
ll dat;
ll tag;
}st[MAXN+1];
ll a[MAXN];
void build(int node_num,int l,int r)
{
st[node_num].l=l;
st[node_num].r=r;
st[node_num].tag=0;
if(l==r)
{
st[node_num].dat=a[l];
return;
}
build(node_num*2,l,(l+r)/2);
build(node_num*2+1,(l+r)/2+1,r);
st[node_num].dat=st[node_num*2].dat+st[node_num*2+1].dat;
}
void push_down(int node_num)
{
if(st[node_num].tag==0) return;
int mid=(st[node_num].l+st[node_num].r)/2;
st[2*node_num].dat+=st[node_num].tag*(mid-st[node_num].l+1);
st[2*node_num].tag+=st[node_num].tag;
st[2*node_num+1].dat+=st[node_num].tag*(mid-st[node_num].r-mid);
st[2*node_num+1].tag+=st[node_num].tag;
st[node_num].tag=0;
}
ll ask(int node_num,int tar_l,int tar_r)
{
int mid=(st[node_num].l+st[node_num].r)/2;
if(st[node_num].l>=tar_l&&st[node_num].r<=tar_r)
{
return st[node_num].dat;
}
push_down(node_num);
ll res=0;
if(mid>=tar_l)
res+=ask(node_num*2,tar_l,tar_r);
if(mid<tar_r)
res+=ask(node_num*2+1,tar_l,tar_r);
return res;
}
void add(int node_num,int tar_l,int tar_r,ll val)
{
if(st[node_num].l>=tar_l&&st[node_num].r<=tar_r)
{
st[node_num].dat+=val*(st[node_num].r-st[node_num].l+1);
st[node_num].tag+=val;
return;
}
int mid=(st[node_num].l+st[node_num].r)/2;
push_down(node_num);
if(mid>=tar_l)
add(node_num*2,tar_l,tar_r,val);
if(mid<tar_r)
add(node_num*2+1,tar_l,tar_r,val);
st[node_num].dat=st[node_num*2].dat+st[node_num*2+1].dat;
}
int main()
{
int m,n;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--)
{
ll x,y,k,a1;
scanf("%d",&a1);
if(a1==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(1,x,y));
}
}
return 0;
}
by Nobelium_255 @ 2023-10-07 16:49:16
pushdown更新右儿子的时候是不是忘记+1了