Cod sursa(job #3352138)

Utilizator gugalcromMuntoiu Vlad-Ioan gugalcrom Data 24 aprilie 2026 11:55:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

inline int inceput(int sfarsit) {
    return sfarsit - ((sfarsit) & (-sfarsit)) + 1;
}

struct Aib {
    vector<int> aib;
    Aib(int N) : aib(N+1) {}
    void actualizare(int i, int x) {
        while(i < aib.size()) {
            aib[i] += x;
            i += i & (-i);
        }
    }
    int interogare(int i) {
        int val = 0;
        while(i >= 1) {
            val += aib[i];
            i -= i & (-i);
        }
        return val;
    }
};

int main() {
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    int N, M;
    fin >> N >> M;
    Aib aib(N);
    for(int i=1; i<=N; ++i) {
        int x;
        fin >> x;
        aib.actualizare(i, x);
    }
    for(int j=0; j<M; ++j) {
        int op;
        fin >> op;
        if(op == 0) {
            int i, x;
            fin >> i >> x;
            aib.actualizare(i, x);
        } else if(op == 1) {
            int a, b;
            fin >> a >> b;
            fout << aib.interogare(b) - aib.interogare(a-1) << '\n';
        } else if(op == 2) {
            int x;
            fin >> x;
            int st = 1, dr = N;
            while(st < dr) {
                int m = (st + dr) / 2;
                int suma = aib.interogare(m);
                if(suma < x) {
                    st = m+1;
                } else {
                    dr = m;
                }
            }
            if(aib.interogare(st) == x) {
                fout << st << '\n';
            } else {
                fout << -1 << '\n';
            }
        }
    }
    return 0;
}