#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 20;
typedef long long LL;
struct Node {
    int l, r;
    LL sum, add; //sum表示区间和 add表示懒标记 记录子节点需要增加的值
}tr[N << 2];
int w[N];

void pushup(int u)
{
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}

void pushdown(int u)
{
    Node &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1];
    if(root.add)
    {
        left.add += root.add, right.add += root.add;
        left.sum += 1ll*(left.r - left.l + 1) * root.add;
        right.sum += 1ll*(right.r - right.l + 1) * root.add;
        root.add = 0;
    }
}

void build(int u, int l, int r)
{
    if(l == r) tr[u] = {l, r, w[l], 0};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

void modify(int u, int l, int r, LL d)
{
    if(l <= tr[u].l && r >= tr[u].r) {
        tr[u].sum += 1ll * (tr[u].r - tr[u].l + 1) * d;
        tr[u].add += d;
    }
    else
    {
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if(l <= mid) modify(u << 1, l, r, d);
        if(r > mid) modify(u << 1 | 1, l, r, d);
        pushup(u);
    }
}

LL query(int u, int l, int r)
{
    if(l <= tr[u].l && r >= tr[u].r) return tr[u].sum;
    else
    {
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        LL sum = 0;
        if(l <= mid) sum += query(u << 1, l, r);
        if(r > mid) sum += query(u << 1 | 1, l, r);
        return sum;
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> w[i];

    build(1, 1, n);

    while(m --)
    {
        string op;
        int l, r;
        cin >> op >> l >> r;
        if(op == "Q") {
            cout << query(1, l, r) << endl;
        }
        else {
            LL d;
            cin >> d;
            modify(1, l, r, d);
        }
    }

    return 0;
}

0 条评论

目前还没有评论...