Cod sursa(job #3333030)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 10 ianuarie 2026 15:52:31
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int Nmax = 100005;

int n, q;
int aib[Nmax];

void actualiare_aib(int poz, int val){
    while(poz <= n){
        aib[poz] += val;
        poz += poz & (-poz);
    }
}

int interogare_aib(int poz){
    int sol = 0;

    while(poz > 0){
        sol += aib[poz];
        poz -= poz & (-poz);
    }

    return sol;
}

int interogare(int x, int y){
    return interogare_aib(y) - interogare_aib(x - 1);
}

int caut_bin(int val){
    int putere_2, poz_anterior, adunat_anterior;

    putere_2 = (1 << int(log2(n)));
    adunat_anterior = poz_anterior = 0;
    while(putere_2 > 0){
        if(poz_anterior + putere_2 <= n){
            if(adunat_anterior + aib[poz_anterior + putere_2] == val){
                return poz_anterior + putere_2;
            }
            else if(adunat_anterior + aib[poz_anterior + putere_2] < val){
                poz_anterior += putere_2;
                adunat_anterior += poz_anterior;
            }
        }
        putere_2 /= 2;
    }

    return -1;
}

void citire_sir_initial(){
    int val;

    fin >> n >> q;
    for(int i = 1; i <= n; i++){
        fin >> val;
        actualiare_aib(i, val);
    }
}

void citire_si_rezolvare_interogari(){
    int tip, poz, val, start, finish;

    for(int i = 1; i <= q; i++){
        fin >> tip;
        if(tip == 0){
            fin >> poz >> val;
            actualiare_aib(poz, val);
        }
        else if(tip == 1){
            fin >> start >> finish;
            fout << interogare(start, finish) << '\n';
        }
        else{
            fin >> val;
            fout << caut_bin(val) << '\n';
        }
    }
}

int main(){
    citire_sir_initial();
    citire_si_rezolvare_interogari();

    return 0;
}