Cod sursa(job #2352821)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 23 februarie 2019 18:03:46
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 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 In ("aib.in");
std::ofstream Out("aib.out");

void Citire() {
    In >> N >> M;
    for (int i=1, X; i<=N; ++i)
        In >> X, Update(i, X);
}

void Rezolvare() {
    int type, A, B;
    while (M--) {
        In >> type >> A;
        if (type == 0)
            In >> B, Update(A, B);
        else if (type == 1)
            In >> B, Out << Query(B) - Query(A-1) << '\n';
        else
            Out << BinSearch(A) << '\n';
    }
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}