Cod sursa(job #897567)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 27 februarie 2013 21:14:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>


using namespace std;

#define max_n 100010

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

int n , m , op , a , b , L[max_n] , nr;

void update(int , int);

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

void update(int a , int b){
	
	int nr = 0;
	
	while(a <= n){
		
		L[a]+=b;
		
		while( !(a&(1<<nr)) )
			nr++;
		
		a+=(1<<nr);
		nr+=1;
		
	}
	
	
}

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

int find(int a){
	
	int st=1,dr=n;
	int mid = (st + dr)/2;
	int x , sol = -1;
	while(st <= dr){
		
		x=querry(mid);
		
		if(x==a){
			sol=mid;
			dr=mid-1;
		}
		else{
			if(x<a)
				st=mid+1;
			else
				dr=mid-1;
		}
		
		mid = (st + dr)/2;
	}
	
	return sol;
}

void solve(){
	
	for(int i = 1; i <= m; i++){
		
		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<<find(a)<<"\n";
			
			break;
		}
		
		
	}
	
	
}

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