"SPOJ TTM" To the moon "mark to perpetuate"

The meaning of problems

Summarized as Chairman of the tree plus interval range inquiry

answer

Permanent marking of the method of recording it. Each memory point addand sumtwo markers, this interval represents the whole number added, and how much interval (this interval and does not include the ancestors of the node interval plus)

Then add the time interval, the path to each node sumupdate and the update interval after reaching full add. When asked to all nodes on a path (not including itself) is addcombined section length multiplied, plussum

Probably thinking is this: with the addition within the range of summaintenance, additions outside the interval when asked to consider the contribution

#include <algorithm>
#include <cstdio>
using namespace std;

typedef long long ll;

const int N = 1e5 + 10;

int n, m, a[N];
int T[N], id, L[N << 6], R[N << 6];
ll s[N << 6], add[N << 6];

void build(int &rt, int l, int r) {
    rt = ++ id;
    if(l < r) {
        int mid = (l + r) >> 1;
        build(L[rt], l, mid);
        build(R[rt], mid + 1, r);
        s[rt] = s[L[rt]] + s[R[rt]];
    } else s[rt] = a[l];
}

void update(int &rt, int pre, int l, int r, int ql, int qr, int x) {
    rt = ++ id; L[rt] = L[pre]; R[rt] = R[pre];
    s[rt] = s[pre] + (qr - ql + 1) * x; add[rt] = add[pre];
    if(ql == l && r == qr) { add[rt] += x; return ; }
    int mid = (l + r) >> 1;
    if(qr <= mid) update(L[rt], L[pre], l, mid, ql, qr, x);
    else if(ql > mid) update(R[rt], R[pre], mid + 1, r, ql, qr, x);
    else {
        update(L[rt], L[pre], l, mid, ql, mid, x);
        update(R[rt], R[pre], mid + 1, r, mid + 1, qr, x);
    }
}

ll query(int rt, int l, int r, int ql, int qr, ll sum = 0) {
    if(ql == l && qr == r) return sum * (r - l + 1) + s[rt];
    sum += add[rt];
    int mid = (l + r) >> 1;
    if(qr <= mid) return query(L[rt], l, mid, ql, qr, sum);
    if(ql > mid) return query(R[rt], mid + 1, r, ql, qr, sum);
    return query(L[rt], l, mid, ql, mid, sum) + query(R[rt], mid + 1, r, mid + 1, qr, sum);
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++)
        scanf("%d", a + i);
    static char op[5];
    int tnow = 0; build(T[0], 1, n);
    for(int l, r, d, i = 1; i <= m; i ++) {
        scanf("%s", op);
        if(* op == 'C') {
            scanf("%d%d%d", &l, &r, &d);
            update(T[tnow + 1], T[tnow], 1, n, l, r, d);
            tnow ++;
        }
        if(* op == 'Q') {
            scanf("%d%d", &l, &r);
            printf("%lld\n", query(T[tnow], 1, n, l, r));
        }
        if(* op == 'H') {
            scanf("%d%d%d", &l, &r, &d);
            printf("%lld\n", query(T[d], 1, n, l, r));
        }
        if(* op == 'B') {
            scanf("%d", &tnow);
        }
    }
    return 0;
}

Guess you like

Origin www.cnblogs.com/hongzy/p/11307145.html