Cod sursa(job #2152314)

Utilizator CammieCamelia Lazar Cammie Data 5 martie 2018 13:49:33
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>

#define MAXN 100005

using namespace std;

FILE *fin, *fout;

int aib[MAXN * 4], N;

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

inline int Query(int a, int b) {
    int sol = 0;
    for (int i = b; i; i -= i & (-i))
        sol += aib[i];
    for (int i = a - 1; i; i-= i & (-i))
        sol -= aib[i];
    return sol;
}

inline int binarySearch(int a) {
    int ii, step, aux, poz = MAXN + 10;

    for (step = 1; step <= N; step <<= 1);

    for (ii = 0; step; step >>= 1) {
        if (ii + step <= N) {
            aux = Query(1, step + ii);

            if (aux < a)
                step += ii;
            else if (aux == a) {
                if (poz > ii + step)
                    poz = ii + step;
            }
        }
    }

    if (poz == MAXN + 10)
        poz = -1;

    return poz;
}

inline void Read() {
    int M, tip, a, b, x;

    fscanf(fin, "%d %d", &N, &M);

    for (int i = 1; i <= N; i++) {
        fscanf(fin, "%d", &x);

        Update(i, x);
    }

    while (M--) {
        fscanf(fin, "%d", &tip);

        if (tip == 0) {
            fscanf(fin, "%d %d", &a, &b);

            Update(a, b);
        }
        else if (tip == 1) {
            fscanf(fin, "%d %d", &a, &b);

            fprintf(fout, "%d\n", Query(a, b));
        }
        else {
            fscanf(fin, "%d", &a);

            fprintf(fout, "%d\n", binarySearch(a));
        }
    }
}

int main () {
    fin = fopen("aib.in", "r");
    fout = fopen("aib.out", "w");

    Read();

    fclose(fin); fclose(fout); return 0;
}