Cod sursa(job #2339893)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 9 februarie 2019 15:13:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

#define MAXN 100005

using namespace std;

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

int aib[MAXN], N;

inline void Update(int poz, int val) {
    for (int j = poz; j <= N; j += j & (-j)) {
        aib[j] += val;
    }
}

inline int Query(int a) {
    int sum = 0;
    for (int poz = a; poz; poz -= poz & (-poz)) {
        sum += aib[poz];
    }
    return sum;
}

inline int binarySearch(int val) {
    int step, ii;
    for (step = 1; step <= N; step <<= 1);

    for (ii = 0; step; step >>= 1) {
        if (ii + step <= N) {
            if (Query(ii + step) < val)
                ii += step;
        }
    }
    return ii + 1;
}

inline void Read() {
    int M, x;

    fin >> N >> M;

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

        Update(i, x);
    }

    int poz, a, b, tip;

    while (M--) {
        fin >> tip;

        if (tip == 0) {
            fin >> a >> b;
            Update(a, b);
        }
        else if (tip == 1) {
            fin >> a >> b;
            fout << Query(b) - Query(a - 1) << "\n";
        }
        else {
            fin >> a;
            poz = binarySearch(a);
            if (Query(poz) != a)
                fout << -1 << "\n";
            else
                fout << poz << "\n";
        }
    }
}

int main () {
    Read();

    fin.close(); fout.close(); return 0;
}