Cod sursa(job #2637498)

Utilizator robertrRotaru Stefan Robert robertr Data 23 iulie 2020 12:30:04
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#define m(left, right) left + (right - left) / 2;
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n, m, arb[60045], sol;

void build(int node, int left, int right) {
    if(left == right) {
        f >> arb[node];
    }
    else {
        int middle = m(left, right);
        build(2 * node, left, middle);
        build(2 * node + 1, middle + 1, right);
        arb[node] = arb[2 * node] + arb[2 * node + 1];
    }
}

void query(int node, int left, int right, int a, int b) {
    if(left == right) {
        sol += arb[node];
    }
    else {
        int middle = m(left, right);
        if(a <= middle) {
            query(2 * node, left, middle, a, b);
        }
        if(b > middle) {
            query(2 * node + 1, middle + 1, right, a, b);
        }
    }
}

void update(int node, int left, int right, int a, int b) {
    if(left == right) {
        arb[node] -= b;
    }
    else {
        int middle = m(left, right);
        if(a <= middle) {
            update(2 * node, left, middle, a, b);
        }
        if(a > middle) {
            update(2 * node + 1, middle + 1, right, a, b);
        }
        arb[node] = arb[2 * node] + arb[2 * node + 1];
    }
}
int main()
{
    f >> n >> m;
    build(1, 1, n);
    while(m--) {
        int c, x, y;
        f >> c >> x >> y;
        if(c == 1) {
            sol = 0;
            query(1, 1, n, x, y);
            g << sol << '\n';
        }
        else {
            update(1, 1, n, x, y);
        }
    }
    return 0;
}