Cod sursa(job #1128515)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 februarie 2014 17:27:00
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

#define NMAX 100005
#define lsb(i) i&(-i)

using namespace std;

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

int N , M , AIB[NMAX] , Type , A , B;

void Update ( int i , int val )
{
	int j;
	for ( j = i ; j <= N ; j += lsb(j) )
	    AIB[j] += val;
}
int Query ( int i )
{
	int Sol = 0 , j ;
	for ( j = i ; j > 0 ; j -=lsb(j) )
		Sol += AIB[j];
	return Sol;
}
int BS ( int Val )
{
	int left = 1 , right = N, middle , Answer = 0 ;
	for ( ; left <= right ; )
	{
		middle = ( left + right ) >> 1;
		if ( Query ( middle ) >= Val )
			Answer = middle , right= middle -1 ;
		else left = middle + 1;
	}
	return Answer;
}


int main ( void )
{
	int i , j ;
	in >> N >> M ;
	for ( i =  1 ; i <= N ; ++i )
		in >> A , Update ( i , A );
	for ( i = 1 ; i <= M ; ++i )
	{
		in >> Type ;
		if ( Type == 2 ) in >> A  , out << BS( A ) << "\n";
		else { in >> A >> B; if ( Type == 1 )  out << Query(B)  - Query(A-1) << "\n";
		else Update ( A  , B ) ;}
	}
	in.close();
	out.close();
	return 0 ;
}