求调,70分

P3372 【模板】线段树 1

MornHus @ 2023-03-31 21:25:42


#include<bits/stdc++.h>
using namespace std;
long long read(){
    long long x=0;
    long long f=1;
    char c=getchar();
    while(c>'9'||c<'0'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    return x*f;
}
int n,m;
long long tree[100001<<2];
long long lazy[100001<<2];
void pushup(int k){
    tree[k]=tree[k<<1]+tree[k<<1|1];
}
void build(int k,int l,int r){
    if(l==r){
        tree[k]=read();
    }else{
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        pushup(k);
    }
}
void pushdown(int k,int l,int r){
    if(lazy[k]){
        int mid=(l+r)>>1;
        lazy[k<<1]+=lazy[k];
        lazy[k<<1|1]+=lazy[k];
        tree[k<<1]+=lazy[k]*(mid-l+1);
        tree[k<<1|1]+=lazy[k]*(r-mid);
        lazy[k]=0;
    }
}
void update(int L,int R,int l,int r,int k,long long val){
    if(L<=l&&r<=R){
        tree[k]+=(r-l+1)*val;
        lazy[k]+=val;
    }else{
        int mid=(l+r)>>1;
        pushdown(k,l,r);
        if(L<=mid){
            update(L,R,l,mid,k<<1,val);
        }
        if(R>mid){
            update(L,R,mid+1,r,k<<1|1,val);
        }
        pushup(k);
    }
}
long long query(int L,int R,int l,int r,int k){
    if(L<=l&&r<=R){
        return tree[k];
    }else{
        int mid=(l+r)>>1;
        pushdown(k,l,r);
        int ans=0;
        if(L<=mid){
            ans+=query(L,R,l,mid,k<<1);
        }
        if(R>mid){
            ans+=query(L,R,mid+1,r,k<<1|1);
        }
        pushup(k);
        return ans;
    }
}
int main(){
    n=read();
    m=read();
    build(1,1,n);
    int opt;
    long long k;
    for(int i=1,x,y;i<=m;i++){
        opt=read();
        x=read();
        y=read();
        if(opt==1){
            k=read();
            update(x,y,1,n,1,k);
        }else{
            printf("%lld\n",query(x,y,1,n,1));
        }
    }
    return 0;
}

by Nwayy @ 2023-03-31 21:34:57

@MornHus query 部分的 ans 开 long long。


|