Cod sursa(job #2566119)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 2 martie 2020 18:56:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

#define MAXN    100005

#define FILENAME    std::string("aib")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");

int N, M;
int AIB[MAXN];
#define NEXT(pos) pos&(-pos)
void update(int pos, int val) {
    for (; pos<=N; pos += NEXT(pos))
        AIB[pos] += val;
}
int query(int pos) {
    if (pos == 0) return 0;
    int sum = 0;
    for (; pos >0; pos -= NEXT(pos))
        sum += AIB[pos];
    return sum;
}
int query(int a, int b) { return query(b) - query(a-1); }

void binquery(int sum) {
    int left = 1, right = N, mid, ans = -1;
    while (left <= right) {
        mid = (left+right)/2;
        int v = query(mid);

        if (v == sum) ans = mid;
        if (query(mid) >= sum) right = mid-1;
        else                   left  = mid+1;
    }   output << ans << '\n';
}

int main()
{
    input >> N >> M;
    for (int i=1, x; i<=N; ++i) input >> x, update(i, x);
    for (int i=1, t, a, b; i<=M; ++i) {
        input >> t;
        if (t == 0)      input >> a >> b, update(a, b);
        else if (t == 1) input >> a >> b, output << query(a, b) << '\n';
        else             input >> a, binquery(a);
    }

    return 0;
}