Cod sursa(job #2753811)

Utilizator davidbejenariu2David Bejenariu davidbejenariu2 Data 24 mai 2021 14:59:23
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

const int N = 100001;
int n;
int tree[4 * N];

void update(int type, int node, int left, int right, int pos, int val) {
    if (left == right) {
        if (type == 1) {
            tree[node] = val;
        } else {
            tree[node] -= val;
        }

        return;
    }

    int mid = left + (right - left) / 2;

    if (pos <= mid) {
        update(type, node * 2, left, mid, pos, val);
    } else {
        update(type, node * 2 + 1, mid + 1, right, pos, val);
    }

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

int query(int node, int left, int right, int L, int R) {
    if (L <= left && right <= R) {
        return tree[node];
    }

    int mid = left + (right - left) / 2;
    int sum = 0;

    if (L <= mid) {
        sum += query(node * 2, left, mid, L, R);
    }

    if (mid < R) {
        sum += query(node * 2 + 1, mid + 1, right, L, R);
    }

    return sum;
}

int main() {
    int m, op, x, y;

    fin >> n >> m;

    for (int i = 1; i <= n; ++i) {
        fin >> x;
        update(1, 1, 1, n, i, x);
    }

    for (int i = 1; i <= m; ++i) {
        fin >> op >> x >> y;

        if (op == 0) {
            update(2, 1, 1, n, x, y);
        } else {
            fout << query(1, 1, n, x, y) << '\n';
        }
    }

    return 0;
}