Cod sursa(job #2144102)

Utilizator LittleWhoFeraru Mihail LittleWho Data 26 februarie 2018 15:36:15
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

int n, m;
int tree[15001 * 4 + 66];
int val, pos;

void update(int node, int l, int r) {
    if (l == r) {
        tree[node] += val;
        return ;
    }

    int m = (l + r) / 2;
    if (pos <= m) {
        update(node * 2, l, m);
    } else {
        update(node * 2 + 1, m + 1, r);
    }

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

int tl, tr, s;
void query(int node, int l, int r) {
    if (tl <= l && r <= tr) {
        s += tree[node];
        return ;
    }

    int m = (l + r) / 2;
    if (tl <= m) {
        query(node * 2, l, m);
    }
    if (tr > m) {
        query(node * 2 + 1, m + 1, r);
    }
}

int main() {
    freopen("carici.in", "r", stdin);

    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    scanf("%d%d", &n, &m);
    for (int i = 1, x; i <= n; i++) {
        scanf("%d", &x);
        val = x;
        pos = i;
        update(1, 1, n);
    }

    for (int i = 1, t, x, y; i <= m; i++) {
        scanf("%d%d%d", &t, &x, &y);
        if (t == 0) {
            pos = x;
            val = -y;
            update(1, 1, n);
        } else {
            tl = x;
            tr = y;
            s = 0;
            query(1, 1, n);
            cout << s << "\n";
        }
    }

    return 0;
}