Cod sursa(job #1365518)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 28 februarie 2015 12:38:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

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

const int maxn = 100005;

int n, m, aib[maxn];

inline int lsb(int x) {
    return x & (-x);
}

inline void update(int pos, int value) {
    for(int i = pos ; i <= n ; i += lsb(i))
        aib[i] += value;
}

inline int query(int x) {
    int sum = 0;
    for(int i = x ; i > 0 ; i -= lsb(i))
        sum += aib[i];
    return sum;
}

int main() {
    fin >> n >> m;
    for(int i = 1 ; i <= n ; ++ i) {
        int x;
        fin >> x;
        update(i, x);
    }
    for(int i = 1 ; i <= m ; ++ i) {
        int op, x, y;
        fin >> op;
        if(op == 0) {
            fin >> x >> y;
            update(x, y);
        }
        else if(op == 1) {
            fin >> x >> y;
            fout << query(y) - query(x - 1) << '\n';
        }
        else {
            fin >> x;
            int st = 1, dr = n, ret = -1;
            while(st <= dr) {
                int mid = ((st + dr) >> 1);
                int aux = query(mid);
                if(aux == x)
                    ret = mid;
                if(aux >= x)
                    dr = mid - 1;
                else
                    st = mid + 1;
            }
            fout << ret << '\n';
        }
    }

}