Cod sursa(job #764169)

Utilizator igsifvevc avb igsi Data 4 iulie 2012 12:30:04
Problema Arbori indexati binar Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>

unsigned int bit[100001];
int n;

int nextIndex(int index)
{
    unsigned int i;
    for(i = 0; !((1 << i) & index); i++);
    return (1 << i);
}

void add(int index, unsigned int value)
{
    while(index <= n)
    {
        bit[index] += value;
        index += nextIndex(index);
    }
}

unsigned int querry(int l, int r)
{
    unsigned int valueL = 0, valueR = 0;
    l = l - 1;
    
    while(r > 0)
    {
        valueR += bit[r];
        r -= nextIndex(r);
    }
    while(l > 0)
    {
        valueL += bit[l];
        l -= nextIndex(l);
    }

    return valueR - valueL;
}

int find(unsigned int value)
{
    int l = 1, r = n, middle;
    unsigned int sum;
    while(l <= r)
    {
        middle = (r - l) / 2 + l;
        sum = querry(1, middle);   
        if(sum == value)
            return middle;
        if(sum < value)
            l = middle + 1;
        else
            r = middle - 1;
    }
    return -1;
}

int main()
{
    FILE *in = fopen("aib.in", "r");
    FILE *out = fopen("aib.out", "w");
    unsigned int m, a, b;
    int op, i, j;

    fscanf(in, "%d %d", &n, &m);
    for(i = 1; i <= n; i++)
    {
        fscanf(in, "%d", &a);
        add(i, a);
	}
	
    for(; m; m--)
    {
        fscanf(in, "%d", &op);
        switch(op)
        {
            case 0:
                fscanf(in, "%d %d", &i, &b);
                add(i, b);
                break;
            case 1:
                fscanf(in, "%d %d", &i, &j);
                fprintf(out, "%d\n", querry(i, j));
                break;
            default:
                fscanf(in, "%d", &a);
                fprintf(out, "%d\n", find(a));
        }
    }

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