Cod sursa(job #1612105)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 24 februarie 2016 18:25:34
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
 
int marime_interval(const int n){
    return (n+1)&(-n-1);
}
 
class aib{
    int n;
    vector<int> buf;
public:
    aib(const int N): n(1<<(int)ceil(log2(N))), buf(n){}
    void update(int p, const int v){
        for( ; p < n; p += marime_interval(p)){
            buf[p] += v;
        }
    }
    int query(int p){
        int rez = 0;
        for( ; p >= 0; p -= marime_interval(p)){
            rez += buf[p];
        }
        return rez;
    }
    int search(const int k){
 
        if(buf.back() < k){
            return -2;
        }
 
        int poz = n-1, suma_st = 0;
        for( ; marime_interval(poz) > 1; ){
            if(suma_st + buf[poz] > k){
                poz -= marime_interval(poz)/2;
            }
            else if(suma_st + buf[poz] == k){
                return poz;
            }
            else{
                suma_st += buf[poz];
                poz += marime_interval(poz)/2;
            }
        }
        if(suma_st + buf[poz] == k){
            return poz;
        }
        return -2;
    }
};
 
int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    int n, m;
    f >> n >> m;
 
    aib ai(n);
    for(int i = 0, x; i < n; ++i){
        f >> x;
        ai.update(i, x);
    }
    for(int 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 << min(ai.search(a)+1, n) << '\n';
        }
    }
    return 0;
}