Cod sursa(job #1146974)

Utilizator StefansebiStefan Sebastian Stefansebi Data 19 martie 2014 14:36:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int i, a, b, c, n, m, arb[100001];

int cauta(int nr){
    int i, step;
    for (step = 1; step < n; step <<= 1);
    for (i = 0; step; step >>= 1) {
         if (i + step <= n) {
            if(nr >= arb[i + step]) {
                i += step, nr -= arb[i];
                if (!nr) return i;
            }
         }
    }
    return -1;
}

void update(int poz, int nr){
    while (poz <= n){
        arb[poz] += nr;
        poz += (poz & -poz);
    }
}

int suma(int poz){
    int sol = 0;
    while (poz > 0){
        sol += arb[poz];
        poz -= (poz & -poz);
    }
    return sol;
}

int main(){
    fin >> n >> m;
    for (i = 1; i <= n; i++){
        fin >> a;
        update(i, a);
    }
    for (i = 1; i <= m; i++){
        fin >> c;
        if (c == 0){
            fin >> a >> b;
            update(a, b);
        }
        if (c == 1){
            fin >> a >> b;
            fout << suma(b) - suma(a - 1) << '\n';
        }
        if (c == 2){
            fin >> a;
            fout << cauta(a) << '\n';
        }
    }
}