记录编号 614972 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 1317.数列操作C 最终得分 100
用户昵称 Gravatar乐未殇 是否通过 通过
代码语言 C++ 运行时间 4.147 s
提交时间 2026-04-22 00:03:31 内存使用 9.50 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;

typedef long long ll;

const int MAXN = 100010;

ll arr[MAXN];

struct Node {
    int left, right; // 当前节点维护的区间 [left, right]
    ll sum;          // 当前区间元素和
    ll lazy;         // 懒标记:该区间整体还需要加多少
};

Node tree[MAXN * 4];

void build(int node, int left, int right) {
    tree[node].left = left;
    tree[node].right = right;
    tree[node].lazy = 0;

    if (left == right) {
        tree[node].sum = arr[left];
        return;
    }

    int mid = (left + right) >> 1;
    build(node * 2, left, mid);
    build(node * 2 + 1, mid + 1, right);

    tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
}

void pushDown(int node) {
    if (tree[node].lazy != 0) {
        ll lazyValue = tree[node].lazy;

        tree[node * 2].lazy += lazyValue;
        tree[node * 2 + 1].lazy += lazyValue;

        tree[node * 2].sum += lazyValue * (tree[node * 2].right - tree[node * 2].left + 1);
        tree[node * 2 + 1].sum += lazyValue * (tree[node * 2 + 1].right - tree[node * 2 + 1].left + 1);

        tree[node].lazy = 0;
    }
}

void rangeAdd(int node, int left, int right, ll value) {
    if (left <= tree[node].left && tree[node].right <= right) {
        tree[node].sum += value * (tree[node].right - tree[node].left + 1);
        tree[node].lazy += value;
        return;
    }

    pushDown(node);

    int mid = (tree[node].left + tree[node].right) >> 1;

    if (left <= mid) {
        rangeAdd(node * 2, left, right, value);
    }
    if (right > mid) {
        rangeAdd(node * 2 + 1, left, right, value);
    }

    tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
}

ll rangeQuery(int node, int left, int right) {
    if (left <= tree[node].left && tree[node].right <= right) {
        return tree[node].sum;
    }

    pushDown(node);

    int mid = (tree[node].left + tree[node].right) >> 1;
    ll result = 0;

    if (left <= mid) {
        result += rangeQuery(node * 2, left, right);
    }
    if (right > mid) {
        result += rangeQuery(node * 2 + 1, left, right);
    }

    return result;
}

int main() {
    freopen("shuliec.in", "r", stdin);
    freopen("shuliec.out", "w", stdout);

    int n, m;
    cin >> n;

    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }

    build(1, 1, n);

    cin >> m;

    while (m--) {
        char op[3];
        int left, right;
        cin >> op >> left >> right;

        if (op[0] == 'A') {
            ll delta;
            cin >> delta;
            rangeAdd(1, left, right, delta);
        } else {
            cout << rangeQuery(1, left, right) << '\n';
        }
    }

    return 0;
}