Cod sursa(job #934607)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 30 martie 2013 20:48:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

#define MAX 100005

using namespace std;

int N, M, step, AIB[MAX];

void update(int poz, int val) {
    for(; poz <= N; poz += (poz & (-poz)))
        AIB[poz] += val;
}

int query(int poz) {
    int ans = 0;
    for(;poz; poz -= (poz & (-poz)))
        ans += AIB[poz];
    return ans;
}

int getPoz(int X) {
    int poz = 0;
    for(int st = step; st; st >>= 1)
        if(poz + st <= N && AIB[poz + st] <= X) {
            X -= AIB[poz += st];
            if(!X) return poz;
        }
    return -1;
}

int main() {
    ifstream in("aib.in"); ofstream out("aib.out");
    in>>N>>M;
    for(int i = 1, A; i <= N; i++) {
        in>>A;
        update(i, A);
    } for(step = 1; step < N; step <<= 1);
    for(int i = 1, A, B, C; i <= M; i++) {
        in>>A;
        switch(A) {
            case 0: in>>B>>C; update(B, C); break;
            case 1: in>>B>>C; out<<query(C) - query(B - 1)<<"\n"; break;
            case 2: in>>B; out<<getPoz(B)<<"\n"; break;
        }
    }
    return 0;
}