线段树Final版本

结构体是个好东西。。。

看着逼格很高

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define l(x) (x<<1)
#define r(x) ((x<<1)|1)
#define ll long long
using namespace std;

struct Treenode{int l,r;ll tag,val;};
struct Segtree
{
    Treenode tr[5*100010];
    void pushup(int id){tr[id].val=tr[l(id)].val+tr[r(id)].val;}
    void pushdown(int id)
    {
        tr[l(id)].val+=tr[id].tag*(tr[l(id)].r-tr[l(id)].l+1);
        tr[r(id)].val+=tr[id].tag*(tr[r(id)].r-tr[r(id)].l+1);
        tr[l(id)].tag+=tr[id].tag;tr[r(id)].tag+=tr[id].tag;
        tr[id].tag=0;
    }
    void build(int id,int L,int R)
    {
        tr[id].l=L,tr[id].r=R;
        tr[id].tag=0;
        if(L==R)
        {
            scanf("%lld",&tr[id].val);
            return;
        }
        int mid=(L+R)>>1;
        build(l(id),L,mid);
        build(r(id),mid+1,R);
        pushup(id);
    }
    void update(int id,int L,int R,ll k)
    {
        if(tr[id].l>=L && tr[id].r<=R)
        {
            tr[id].val+=k*(tr[id].r-tr[id].l+1);
            tr[id].tag+=k;
            return;
        }
        if(tr[id].tag)pushdown(id);
        int mid=(tr[id].l+tr[id].r)>>1;
        if(L<=mid)update(l(id),L,R,k);
        if(R>mid) update(r(id),L,R,k);
        pushup(id);
    }
    ll query(int id,int L,int R)
    {
        if(tr[id].l>=L && tr[id].r<=R)return tr[id].val;
        if(tr[id].tag)pushdown(id);
        int mid=(tr[id].l+tr[id].r)>>1;
        ll ans=0;
        if(L<=mid)ans+=query(l(id),L,R);
        if(R>mid)ans+=query(r(id),L,R);
        return ans;
    }
}Seg;

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    Seg.build(1,1,n);
    while(m--)
    {
        int opt,x,y,k;
        scanf("%d",&opt);
        if(opt==1)
        {
            scanf("%d%d%d",&x,&y,&k);
            Seg.update(1,x,y,k);
        }
        if(opt==2)
        {
            scanf("%d%d",&x,&y);
            printf("%lld
",Seg.query(1,x,y));
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/Kong-Ruo/p/7780895.html