Cod sursa(job #2629197)

Utilizator RobertLearnsCDragomir Robert. RobertLearnsC Data 19 iunie 2020 14:45:08
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;
#define NMAX 15005
#define middle (left + right) / 2

int tree[NMAX * 5], v[NMAX], n, m;

void constructor(int pos, int left, int right) {
    if(left == right) {
        tree[pos] = v[left];
    } else {
        constructor(2 * pos, left, middle);
        constructor(2 * pos + 1, middle + 1, right);
        tree[pos] = tree[2 * pos] + tree[2 * pos + 1];
    }
}

void update(int pos, int left, int right, int loc, int val) {
    if(left == right) {
        tree[pos] = val;
    } else {
        if(loc <= middle) {
            update(pos * 2, left, middle, loc, val);
        } else {
            update(pos * 2 + 1, middle + 1, right, loc, val);
        }
        tree[pos] = tree[2 * pos] + tree[2 * pos + 1];
    }
}

int query(int pos, int left, int right, int leftInt, int rightInt) {
    int ans = 0;
    if(leftInt <= left && right <= rightInt) {
        return tree[pos];
    }
    if(leftInt <= middle) {
        ans += query(pos * 2, left, middle, leftInt, rightInt);
    }
    if(rightInt - 1 >= middle) {
        ans += query(pos * 2 + 1, middle + 1, right, leftInt, rightInt);
    }
    return ans;
}

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

    scanf("%d%d", &n, &m);

    for(int i = 1; i <= n; i++) {
        scanf("%d", &v[i]);
    }
    constructor(1, 1, n);
    for(int i = 1; i <= m; i++) {
        int ty, x, y;
        scanf("%d%d%d", &ty, &x, &y);
        if(!ty) {
            v[x] -= y;
            update(1, 1, n, x, v[x]);
        } else {
            printf("%d\n", query(1, 1, n, x, y));
        }
    }
    return 0;
}