Cod sursa(job #1757394)

Utilizator preda.andreiPreda Andrei preda.andrei Data 14 septembrie 2016 22:32:04
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>

#define NMAX 100001
#define putereZerouri(x) ((x ^ (x - 1)) & x)

int aib[NMAX];

int aflaPozitie(int suma, int n);
int aflaSuma(int poz);
void modifica(int poz, int val, int n);

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

    int n, m;
    fscanf(fin, "%d%d", &n, &m);

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

    while (m--) {
        int r, x;
        fscanf(fin, "%d%d", &r, &x);

        if (r == 2) {
            fprintf(fout, "%d\n", aflaPozitie(x, n));
        }
        else {
            int y;
            fscanf(fin, "%d", &y);
            if (r == 0)
                modifica(x, y, n);
            else fprintf(fout, "%d\n", aflaSuma(y) - aflaSuma(x - 1));
        }
    }

    return 0;
}

int aflaPozitie(int suma, int n)
{
    int st = 1, dr = n;

    while (st <= dr) {
        int mij = st + (dr - st) / 2;
        int s = aflaSuma(mij);

        if (s == suma)
            return mij;
        else if (s < suma)
            st = mij + 1;
        else dr = mij - 1;
    }

    return -1;
}

int aflaSuma(int poz)
{
    int suma = 0;

    while (poz != 0) {
        suma += aib[poz];
        poz -= putereZerouri(poz);
    }

    return suma;
}

void modifica(int poz, int val, int n)
{
    while (poz <= n) {
        aib[poz] += val;
        poz += putereZerouri(poz);
    }
}