Cod sursa(job #670047)

Utilizator MultiHackRaul Iulian MultiHack Data 28 ianuarie 2012 11:12:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
# include <fstream>

# define dim 100005

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int arb[ dim ];
int n, m;

inline int zero( int x )
{
 return x & -x;
}

inline void insert( int var, int poz )
{
 int i;
 for ( i = poz ; i <= n ; i = i + zero( i ) )
	 arb[ i ] = arb[ i ] + var;
}

inline void det( int x, int y )
{
 int suma_a = 0, suma_b = 0, i;
 
 for ( i = y ; i >= 1 ; i = i - zero( i ) )
	 suma_a = suma_a + arb[ i ];
 
 for ( i = x - 1 ; i >= 1 ; i = i - zero( i ) )
	 suma_b = suma_b + arb[ i ];
	 
	 g << suma_a - suma_b << "\n";
}

void cauta( int x )
{
 int i, ok = 1, j = 0;
 for ( i = 1 ; i <= n ; i = i << 1 );
 //g << i;
 
 while( i > 0 && ok == 1 )
 {
	 if ( i + j <= n )
		 if ( x >= arb[ i + j ] )
		 {
			 j = j + i;
			 x = x - arb[ j ];
			 
			 if ( x == 0 )
				 ok = 0;
		 }
		 i = i >> 1;
 }
 
 if ( ok == 0 )
	 g << j << "\n";
 else
	 g << -1 << "\n";
}


inline void citire()
{
 int i, x, y, var;
 f >> n >> m;
 for ( i = 1 ; i <= n ; i++ )
 {
	 f >> x;
	 insert( x, i );
 }
 
 for ( i = 1 ; i <= m ; i++ )
 {
	 f >> var;
	 if ( var == 0 )
	 {
		 f >> x >> y;
		 insert( y, x );
	 }
	 else
		 if ( var == 1 )
		 {
			 f >> x >> y;
			 det( x, y ) ;
		 }
		 else
			 if ( var == 2 )
			 {
				 f >> x;
				 cauta( x );
			 }
 }
}

int main()
{
 citire();
 return 0;
}