0分求条!!!

P3372 【模板】线段树 1

kkkkks03 @ 2024-12-05 20:06:36

#include<bits/stdc++.h>
using namespace std;
long long tree[414514],n,m,a[114541];
long long lasy[414514];
#define ll long long 
inline void build(ll l,ll r,ll p){
    lasy[p]=0;
    if(l==r){
        tree[p]=a[l];
        return ;
    }
    ll mid=(l+r)>>1;
    build(l,mid,p<<1);
    build(mid+1,r,p<<1|1);
    tree[p]=tree[p<<1]+tree[p<<1|1];
}
inline void ch(ll p,ll l,ll r,ll k){
    tree[p]+=k*(r-l+1);
    lasy[p]+=k;
}
inline void pd(ll p,ll l,ll r){
    ll mid=(l+r)>>1;
    ch(p<<1,l,mid,lasy[p]);
    ch(p<<1|1,mid+1,r,lasy[p]);
    lasy[p]=0;
}
inline void data(ll l,ll r,ll x,ll y,ll p,ll k){
    if(x<=l&&y>=r){
        tree[p]+=k*(r-l+1);
        lasy[p]+=k;
        return ;
    }
    pd(p,l,r);
    ll mid=(l+r)>>1;
    if(mid>=x){
        data(l,mid,x,y,p<<1,k);
    }
    if(mid<y){
        data(mid+1,r,x,y,p<<1|1,k);
    }
    tree[p]=tree[p<<1]+tree[p<<1|1];
}
ll qqq(ll l,ll r,ll x,ll y,ll p){
    ll mid=(l+r)>>1;
    ll s=0;
    if(x<=l&&y>=r){
        return tree[p];
    }
    pd(p,l,r);
    if(mid>=x){
        s+=qqq(l,mid,x,y,p<<1);
    }
    if(mid<y){
        s+=qqq(mid+1,r,x,y,p<<1|1);
    }
    return s;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int f,x,y,z;
        cin>>f;
        if(f==1){
            cin>>x>>y>>z;
            data(1,n,x,y,z,1);
        }
        else {
            cin>>x>>y;
            cout<<qqq(1,n,x,y,1)<<"\n";
        }
    }
    return 0;
} 

|