Cod sursa(job #1163648)

Utilizator SRaduRadu Szasz SRadu Data 1 aprilie 2014 15:36:51
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
#include<iostream>

using namespace std;

const int MAX = 100010;

int N, M;
int AIB[MAX];

void OpenFiles() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
}

void CloseFiles() {
    fclose(stdin);
    fclose(stdout);
}

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

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

int main() {
    OpenFiles();
    cin >> N >> M;
    for(int i = 1, A; i <= N; i++) {
        cin >> A;
        Update(i, A);
    }
    int step = 1;
    for(step = 1; step <= N; step <<= 1);
    step >>= 1;
    for(int i = 1, op, A, B; i <= M; i++) {
        cin >> op;
        switch(op) {
        case 0:
            cin >> A >> B;
            Update(A, B);
            break;
        case 1:
            cin >> A >> B;
            cout << Query(B) - Query(A - 1) << "\n";
            break;
        case 2:
            int Ans = 0, X = 0, target;
            cin >> target;
            for(int i = step; i; i >>= 1) {
                if(i + Ans > N) continue;
                if(X + AIB[Ans + i] <= target) {
                    Ans += i;
                    X += AIB[Ans];
                }
            }
            if(X == target) 
                cout << Ans << "\n";
            else
                cout << "-1\n";
            break;
        }
    }
    CloseFiles();
}