Cod sursa(job #764952)

Utilizator igsifvevc avb igsi Data 6 iulie 2012 19:14:40
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>

int BIT[100001], N, M;
FILE *in, *out;

void add(int index, int value);
int sum(int l, int r);
int findPos(int s);

int main()
{
    int op, a, b;

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

    fscanf(in, "%d %d", &N, &M);
    for(a = 1; a <= N; a++)
        fscanf(in, "%d", &b),
        add(a, b);

    for(; M; --M)
    {
        fscanf(in, "%d", &op);
        switch(op)
        {
            case 0:
                fscanf(in, "%d %d", &a, &b);
                add(a, b);
                break;
            case 1:
                fscanf(in, "%d %d", &a, &b);
                fprintf(out, "%d\n", sum(a, b));
                break;
            default:
                fscanf(in, "%d", &a);
                fprintf(out, "%d\n", findPos(a));
        }
    }

    fclose(in);
    fclose(out);
    return 0;
}

void add(int index, int value)
{
    while(index <= N)
    {
        BIT[index] += value;
        index += index ^ (index - 1) & index;
    }
}

int sum(int l, int r)
{
    int s1 = 0, s2 = 0, index;

    index = l - 1;
    while(index)
    {
        s1 += BIT[index];
        index -= index ^ (index - 1) & index;
    }
    
    index = r;
    while(index)
    {
        s2 += BIT[index];
        index -= index ^ (index - 1) & index;
    }

    return s2 - s1;
}

int findPos(int s)
{
    int index, i;

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

    for(i = 0; index; index >>= 1)
        if(i + index <= N && BIT[i + index] <= s)
        {    
            i += index;
            s -= BIT[i];
            if(!s) return i;
        }
    return -1;
}