新人 TLE 求调
查看原帖
新人 TLE 求调
614705
WHH_FZZ楼主2022/8/24 11:42
#include "bits/stdc++.h"
#define okbut puts((ok) ? "YES" : "NO")
#define vi vector<int>
#define pii pair<int, int>
#define endl '\n'
#define inf 0x3f3f3f3f
#define orz 0
using namespace std;
using ll = long long;
inline ll ri()
{
    ll x = 0 , f = 1; char ch = getchar();
    while (ch < '0'|| ch > '9'){if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9'){x = x * 10 + ch - 48; ch = getchar();}
    return x * f;
}
// The desire of his soul is the prophecy of his fate.
// 灵 魂 的 渴 望 是 你 命 运 的 先 知 。

const int N = 1e6 + 10;
int a[N];

namespace segtree
{
    struct vex
    {
        int val, la; vex *ls, *rs; int l, r;
        vex(): val(0), ls(NULL), rs(NULL) {}
    };

    inline void pushup(vex* rt) {rt -> val = (rt -> ls -> val + rt -> rs -> val);}

    inline void fix(vex* rt, int k)
    {
        (rt -> val) += k * ((rt -> r) - (rt -> l) + 1);
        (rt -> la) += k;
    }

    inline void pushdown(vex* rt)
    {
        if(rt -> la != 0)
        {
            fix(rt -> ls, rt -> la);
            fix(rt -> rs, rt -> la);
            rt -> la = 0;
        }
    }

    inline void build(vex* rt, int l, int r)
    {
        rt -> l = l; rt -> r = r;
        if(l == r) {rt -> val = a[l]; return;} int mid = (l + r) >> 1;
        if(rt -> ls == NULL) rt -> ls = new vex(); build(rt -> ls, l, mid);
        if(rt -> rs == NULL) rt -> rs = new vex(); build(rt -> rs, mid + 1, r);
        pushup(rt);
    }

    inline int query(vex* rt, int nl, int nr)
    {
        if(rt == NULL) return 0;
        int l = (rt -> l), r = (rt -> r); if(l == r) return rt -> val;
        int res = 0; int mid = (l + r) >> 1; pushdown(rt);
        if(nl <= mid) res += query(rt -> ls, nl, nr);
        if(nr > mid) res += query(rt -> rs, nl, nr);
        return res;
    }

    inline void update(vex* rt, int nl, int nr, int k)
    {
        if(rt == NULL) return;
        int l = (rt -> l), r = (rt -> r); if(l == r) {fix(rt, k); return;}
        int mid = (l + r) >> 1; pushdown(rt);
        if(nl <= mid) update(rt -> ls, nl, nr, k);
        if(nr > mid) update(rt -> rs, nl, nr, k);
        pushup(rt);
    }
}

using namespace segtree;

void solve()
{
    int n = ri(), q = ri(); for(int i = 1; i <= n; i++) cin >> a[i];
    vex* root = new vex(); build(root, 1, n);
    while(q--)
    {
        int op = ri(), l = ri(), r = ri();
        if(op == 1) update(root, l, r, ri());
        else cout << query(root, l, r) << endl;
    }
}

signed main()
{
    //int T_T = ri(); while(T_T--)
    solve(); return orz;
}
2022/8/24 11:42
加载中...