Submission

Status:
PPTTTTTTTTTTTTTTTTTT

Score: 10

User: real_MYdkn_not_fake_100

Problemset: ผลบวก (ยาก)

Language: cpp

Time: 0.202 second

Submitted On: 2024-11-11 09:08:28

#include <iostream>
#include <vector>
using namespace std;

vector<int> base, segTree;
int n, m;

void build(int node, int start, int end) {
    if (start == end) {
        segTree[node] = base[start];
    } else {
        int mid = (start + end) / 2;
        build(2 * node + 1, start, mid);
        build(2 * node + 2, mid + 1, end);
        segTree[node] = segTree[2 * node + 1] + segTree[2 * node + 2];
    }
}

void update(int node, int start, int end, int idx, int value) {
    if (start == end) {
        base[idx] = value;
        segTree[node] = value;
    } else {
        int mid = (start + end) / 2;
        if (start <= idx && idx <= mid) {
            update(2 * node + 1, start, mid, idx, value);
        } else {
            update(2 * node + 2, mid + 1, end, idx, value);
        }
        segTree[node] = segTree[2 * node + 1] + segTree[2 * node + 2];
    }
}

int query(int node, int start, int end, int L, int R) {
    if (R < start || end < L) {
        return 0;
    }
    if (L <= start && end <= R) {
        return segTree[node];
    }
    int mid = (start + end) / 2;
    int leftSum = query(2 * node + 1, start, mid, L, R);
    int rightSum = query(2 * node + 2, mid + 1, end, L, R);
    return leftSum + rightSum;
}

int main() {
    cin >> n;
    base.resize(n);
    segTree.resize(4 * n);

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

    build(0, 0, n - 1);

    cin >> m;
    for (int i = 0; i < m; ++i) {
        int p;
        cin >> p;

        for (int j = 0; j < p; ++j) {
            int idx, change_to;
            cin >> idx >> change_to;
            update(0, 0, n - 1, idx, change_to);
        }

        int s, f;
        cin >> s >> f;
        cout << query(0, 0, n - 1, s, f) << "\n";
    }

    return 0;
}