Cod sursa(job #3134277)

Utilizator Alex_Cristea72Cristea Alexandru Alex_Cristea72 Data 28 mai 2023 20:35:34
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f1("../datorii.in");
ofstream f2("../datorii.out");

const int MAX_N = 15000;
vector<int> valori(MAX_N + 1);
vector<int> arbore(4 * MAX_N);

void creeaza(int nod, int start, int final) {
    if (start == final) {
        arbore[nod] = valori[start];
        return;
    }

    int mid = (start + final) / 2;
    creeaza(2 * nod, start, mid);
    creeaza(2 * nod + 1, mid + 1, final);

    arbore[nod] = arbore[2 * nod] + arbore[2 * nod + 1];
}

void update(int nod, int start, int final, int idx, int valoare) {
    if (start == final) {
        valori[idx] += valoare;
        arbore[nod] += valoare;
        return;
    }

    int mid = (start + final) / 2;
    if (idx <= mid)
        update(2 * nod, start, mid, idx, valoare);
    else
        update(2 * nod + 1, mid + 1, final, idx, valoare);

    arbore[nod] = arbore[2 * nod] + arbore[2 * nod + 1];
}

int interog(int node, int start, int final, int stanga, int dreapta) {
    if (start > dreapta || final < stanga)
        return 0;

    if (start >= stanga && final <= dreapta)
        return arbore[node];

    int mid = (start + final) / 2;
    int suma_stanga = interog(2 * node, start, mid, stanga, dreapta);
    int suma_dreapta = interog(2 * node + 1, mid + 1, final, stanga, dreapta);

    return suma_stanga + suma_dreapta;
}

int main() {
    int N, M;
    f1 >> N >> M;

    for (int i = 1; i <= N; i++) {
        f1 >> valori[i];
    }

    creeaza(1, 1, N);

    for (int i = 1; i <= M; i++) {
        int op, x, y;
        f1 >> op >> x >> y;

        if (op == 0) {
            update(1, 1, N, x, -y);
        } else {
            int sum = interog(1, 1, N, x, y);
            f2 << sum << "\n";
        }
    }

    f1.close();
    f2.close();

    return 0;
}