Cod sursa(job #3267055)

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

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

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];
}

int query(int nod, int st, int dr) {
    if (b < st || a > dr) {
        return 0;
    }
    if (a <= st && dr <= b) {
        return aint[nod];
    }
    int mij = (st + dr) / 2;
    return 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;
            cout << query(1, 1, n) << '\n';
        }
        else {
            cin >> x;
            int st = 1, dr = n;
            while (st != dr) {
                int mij = (st + dr) / 2;
                a = 1; b = mij;
                if (query(1, 1, n) >= x) {
                    dr = mij;
                }
                else {
                    st = mij + 1;
                }
            }
            a = 1; b = st;
            if (query(1, 1, n) == x) {
                cout << st << '\n';
            }
            else cout << -1 << '\n';
        }
    }
    return 0;

}