Cod sursa(job #667701)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 23 ianuarie 2012 17:25:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 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;
 }