Cod sursa(job #2753357)

Utilizator truscalucaLuca Trusca truscaluca Data 22 mai 2021 16:31:49
Problema Order Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>

using namespace std;

int v[33000], val, indexVal, intervalSt, intervalDr;

void actualizeaza(int pozNod, int indexSt, int indexDr) {
    if (indexSt == indexDr) {
        // Actualizare prin "delta", ca sa poata fi alterat numarul, nu decat inlocuit direct
        v[pozNod] += val;
        return;
    }

    int indexMijloc = (indexSt + indexDr) / 2;
    if (indexVal <= indexMijloc) {
        actualizeaza(2 * pozNod, indexSt, indexMijloc);
    } else {
        actualizeaza(2 * pozNod + 1, indexMijloc + 1, indexDr);
    }
    v[pozNod] = v[2 * pozNod] + v[2 * pozNod + 1];
}

int interogheaza(int pozNod, int indexSt, int indexDr) {
    if (intervalSt <= indexSt && indexDr <= intervalDr) {
        return v[pozNod];
    }

    int indexMijloc = (indexSt + indexDr) / 2, val1 = 0, val2 = 0;
    if (intervalSt <= indexMijloc) {
        val1 = interogheaza(2 * pozNod, indexSt, indexMijloc);
    }
    if (intervalDr > indexMijloc) {
        val2 = interogheaza(2 * pozNod + 1, indexMijloc + 1, indexDr);
    }

    return val1 + val2;
}

int main() {
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    // Input rapid (daca nu pun asta, iau 0p in loc de 100p :( )
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    for (indexVal = 1; indexVal <= n; indexVal++) {
        cin >> val;
        actualizeaza(1, 1, n);
    }

    int c;
    for (int i = 0; i < m; i++) {
        cin >> c;
        if (c == 0) {
            cin >> indexVal >> val;

            // Actualizarea se face prin +=, deci daca vrem sa scadem (cum cere in enunt), trebuie dat ca argument
            // un numar negativ.
            val = -val;

            actualizeaza(1, 1, n);
        } else if (c == 1) {
            cin >> intervalSt >> intervalDr;
            cout << interogheaza(1, 1, n) << "\n";
        }
    }

    return 0;
}