求调

P3372 【模板】线段树 1

czh012 @ 2025-01-11 15:07:57

WA70,求大佬帮助

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
long long n,m,c,s,r,o,d,a[N];
struct node{ 
    long long l,r,sum,tag;
}tre[N<<2];
void pushup(long long num){
    tre[num].sum=tre[num<<1].sum+tre[num<<1|1].sum;
}
void pushdown(long long num){
    if(tre[num].tag!=0){
        tre[num<<1].tag+=tre[num].tag;
        tre[num<<1|1].tag+=tre[num].tag;
        tre[num<<1].sum+=tre[num].tag*(tre[num<<1].r-tre[num<<1].l+1);
        tre[num<<1|1].sum+=tre[num].tag*(tre[num<<1|1].r-tre[num<<1|1].l+1);
        tre[num].tag=0;
    }
}
void build(long long num,long long ll,long long rr){
    tre[num].l=ll;
    tre[num].r=rr;
    tre[num].tag=0;
    if(ll==rr){
        tre[num].sum=a[ll];
        return ;
    }
    int mid=ll+rr>>1;
    build(num<<1,ll,mid);
    build(num<<1|1,mid+1,rr);
    pushup(num);
}
void modify(long long num,long long L,long long R,long long x){
    if(tre[num].r<L||tre[num].l>R)return ;
    if(tre[num].l>=L && tre[num].r<=R){
        tre[num].sum+=(tre[num].r-tre[num].l+1)*x;
        tre[num].tag+=x;
        return ;
    }
    pushdown(num);
    modify(num<<1,L,R,x);
    modify(num<<1|1,L,R,x);
    pushup(num);
}
int query(long long num,long long L,long long R){
    if(tre[num].r<L||tre[num].l>R)return 0;
    if(tre[num].l>=L && tre[num].r<=R)return tre[num].sum;
    pushdown(num);
    return query(num<<1,L,R)+query(num<<1|1,L,R);
} 
int main(){
    cin>>c>>r;
    for(int i=1;i<=c;i++){
        cin>>a[i];
    }
    build(1,1,c);
    while(r--){
        cin>>s;
        if(s==1){
            cin>>o>>d>>n;
            modify(1,o,d,n);
        }
        else{
            cin>>o>>d;
            cout<<query(1,o,d)<<endl;
        }
    }
    return 0;
} 

by Shirasu_Azusa_ @ 2025-01-11 15:22:51

query 不用开 long long 的吗bro


by czh012 @ 2025-01-11 15:34:34

@ShirasuAzusa Thank you


|