Cod sursa(job #182256)

Utilizator tm_raduToma Radu tm_radu Data 20 aprilie 2008 16:28:21
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#define NM 100001

int n, m, a[NM], c[NM];
int i, j, k, pos, o;

void Update(int pos, int val);
int Query(int pos);
int Search(int val);

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for ( i = 1; i <= n; i++ )
        scanf("%d", &a[i]), Update(i, a[i]);
        
    for ( k = 1; k <= m; k++ )
    {
        scanf("%d", &o);
        if ( o == 0 ) scanf("%d %d", &i, &j), Update(i, j);
        if ( o == 1 ) scanf("%d %d", &i, &j), printf("%d\n", Query(j) - Query(i-1));
        if ( o == 2 ) scanf("%d", &i), printf("%d\n", Search(i));
    }
    
    return 0;
}

void Update(int pos, int val)
{
    if ( pos > n ) return;
    c[pos] += val;
    int step = 1;
    while ( !(step & pos) ) step *= 2;
    Update(pos+step, val);
}

int Query(int pos)    
{
    if ( pos < 1 ) return 0;
    int step = 1;
    while ( !(step & pos) ) step *= 2;
    return Query(pos-step) + c[pos];
}

int Search(int val)  
{
    int i, step;  
    for ( step = 1; step < n; step <<= 1 );   
    for( i = 0; step; step >>= 1 )
        if( i + step <= n )  
            if( val >= c[i+step] )   
            {
                i += step, val -= c[i];  
                if ( !val ) return i;  
            }    
    return -1;  
}