Cod sursa(job #1007316)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 8 octombrie 2013 19:20:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<fstream>

using namespace std;

#define max_n 100010

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

int Aib[max_n];
int n , q , x , op , a , b;

void update( int poz , int val ){
	
	int nr = 0;
	
	while( poz <= n ){
		
		Aib[poz] += val;
		
		while( (poz & (1<<nr)) == 0 )
			nr++;
		
		poz +=  (1<<nr);
		nr++;
		
	}
	
}

int querry( int poz ){
	
	int sum = 0;
	int nr = 0;
	
	while( poz > 0 ){
		
		sum += Aib[poz];
		
		while( (poz & (1<<nr)) == 0 )
			nr++;
		
		poz -= (1<<nr);
		nr++;
		
	}
	
	return sum;
	
}

int search( int val ){
	
	int st = 1 , dr = n;
	int mid = (st + dr) / 2;
	int sum = 0 , poz = 0;
	
	while( st <= dr ){
		
		sum = querry(mid);
		
		if( sum == val ){
			poz = mid;
			dr = mid - 1;
		}
		else{
			if( sum < val )
				st = mid + 1;
			else
				dr = mid - 1;
		}
		
		mid = (st + dr) / 2;
	}		

	return ( poz!=0?poz:(-1) );
	
}



void read(){
	
	f>>n>>q;
	
	for( int i = 1 ; i <= n  ; i++ ){
		f>>x;
		update( i , x );
	}
	
}

void solve(){
	
	for( ; q ; q-- ){
		
		f>>op;
		
		switch( op ){
		case 0:
			f>>a>>b;
			update(a , b);
			break;
			
		case 1:
			f>>a>>b;
			g<<querry(b) - querry(a-1)<<"\n";
			break;
			
		default:
			f>>a;
			g<<search(a)<<"\n";
			break;
			
		}
		
	}
	
}

int main(){
	
	read();
	
	solve();
	
	return 0;
}