Cod sursa(job #1074970)

Utilizator IonSebastianIon Sebastian IonSebastian Data 8 ianuarie 2014 11:49:47
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

using namespace std;

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

const int N = 100000, M = 150000;
int aib[N], v[N], n, step = 1<<16;

int query0 (int p){
    int s = 0;
    while(p != 0){
        s += aib[p];
        p -= p & (-p);
    }
    return s;
}

int query2(int k, int val){
    while(step != 0){
        if(k+step <= n && aib[k+step] <= val){
            val -= aib[k+step];
            k += step;
        }
        step /= 2;
    }
    if(val == 0){
        return k;
    }
    return -1;
}

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

int main()
{
    int  m, i, x, a, b, type;
    in >> n >> m;
    for(i = 1; i <= n; i++){
        in >> v[i];
        update(i, v[i]);
    }
    for(i = 1; i <= m; i++){
        in >> type;
        if(type == 0){
            in >> a >> b;
            update (a, b);
        } else {
            if(type == 1){
                in >> a >> b;
                out << query0(b) - query0(a-1) << "\n";
            } else {
                in >> a;
                step = 1<<16;
                out << query2(0,a) << "\n";
            }
        }
    }
    return 0;
}