Cod sursa(job #2757977)

Utilizator ptlsebiptl sebi ptlsebi Data 7 iunie 2021 20:48:34
Problema Arbori indexati binar Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>
#include <stdint.h>

void read_int32_t(FILE *__restrict stream, int32_t *__restrict nr) {
    int8_t ch;
    *nr = 0;
    while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
        *nr *= 10;
        *nr += ch - '0';
    }
    if (ch == '\r') {
        fgetc(stream);
    }
}

int32_t __inline__ lsb(int32_t x) {
    return x & -x;
}

int32_t aib[100001];

int32_t n, m;

int32_t suma(int32_t p) {
    int32_t s = 0;
    int32_t p2;
    while (p) {
        p2 = lsb(p);
        s += aib[p];
        p -= p2;
    }
    return s;
}

void actualizare(int32_t p, int32_t val) {
    int32_t p2;
    while (p <= n) {
        aib[p] += val;
        p2 = lsb(p);
        p += p2;
    }
}

int32_t search(int32_t val) {
    int32_t p = 0;
    int32_t pas = 1 << 16;
    while (pas) {
        if (p + pas <= n && suma(p + pas) < val) {
            p += pas;
        }
        pas /= 2;
    }
    if (p < n && suma(p + 1) == val) {
        return p + 1;
    }
    return -1;
}

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

    read_int32_t(in, &n);
    read_int32_t(in, &m);

    {
        int32_t i;
        int32_t x, y;
        for (i = 1; i <= n; ++i) {
            read_int32_t(in, &x);
            actualizare(i, x);
        }

        int32_t op;
        for (i = 0; i < m; ++i) {
            read_int32_t(in, &op);
            switch (op) {
                case 0:
                    read_int32_t(in, &x);
                    read_int32_t(in, &y);
                    actualizare(x, y);
                    break;
                case 1:
                    read_int32_t(in, &x);
                    read_int32_t(in, &y);
                    fprintf(out, "%i\n", suma(y) - suma(x - 1));
                    break;
                default:
                    read_int32_t(in, &x);
                    fprintf(out, "%i\n", search(x));
                    break;
            }
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}