Cod sursa(job #2147785)

Utilizator CozehNita Horia Teodor Cozeh Data 28 februarie 2018 23:33:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
using namespace std;

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

int n;
const int nmax = 1e5;

int aib[nmax+10];

int sum(int index){
    int suma = 0;
    while(index){
        suma += aib[index];
        index -= (index & (-index));
    }
    return suma;
}

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

int getNumber(int value){
    int i,step;

    for(step = 1; step < n; step <<= 1);

    for(i = 0; step; step >>= 1){
        if(i+step <= n){
            if(value >= aib[i+step]){
                i += step;
                value -= aib[i];
                if(value == 0) return i;
            }
        }
    }
    return -1;

}

int main(){

    int i,nr,m,p,x,y;
    fin>>n>>m;
    for(i = 1; i <= n; i++){
        fin>>nr;
        update(i,nr);
    }

    for(i = 1; i <= m; i++){
        fin>>p;
        if(p == 0){
            fin>>x>>y;
            update(x,y);
        }
        else if(p == 1){
            fin>>x>>y;
            fout<<sum(y) - sum(x-1)<<"\n";
        }
        else{
            fin>>nr;
            fout<<getNumber(nr)<<"\n";
        }
    }

}