Cod sursa(job #1163675)

Utilizator SRaduRadu Szasz SRadu Data 1 aprilie 2014 15:57:36
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<fstream>

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();
    ifstream in("aib.in"); ofstream out("aib.out");
    in >> N >> M;
    for(int i = 1, A; i <= N; i++) {
        in >> 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++) {
        in >> op;
        switch(op) {
        case 0:
            in >> A >> B;
            Update(A, B);
            break;
        case 1:
            in >> A >> B;
            out << Query(B) - Query(A - 1) << "\n";
            break;
        case 2:
            int Ans = 0, X = 0, target;
            in >> target;
            for(int i = step; i; i >>= 1) {
                if(i + Ans > N) continue;
                if(X + AIB[Ans + i] < target) {
                    Ans += i;
                    X += AIB[Ans];
                }
            }
            Ans++;
            if(Ans % 2 == 0)
                X += AIB[Ans] - AIB[Ans - 1];
            else X += AIB[Ans];
            if(X == target) 
                out << Ans << "\n";
            else
                out << "-1\n";
            break;
        }
    }
    //CloseFiles();
}