Cod sursa(job #1029136)

Utilizator cbanu96Banu Cristian cbanu96 Data 15 noiembrie 2013 00:42:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>

#define FILEIN "aib.in"
#define FILEOUT "aib.out"
#define NMAX 100005

int N;
int tree[NMAX];

void update_tree(int pos, int value)
{
    while ( pos <= N )
    {
        tree[pos] += value;
        pos += (pos & -pos);
    }
}

int sum_tree(int pos)
{
    int sum = 0;
    while ( pos )
    {
        sum += tree[pos];
        pos -= (pos & -pos);
    }

    return sum;
}

int find_sum_tree(int sum)
{
    int pos = 1, i = 0;
    while ( pos <= N )
        pos += (pos & -pos);

    while ( pos )
    {
        if ( i + pos <= N && tree[pos+i] <= sum )
        {
            sum -= tree[pos+i];
            i += pos;
            if ( sum == 0 ) return i;
        }
        pos /= 2;
    }

    return -1;
}

int main()
{
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);
    int M, i;
    scanf("%d %d", &N, &M);
    for ( i = 1; i <= N; i++)
    {
        int x; scanf("%d", &x);
        update_tree(i, x);
    }

    for ( i = 1; i <= M; i++)
    {
        int t, x, y;
        scanf("%d", &t);
        if ( t == 2 )
        {
            scanf("%d", &x);
            printf("%d\n", find_sum_tree(x));
        }
        else
        if ( t == 1 )
        {
            scanf("%d %d", &x, &y);
            printf("%d\n", sum_tree(y) - sum_tree(x-1));
        }
        else
        if ( t == 0 )
        {
            scanf("%d %d", &x, &y);
            update_tree(x, y);
        }
    }

    return 0;
}