• 模板_SEG_TREE


    #include<bits/stdc++.h>
    #define maxn 500005
    #define int long long
    using namespace std;
    inline int read()
    {
        char x = getchar();
        int lin = 0, f = 1;
        while(x < '0' || x > '9')
        {
            if(x == '-') f = -1;
            x = getchar();
        }
        while(x >= '0' && x <= '9')
        {
            lin = (lin << 1) + (lin << 3) + x - '0';
            x = getchar();
        }
        return lin * f;
    }
    #define PII pair<int,int>
    #define fir first
    #define sec second
    #define ma(a,b) make_pair(a,b)
    #define db double
    #define inf 123123123
    int n,m,v[maxn],x,y,ty,val;
    struct tree{
        int l,r,add,val;
    }tr[maxn];
    #define le tr[k].l
    #define re tr[k].r
    #define upd tr[k].val = tr[k << 1].val + tr[k << 1 | 1].val;
    void pbd(int k,int val)
    {
        tr[k].val = tr[k].val + (re - le + 1) * val;
        tr[k].add = tr[k].add + val;
    }
    void pb(int k)
    {
        if(tr[k].add)
        {
            pbd(k << 1,tr[k].add);
            pbd(k << 1 | 1,tr[k].add);
            tr[k].add = 0;
        }
    }
    void update(int l,int r,int k,int val)
    {
        if(l <= le && re <= r) { pbd(k,val); return; }
        pb(k);
        int mid = le + re >> 1;
        if(l <= mid) update(l,r,k << 1,val);
        if(r > mid) update(l,r,k << 1 | 1,val);
        upd;
    }
    int query(int l,int r,int k)
    {
        if(l <= le && re <= r) return tr[k].val;
        pb(k);
        int ans = 0,mid = le + re >> 1;
        if(l <= mid) ans = ans + query(l,r,k << 1);
        if(r > mid) ans = ans + query(l,r,k << 1 | 1);
        return ans;
    }
    void build(int l,int r,int k)
    {
        le = l; re = r;
        if(l == r) { tr[k].val = v[l]; return; }
        int mid = l + r >> 1;
        build(l,mid,k << 1); build(mid + 1,r,k << 1 | 1);
        upd;
    }
    signed main(){
        n = read(); m = read();
        for(int i = 1; i <= n; i++) v[i] = read();
        build(1,n,1);
        for(int i = 1; i <= m; i++)
        {
            ty = read(); x = read(); y = read();
            if(ty == 1) { val = read(); update(x,y,1,val); }
            else printf("%lld
    ",query(x,y,1));
        }
    }
  • 相关阅读:
    计算一路话音消耗的带宽
    谋哥:我跟CEO们都说了啥
    wchar与char字符转换的探究
    pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下
    围住浮动元素的三种方法
    Chromium浏览器组件设计意图
    tonymillion/Reachability的使用
    赵雅智_名片夹(3)_下拉刷新载入很多其它
    动态创建菜单和动态关联菜单项事件
    delphi创建动态菜单
  • 原文地址:https://www.cnblogs.com/kczno1fans/p/9922344.html
Copyright © 2020-2023  润新知