Cod sursa(job #1956090)

Utilizator ifrimencoAlexandru Ifrimenco ifrimenco Data 6 aprilie 2017 14:47:29
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;
int aint[50000], v[15000];
void build (int node, int st, int dr ) {
    if (st == dr) aint[node] = v[st];
    else {
        int mi = (st + dr) / 2;
        build(2 * node + 1, st, mi);
        build(2 * node + 2, mi + 1, dr);
        aint[node] = aint[2 * node + 1] + aint[2 * node + 2];
    }
}
void update (int node, int st, int dr, int x, int y) {
    if (st == dr) aint[node] -= y;
    else {
        int mi = (st + dr) / 2;
        if (x <= mi) update(2 * node + 1, st, mi, x, y);
        else update(2 * node + 2, mi + 1, dr, x, y);
        aint[node] = aint[2 * node + 1] + aint[2 * node + 2];
    }
}

int query (int node, int st, int dr, int x, int y ) {
    if (x <= st && dr <= y) return aint[node];
    else {
        int mi = (st + dr) / 2;
        int ans = 0;
        if (x <= mi) ans += query(2 * node + 1, st, mi, x, y);
        if (y > mi)  ans += query(2 * node + 2, mi + 1, dr, x, y);
        return ans;
    }
}
int main()
{
        ifstream f("datorii.in");
        ofstream g("datorii.out");
        int n, m, i;
        f >> n >> m;
        for (i = 1; i <= n; ++i)
            f >> v[i];
        build(0, 1, n);
        int b, x, y;
        for (i = 1; i <= m; ++i) {
            f >> b >> x >> y;
            if (b == 0) update(0, 1, n, x, y);
            else g << query(0, 1, n, x, y) << "\n";

        }
        return 0;

}