悬关求助
查看原帖
悬关求助
741732
small_Dongpo楼主2024/1/27 11:19

爆0了QAQ

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

typedef long long l;
l n, m, a[100005], sum[100005], tag[100005], op, x, y, k;

l lc(l x) {return x << 1;}
l rc(l x) {return x << 1 | 1;}

void move (l x, l t, l lef, l rig) {
    sum[x] += t * (rig - lef + 1);
    tag[x] += t;
}

void up(l x) {
    sum[x] = sum[lc(x)] + sum[rc(x)];
}

void down(l x, l lef, l rig) {
    l mid = (lef + rig) >> 1;
    move(lc(x), lef, mid, tag[x]);
    move(rc(x), mid + 1, rig, tag[x]);
    tag[x] = 0;
}

void build(l x, l lef, l rig) {
    if (lef == rig) {
        sum[x] = a[lef];
        return;
    }
    l mid = (lef + rig) >> 1;
    build(lc(x), lef, mid);
    build(rc(x), mid + 1, rig);
    up(x);
    printf("sum[%lld][%lld] = %lld\n", lef, rig, sum[x]);
}

l sums(l x, l ql, l qr, l lef, l rig) {
    if (ql <= lef && rig <= qr) return sum[x];
    down(x, lef, rig);
    l ans = 0;
    l mid = (lef + rig) >> 1;
    if (ql <= mid) {
        ans += sums(lc(x), ql, qr, lef, mid);
    }
    if (mid < qr) {
        ans += sums(rc(x), ql, qr, mid + 1, rig);
    }
    return ans;
}

void update(l x, l ql, l qr, l lef, l rig, l t) {
    if (ql <= lef && rig <= qr) {
        move(x, lef, rig, t);
        return;
    }
    down(x, lef, rig);
    l mid = (lef + rig) >> 1;
    if (ql <= mid) {
        update(lc(x), ql, qr, lef, mid, tag[x]);
    }
    if (mid < qr) {
        update(rc(x), ql, qr, mid + 1, rig, tag[x]);
    }
    up(x);
}

int main() {
    scanf("%lld%lld", &n, &m);
    for (l i = 1; i <= n; ++i) {
        scanf("%lld", &a[i]);
    }
    build(1, 1, n);
    for (l i = 1; i <= n; ++i) {
        scanf("%lld", &op);
        if (op == 1) {
            scanf("%lld%lld%lld", &x, &y, &k);
            update(1, x, y, 1, n, k);
        } else {
            scanf("%lld%lld", &x, &y);
            printf("%lld\n", sums(1, x, y, 1, n));
        }
    }
    return 0;
}

2024/1/27 11:19
加载中...