Cod sursa(job #1311467)

Utilizator abel1090Abel Putovits abel1090 Data 8 ianuarie 2015 11:35:34
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
///AIB HOME 07.01
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

void update(vector<int>& t, int val, int i) {
    while(i < t.size()) {
        t[i] += val;
        i += (i & -i);
    }
}

int read(vector<int>& t, int i) {
    int s = 0;
    while(i>0) {
        s += t[i];
        i -= (i & -i);
    }
    return s;
}

int searchTree(vector<int>& t, int val) {
    int i = 0, step = 1;
    while(step < t.size() - 1) {
        step *= 2;
    }
    while(step) {
        if(i + step <= t.size() - 1) {///!!!
            if(val >= t[i + step]) {
                i += step;
                val -= t[i];
                if(val == 0) return i;
            }
        }
        step >>= 1;
    }
    return -1;
}

int main() {
    ifstream inStr("aib.in");
    ofstream outStr("aib.out");

    int N, M;
    inStr >> N >> M;

    vector<int> a(N+1);
    vector<int> t(N+1, 0);

    for(int i=1; i<=N; ++i) {
        inStr >> a[i];
        update(t, a[i], i);
    }

    int task;
    for(int i=0; i<M; ++i) {
        inStr >> task;
        switch(task) {
        case 0:
            int x, y;
            inStr >> x >> y;
            a[x] += y;
            update(t, y, x);
            break;
        case 1:
            int k, l, cx, cy;
            inStr >> k >> l;
            cy = read(t, l);
            cx = read(t, k-1);
            outStr << cy - cx << '\n';
            break;
        case 2:
            int m;
            inStr >> m;
            outStr << searchTree(t, m) << '\n';
            break;
        }
    }

    return 0;
}