Cod sursa(job #1461144)

Utilizator lflorin29Florin Laiu lflorin29 Data 14 iulie 2015 20:40:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
using namespace std;

int n, m, mlg, aib[100003];

inline void mlp (){
    mlg = 1;
    for (;  mlg < n ; mlg <<= 1);
}

inline int query (int x){
    int ret;
    for (ret = 0; x; x -= x & -x)
        ret += aib[x];
    return ret;
}
inline void update(int i, int val){
    for (; i <= n; i += i & -i)
       aib[i] += val;
}

inline int pos (int val){
    int step = mlg, i;
    for (i = 0; step; step >>= 1)
        if (i + step <= n && val >= aib[i + step]){
           i += step, val -= aib[i];
           if (!val) return i;
        }
    return -1;
}

int main(){
    ifstream cin ("aib.in");
    ofstream cout ("aib.out");
    cin >> n >> m;
    for (int i = 1 ; i <= n;  i++){
        int x;
        cin >> x, update(i, x);
    }
    mlp();
    for (int i = 1; i <= m; i++){
            int t, x,  y;
            cin >> t >> x;
            if (t == 0){
                    cin >> y;
                    update(x , y);
            }
            if (t == 1){
                    cin >> y;
                    cout << query(y) - query(x - 1) << "\n";
            }
            if (t == 2)
                cout << pos(x) << "\n";
    }
    return 0;
}