求助
蒟蒻第一次敲线段树:[题目](https://www.luogu.com.cn/problem/P3372)
应该是ask_the_answer函数出了错,但哪里错了呀,调了好久(哭)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[100010];
struct node{
ll l,r;
ll sum;
ll lazy_flag;
}c[400050];
void build(ll x,ll l,ll r){
c[x].l=l;
c[x].r=r;
if(l==r){
c[x].sum=a[l];
return ;
}
ll mid=(l+r)>>1;
c[x*2].sum=(x*2,l,mid);
c[x*2+1].sum=(x*2+1,mid+1,r);
c[x].sum=c[x*2].sum+c[x*2+1].sum;
}
void lazy_down(ll x){
if(c[x].lazy_flag!=0){
ll add=c[x].lazy_flag;
c[x*2].sum+=add*(c[x*2].r-c[x*2].l+1);
c[x*2].lazy_flag+=add;
c[x*2+1].sum=add*(c[x*2+1].r-c[x*2+1].l+1);
c[x*2+1].lazy_flag+=add;
c[x].lazy_flag=0;
}
}
void find(ll i,ll l,ll r,ll k){
if(c[i].l>=l&&c[i].r<=r){
c[i].lazy_flag+=k;
c[i].sum+=k*(c[i].r-c[i].l+1);
return ;
}
lazy_down(i);
ll mid=(c[i].l+c[i].r)>>1;
if(l<=mid){
find(i*2,l,r,k);
}
if(r>mid){
find(i*2+1,l,r,k);
}
c[i].sum=c[i*2].sum+c[i*2+1].sum;
}
ll ask_the_answer(ll i,ll l,ll r){
ll ans=0;
if(c[i].l>=l&&c[i].r<=r){
return c[i].sum;
}
lazy_down(i);
ll mid=(c[i].l+c[i].r)>>1;
if(l<=mid){
ans+=ask_the_answer(i*2,l,r);
}
if(r>mid){
ans+=ask_the_answer(i*2+1,l,r);
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
ll k,x,y,z;
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&k);
if(k==1){
scanf("%lld%lld%lld",&x,&y,&z);
find(1,x,y,z);
}else{
scanf("%lld%lld",&x,&y);
cout<<ask_the_answer(1,x,y)<<endl;
}
}
return 0;
}
已解决
此帖完结(撒花)