线段树模板

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1000010;
ll n,m;
ll a[N];

struct Node{
    ll it;
    ll l;
    ll r;
    ll data;
}tree[N];

void build(ll rt,ll l,ll r){
    tree[rt].l=l;
    tree[rt].r=r;
    tree[rt].it=0;
    if(l==r){
        tree[rt].data=a[l];
        return ;
    }
    ll mid = (l+r)>>1;
    build(rt*2,l,mid);
    build(rt*2+1,mid+1,r);
    tree[rt].data=tree[rt*2].data+tree[rt*2+1].data;
    return ;
}

void push_down(ll rt){
    if(tree[rt].it!=0){
        tree[rt*2].it+=tree[rt].it;
        tree[rt*2+1].it+=tree[rt].it;
        ll mid = (tree[rt].l+tree[rt].r)>>1;
        tree[rt*2].data+=tree[rt].it*(mid-tree[rt*2].l+1);
        tree[rt*2+1].data+=tree[rt].it*(tree[rt*2+1].r-mid);
        tree[rt].it=0;
    }
    return ;
}

void up_data(ll rt,ll l,ll r,ll k){
    if(tree[rt].l>=l&&tree[rt].r<=r){
        tree[rt].data+=k*(tree[rt].r-tree[rt].l+1);
        tree[rt].it+=k;
        return ;
    }
    push_down(rt);
    if(tree[rt*2].r>=l){
        up_data(rt*2,l,r,k);
    }
    if(tree[rt*2+1].l<=r){
        up_data(rt*2+1,l,r,k);
    }
    tree[rt].data=tree[rt*2].data+tree[rt*2+1].data;
    return ;
}

ll search(ll rt,ll l,ll r){
    if(tree[rt].l>=l&&tree[rt].r<=r){
        return tree[rt].data;
    }
    push_down(rt);
    ll num=0;
    if(tree[rt*2].r>=l){
        num+=search(rt*2,l,r);
    }
    if(tree[rt*2+1].l<=r){
        num+=search(rt*2+1,l,r);
    }
    return num;
}

int main(){
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for(ll i=1;i<=m;i++){
        ll go;
        scanf("%lld",&go);
        if(go==1){
            ll a,b,c;
            scanf("%lld%lld%lld",&a,&b,&c);
            up_data(1,a,b,c);
        }
        if(go==2){
            ll a,b;
            scanf("%lld%lld",&a,&b);
            printf("%lld\n",search(1,a,b));
        }
    }
    return 0;
}

https://www.cnblogs.com/jason2003/p/9676729.html

posted @ 2020-07-05 21:19  LightyaChoo  阅读(86)  评论(0编辑  收藏  举报