Cod sursa(job #1938937)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 25 martie 2017 12:38:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>

FILE *re, *we;

const int SIZ = (1 << 17);

int v[SIZ], n;

void update(int poz, int cat)
{
    while(poz <= n) {
        v[poz] += cat;
        poz += (poz & (-poz));
    }
}

int query(int a)
{
    int toto = 0;
    int put = SIZ;
    int poz = 0;
    while(put > 0 && a > 0) {
        if(put <= a) {
            poz += put;
            toto += v[poz];
            a = a - put;
        }
        put = (put >> 1);
    }

    return toto;
}

int caut(int a)
{
    int sum = 0;
    int put = SIZ;
    int poz = 0;
    while(put > 0 && sum <= a && poz <= n) {
        if(poz + put <= n && sum + v[poz + put] <= a) {
            sum += v[poz + put];
            poz += put;
        }
        put = (put >> 1);
    }
    if(sum == a && poz != 0) {
        return poz;
    } else {
        return -1;
    }
}

int main ()
{

    re = fopen("aib.in", "r");
    we = fopen("aib.out", "w");

    int m;

    fscanf(re, "%d %d", &n, &m);

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

    int t, a, b;
    for(int i = 0; i < m; i++) {
        //printf("OK");
        fscanf(re, "%d%d", &t, &a);

        if(t == 2) {
            fprintf(we, "%d\n", caut(a));
        } else {
            fscanf(re, "%d", &b);
            if(t == 0) {
                update(a, b);
            } else {
                fprintf(we, "%d\n", query(b) - query(a - 1));
            }
        }
    }

    fclose(re);
    fclose(we);

    return 0;
}