Cod sursa(job #770719)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 23 iulie 2012 18:01:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include<iostream>
#include<fstream>

//vorbim aici, ca data trecuta :))

//Conversatie inteligenta cu elfus (cel mai destept om de pe IA)
///dafaq?
//incearca sa faci intai datorii
//esti mandru de tine? iar ai furat fara sa intelegi :))))
//ba nu, era la fel ca asta doar ca trebuia update cu -
//ma rog, pe asta am furat-o =))

// la 6 jumate ma duc sa fraudez codeforces :))
//nush ce e aia, dar ok

//vrei sa jucam un separeu cu ala? :))
//nu, fa-mi rating :))

//logheaza-te. cautam parola

//cred ca l-am pornit prea tarziu
//imi bag pula

//ba, catalina, e fata

//tot n-ai invatat sa trollezi :(

/* hai sa mai incercam o data */
//ba, eu cred ca merg sa mananc cv
//OK :D
//mi-e frica sa te las pe tn singur in pc :))

//nu fuck nimic, doar vb cu mugurica si celelalte din lista ta :)))
//e offline

//nu conteaza :)))
//mai bn nu :))

//deci ma dai afara? 
//cum ar fi sa trimit sursa cu conversatia asta pe IA ? :))
//te provoc :D

//pe bune, sa o trimit ? :))
//da, nu cred k sta nimeni sa se uite. :)))
//oricum nu sunt prea bine vazut de admini :D

//mai jucam ?
//mai jucam cateva
//ok, sper sa pot sa-i si trollez calumea
//:)
//=))))
//iar o sa zica admnii k m-am facut pulbere

using namespace std;

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

int AIB[100010], M, N;

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

void update(int poz, int val)
{
	while(poz <= N){
		AIB[poz] += val;
		poz += lsb(poz);
	}
}

int query(int poz)
{
	int s = 0;
	
	while(poz){
		s += AIB[poz];
		poz -= lsb(poz);
	}
	
	return s;
}

int search(int val)
{
	int i, pas;
	
	for(pas = 1; pas < N; pas <<= 1);
	for(i = 0; pas; pas >>= 1)
		if(i + pas <= N && AIB[i + pas] <= val){
			i += pas;
			val -= AIB[i];
			if(!val) return i;
		}
		
	return -1;
}

int main()
{
	int i, k, x, y;
	
	in >> N >> M;
	
	for(i = 1; i <= N; ++i){
		in >> x;
		update(i, x);
	}
	
	while(M--){
		in >> k;
		
		if(k < 2){
			in >> x >> y;
			
			if(!k) update(x, y);
			else
				out << query(y) - query(x - 1) << "\n";
		}
		else{
			in >> x;
			out << search(x) << "\n";
		}
	}
	
	return 0;
}