Cod sursa(job #529157)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 4 februarie 2011 13:46:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#define Nmax 100010

int v[Nmax],i,n,m,op,x,poz,s,d ;

int bit(int x)
{
	return (x&(x-1))^x;
}

void update( int poz, int x )
{
	int i ;
	
	for( i = poz ; i <= n ; i+=bit(i) )
		v[i] += x ;
}

int query ( int poz )
{
	int i, s = 0 ;
	
	for( i = poz ; i ; i -= bit(i) )
		s += v[i] ;
	
	return s ;
}

int search( int x )  
{  
    int i,step;
   
    for( step = 1 ; step < n ; step<<=1 );
	
    for( i = 0 ; step ; step>>=1 )
    {
        if( i + step <= n )
        {
            if( x >= v[i+step] )
            {  
                i+=step ;
				x-=v[i] ;
                if(!x) return i;
            }  
        }  
    }  
    
    return -1;  
}

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",&x);
		update(i,x);
	}
	
	for( i = 1 ; i <= m ; i++ )
	{
		scanf("%d",&op);
		
		if( !op )
		{
			scanf("%d %d",&poz,&x);
			update(poz,x);
		}
		
		else if( op == 1 )
		{
			scanf("%d %d",&s,&d);
			printf("%d\n", query(d)-query(s-1) );
		}
		
		else
		{
			scanf("%d",&x);
			printf("%d\n",search(x) );
		}
	}
	
	return 0;
}