Cod sursa(job #1976955)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 4 mai 2017 17:19:20
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100002

ifstream fin("aib.in");
ofstream fout("aib.out");

inline int LSB(const int x) {

    return x & (-x);
}

int AIB[NMAX];

inline void addVal(const int N, const int poz, const int val) {

    for (int i = poz; i <= N; i += LSB(i))
        AIB[i] += val;
}

inline int sum(const int poz) {

    int s = 0;

    for (int i = poz; i >= 1; i -= LSB(i))
        s += AIB[i];

    return s;
}

inline int query(const int st, const int dr) {

    return sum(dr) - sum(st - 1);
}

int cbinara(int st, int dr, int val) {

    int mid, sol = -1;

    while (st <= dr) {

        mid = (st + dr) >> 1;

        int s = sum(mid);

        if (s == val)
            sol = mid;

        if (s < val)
            st = mid + 1;
        else
            dr = mid - 1;
    }

    return sol;
}

int main() {

    int N, Q;

    fin >> N >> Q;

    int t, x, y;

    for (int i = 1; i <= N; ++i) {
        fin >> x;
        addVal(N, i, x);
    }

    while (Q--) {

        fin >> t;

        if (t == 0) {
            fin >> x >> y;
            addVal(N, x, y);
        }
        else if (t == 1) {
            fin >> x >> y;
            fout << query(x, y) << "\n";
        }
        else if (t == 2) {
            fin >> x;
            fout << cbinara(1, N, x) << "\n";
        }
    }

    return 0;
}