Cod sursa(job #3287420)

Utilizator Andrei061108Ciortea Andrei Andrei061108 Data 17 martie 2025 22:12:45
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>

using namespace std;

const int NMAX = 15005;

int n, m;
int a[NMAX];        // valorile inițiale
int AIB[NMAX];      // arborele indexat binar

// adaugă valoare 'val' la poziția 'pos' în AIB
void update(int pos, int val) {
    while (pos <= n) {
        AIB[pos] += val;
        pos += (pos & -pos);
    }
}

// calculează suma de la 1 la pos
int query(int pos) {
    int suma = 0;
    while (pos > 0) {
        suma += AIB[pos];
        pos -= (pos & -pos);
    }
    return suma;
}

// suma pe intervalul [p, q]
int sum_interval(int p, int q) {
    return query(q) - query(p - 1);
}

int main() {

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


    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;

    // citim valorile inițiale
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        update(i, a[i]);
    }

    int tip, p, q;
    for (int i = 0; i < m; ++i) {
        cin >> tip >> p >> q;

        if (tip == 0) {
            // persoana p plătește q (scădem q din a[p])
            update(p, -q);
        } else {
            // suma pe intervalul [p, q]
            cout << sum_interval(p, q) << '\n';
        }
    }

    return 0;
}