Cod sursa(job #2916148)

Utilizator vlad_lupuletiLupuleti Vlad Calin vlad_lupuleti Data 28 iulie 2022 11:35:18
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

int datorii[1000001];
int nrElemente, nrOperatii, operatie, element, stanga, dreapta, V, T, A;

int suma(int nod, int stanga, int dreapta, int T, int V) {
    if (V < stanga or T > dreapta)
        return 0;
    if (T <= stanga and dreapta <= V) {
        return datorii[nod];
    }
    return suma(nod * 2, stanga, (stanga + dreapta) / 2, T, V) + suma(nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta, T, V);
}

void achitare(int nod, int stanga, int dreapta, int T, int V) {
    if (T < stanga || dreapta < T)
        return;
    if (stanga == dreapta) {
        datorii[nod] += V;
        return;
    }
    if (T <= (stanga + dreapta) / 2)
        achitare(nod * 2, stanga, (stanga + dreapta) / 2, T, V);
    else
        achitare(nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta, T, V);
    datorii[nod] = datorii[nod * 2] + datorii[nod * 2 + 1];
}

int main() {
    in >> nrElemente >> nrOperatii;
    for (int i = 1; i <= nrElemente; i++) {
        in >> A;
        achitare(1, 1, nrElemente, i, A);
    }

    for (int i = 1; i <= nrOperatii; i++) {
        in >> operatie >> T >> V;
        if(operatie)
            out << suma(1, 1, nrElemente, T, V) << "\n";
        else
            achitare(1, 1, nrElemente, T, -V);
    }
}