Cod sursa(job #2904092)

Utilizator fredtuxFlorin Dinu fredtux Data 17 mai 2022 22:13:51
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>

using namespace std;

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

int arb[500004];

inline unsigned int
arbQry(int n, int st, int dr, int x, int y) {
    int st2, dr2, mid;
    dr2 = st2 = 0;

    if (st >= x && dr <= y)
        return arb[n];

//    mid = st + (dr - st) / 2;
    mid = (st + dr) >> 1;

    if (x <= mid) {
        st2 = arbQry((n << 1), st, mid, x, y);
    }

    if (y > mid) {
        dr2 = arbQry(-(~(n << 1)), mid + 1, dr, x, y);
    }

    return st2 + dr2;
}

inline void arbUpd(int n, int st, int dr, int p, int val, bool build) {
    if (st == dr) {
        arb[n] = (build ? val : (arb[n] - val));
        return;
    }

//    int mid = st + (dr - st) / 2;
    int mid = (st + dr) >> 1;
    if (p <= mid) {
        arbUpd((n << 1), st, mid, p, val, build);
    } else {
        arbUpd(-(~(n << 1)), mid + 1, dr, p, val, build);
    }

    arb[n] = arb[(n << 1)] + arb[-(~(n << 1))];
}

int main() {
    int n, m, i, x, y, aleg;

    fin >> n >> m;

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

    for (i = 0; i < m; ++i) {
        fin >> aleg;

        if (aleg == 1) {
            fin >> x >> y;
            fout << arbQry(1, 1, n, x, y) << '\n';
        } else {
            fin >> x >> y;
            arbUpd(1, 1, n, x, y, false);
        }
    }

    return 0;
}