Cod sursa(job #3267056)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 11 ianuarie 2025 08:43:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
using namespace std;

int aint[400005];
int n, m;
int p, x, a, b, c;
int res;

void create(int nod, int st, int dr) {
    if (st == dr) {
        cin >> aint[nod];
        return;
    }
    int mij = (st + dr) / 2;
    create(2*nod, st, mij);
    create(2*nod+1, mij+1, dr);
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}

void update(int nod, int st, int dr) {
    if (p < st || p > dr) {
        return;
    }
    if (st == dr) {
        aint[nod] += x;
        return;
    }
    int mij = (st + dr) / 2;
    update(2*nod, st, mij);
    update(2*nod+1, mij+1, dr);
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}

void query(int nod, int st, int dr) {
    if (b < st || a > dr) {
        return;
    }
    if (a <= st && dr <= b) {
        res += aint[nod];
        return;
    }
    int mij = (st + dr) / 2;
    query(2*nod, st, mij);
    query(2*nod+1, mij+1, dr);
}

int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    cin >> n >> m;
    create(1, 1, n);
    for (;m;m--) {
        cin >> c;
        if (c == 0) {
            cin >> p >> x;
            update(1, 1, n);
        }
        else if (c == 1) {
            cin >> a >> b;
            res = 0;
            query(1, 1, n);
            cout << res << '\n';
        }
        else {
            cin >> x;
            int st = 1, dr = n;
            while (st != dr) {
                int mij = (st + dr) / 2;
                a = 1; b = mij; res = 0;
                query(1, 1, n);
                if (res >= x) {
                    dr = mij;
                }
                else {
                    st = mij + 1;
                }
            }
            a = 1; b = st; res = 0;
            query(1, 1, n);
            if (res == x) {
                cout << st << '\n';
            }
            else cout << -1 << '\n';
        }
    }
    return 0;

}