Cod sursa(job #3267212)

Utilizator dorucioroslanCioroslan Doru dorucioroslan Data 11 ianuarie 2025 10:24:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
using namespace std;


int n, m, c, x;
int a, b;
int pos;
int aib[100005]; // dimensiune N


void update(int i, int x) {
    for (int j=i;j<=n;j+=(j&-j)) { // j+=(j&-j) -> trecem prin numerele care il contin in suma pe elementul de pe pozitia i
        aib[j] += x;
    }
}


void create() {
    for (int i=1;i<=n;i++) {
        cin >> x;
        update(i, x);
    }
}


int query(int i) {
    int s = 0;
    for (int j=i;j>=1;j-=(j&-j)) { // j -= (j&-j) ->
        s += aib[j];
    }
    return s;
}


void solve() {
    cin >> c;
    if (c == 0) {
        cin >> a >> x;
        update(a, x);
    }
    else if (c == 1) {
        cin >> a >> b;
        cout << query(b) - query(a-1) << '\n';
    }
   else if(c == 2){
            // cerinta 2
            scanf("%d", &x);

            // un fel de cautare binara pana la ce iti trebe

            bool ok=true;
            int st=1, dr=n;
            while (st<=dr){
                int mij=(st+dr)/2, q=query(mij);
                if (q==x){
                    cout<<mij<<endl;
                    ok=false;
                    break;
                } else if (x<q){
                    dr=mij-1;
                } else {
                    st=mij+1;
                }
            }
            if (ok){
                cout<<"-1\n";
            }
        }

}


int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    cin >> n >> m;
    create();
    for(;m;m--) {
        solve();
    }
    return 0;
}