Cod sursa(job #2353632)

Utilizator al3xionescuIonescu Alexandru al3xionescu Data 24 februarie 2019 14:10:56
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#define MAXN 100005
int N, M;
int AIB[MAXN];
#define Zeros(X) (X&(-X))
void Update(int X, int value) {
    for (X; X <= N; X += Zeros(X)) {
        AIB[X] += value;
    }
}
int Query(int X) {
    int Sum = 0;
    for (X; X >= 1; X -= Zeros(X)) {
        Sum += AIB[X;
    }
    return Sum;
}
int BinSearch(int Sum) {
    int lbound = 1, rbound = N, mid, v;
    while (lbound <= rbound) {
        mid = (lbound + rbound)/2;
        if ((v = Query(mid)) == Sum) return mid;
        if (v < Sum)
            lbound = mid+1;
        else
            rbound = mid-1;
    }   return -1;
}
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
void citire() {
    fin >> N >> M;
    for (int i = 1, X; i <= N; i++) {
        fin >> X, Update(i, X);
    }
}
void rezolvare() {
    int type, A, B;
    while(M--) {
        fin >> type >> A;
        if (type == 0) {
            fin >> B, Update(A, B);
        }
        else if (type == 1) {
            fin >> B, fout << Query(B) - Query(A - 1) << '\n';
        }
        else {
            fout << BinSearch(A) << '\n';
        }
    }
}
int main() {
    citire();
    rezolvare();
    return 0;
}