Cod sursa(job #2106805)

Utilizator BaldurCronos Baldur Data 16 ianuarie 2018 11:34:24
Problema Datorii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#define N 15001
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
typedef long long ll;
ll tree[4 * N];
int n, m, v[N];

void build_tree(int node = 1, int l = 1, int r = n) {
        if (l == r) {
                tree[node] = v[l];
                return;
        }
        int m = (l + r) >> 1;
        build_tree(node << 1, l, m);
        build_tree((node << 1) | 1, m + 1, r);
        tree[node] = tree[node << 1] + tree[(node << 1) | 1];
}

void update_tree(int p, int node = 1, int l = 1, int r = n) {
        if (l == r) {
                tree[node] = v[l];
                return;
        }

        int m = (l + r) >> 1;
        if (p <= m)
                update_tree(p, node << 1, l, m);
        else
                update_tree(p, (node << 1) | 1, m + 1, r);
        tree[node] = tree[node << 1] + tree[(node << 1) | 1];
}

ll query(int ql, int qr, int node = 1, int l = 1, int r = n) {
        if (ql > r || qr < l)
                return 0;
        if (ql <= l && qr >= r)
                return tree[node];
        int m = (l + r) >> 1;
        return query(ql, qr, node << 1, l, m) + query(ql, qr, (node << 1) | 1, m + 1, r);
}

int main() {
        in >> n >> m;
        for (int i = 1; i <= n; i++)
                in >> v[i];
        build_tree();

        int x, y, z;
        for (int i = 1; i <= m; i++) {
                in >> x >> y >> z;
                if (!x) {
                        v[y] -= z;
                        update_tree(y);
                } else {
                        out << query(y, z) << "\n";
                }
        }
        return 0;
}