Cod sursa(job #1612883)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 25 februarie 2016 08:33:52
Problema Arbori indexati binar Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

typedef unsigned int ui;

ui marime_uierval(const ui n){
    return (n+1)&(-n-1);
}

class aib{
    ui n;
    vector<ui> buf;
public:
    aib(const ui N): n(1<<(ui)ceil(log2(N))), buf(n){}
    void update(ui p, const ui v){
        for( ; p < n; p += marime_uierval(p)){
            buf[p] += v;
        }
    }
    ui query(int p){
        ui rez = 0;
        for( ; p >= 0; p -= marime_uierval(p)){
            rez += buf[p];
        }
        return rez;
    }
    int search(const ui k){

        if(buf.back() < k){
            return -2;
        }

        ui poz = n-1, suma_st = 0;
        for( ; marime_uierval(poz) > 1; ){
            if(suma_st + buf[poz] > k){
                poz -= marime_uierval(poz)/2;
            }
            else if(suma_st + buf[poz] == k){
                return poz;
            }
            else{
                suma_st += buf[poz];
                poz += marime_uierval(poz)/2;
            }
        }
        if(suma_st + buf[poz] == k){
            return poz;
        }
        return -2;
    }
};

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    ui n, m;
    f >> n >> m;

    aib ai(n);
    for(ui i = 0, x; i < n; ++i){
        f >> x;
        ai.update(i, x);
    }
    for(ui i = 0, t, a, b; i < m; ++i){
        f >> t;
        if(t == 0){
            f >> a >> b;
            ai.update(a-1, b);
        }
        else if(t == 1){
            f >> a >> b;
            g << (ai.query(b-1) - ai.query(a-2)) << '\n';
        }
        else{
            f >> a;
            g << ai.search(a)+1 << '\n';
        }
    }
    return 0;
}