Derrick_Rose @ 2023-08-23 11:19:51
除了第二个点全 WA
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#define int long long
#define N 100100
using namespace std;
int n,m,a[N];
struct node
{
int le,ri;
int val,tag;
}T[N<<2];
void build(int i,int l,int r)
{
T[i].le=l,T[i].ri=r;
if(l==r)
{
T[i].val=a[l];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
T[i].val=T[i<<1].val+T[i<<1|1].val;
}
void pushdown(int i)
{
T[i<<1].val+=(T[i<<1].ri-T[i<<1].le+1)*T[i].tag;
T[i<<1|1].val+=(T[i<<1|1].ri-T[i<<1|1].le+1)*T[i].tag;
T[i<<1].tag+=T[i].tag;
T[i<<1|1].tag+=T[i].tag;
T[i].tag=0;
}
void update(int i,int l,int r,int k)
{
if(l<=T[i].le&&r>=T[i].ri)
{
T[i].tag+=k;
T[i].val+=(T[i].ri-T[i].le+1)*k;
return;
}
if(T[i].tag)pushdown(i);
int mid=(T[i].le+T[i].ri)>>1;
if(l<=mid)update(i<<1,l,r,k);
if(r>=mid+1)update(i<<1|1,l,r,k);
T[i].val=T[i<<1].val+T[i<<1|1].val;
}
int ask(int i,int l,int r)
{
if(l<=T[i].le&&r>=T[i].ri)
{
return T[i].val;
}
if(T[i].tag)pushdown(i);
int mid=(T[i].ri+T[i].le)>>1,ans=0;
if(l<=mid)ans+=ask(i<<1,l,mid);
if(r>=mid+1)ans+=ask(i<<1|1,mid+1,r);
return ans;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int q,x,y;
cin>>q>>x>>y;
if(q==1)
{
int k;
cin>>k;
update(1,x,y,k);
}
if(q==2)
{
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}
by _mi_ka_ @ 2023-08-24 08:20:20
ask
递归时变量没打对,此贴结。