Cod sursa(job #177237)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 12 aprilie 2008 14:58:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FIN "aib.in"
#define FOUT "aib.out"
#define NMAX 100001

FILE * fin, * fout;
int N, M, AIB[NMAX];


void update( int p, int value )
{
	int i = p;
	while ( i <= N )
	{
		AIB[i] += value;
		i += ((i-1)^(i))&i;
	}
}

int query( int left, int right )
{
	int i, s1 = 0, s2 = 0;
	
	i = left - 1;
	while ( i > 0 )
	{
		s1 += AIB[i];
		i -= ((i-1)^i)&i;
	}
	i = right;

	while ( i > 0 )
	{
		s2 += AIB[i];
		i -= ((i-1)^i)&i;
	}
	return s2 - s1;
}

int binary_search( int value )
{
	int i = N, step = 1;
	while ( step <= N ) step <<= 1;
	while( step )
	{
		if( i - step > 0 && query( 1, i - step ) >= value )
			i -= step;
		step >>= 1;
	}
	if ( query( 1, i) != value ) 
		return -1;
	else
		return i;
}

int main()
{
	int i, type, X, Y;
	fin = fopen( FIN, "r" );
	fout = fopen( FOUT, "w" );
	fscanf( fin, "%d%d", &N, &M );
	for( i = 1; i <= N; i++ )
	{
		fscanf( fin, "%d", &X);
		update( i, X );
	}
	while( M )
	{
		fscanf( fin, "%d", &type );
		switch( type )
		{
		case 0 :
				fscanf( fin, "%d%d", &X, &Y );
				update( X, Y );
				break;
		case 1 :
				fscanf( fin, "%d%d", &X, &Y );
				fprintf( fout, "%d\n", query( X, Y) );
				break;
		case 2 :
				fscanf( fin, "%d", &X );
				fprintf( fout, "%d\n", binary_search( X ));
				break;
		};
		M--;
	}
   fclose( fin );
   fclose( fout );
   return 0;
}