Cod sursa(job #44384)

Utilizator arenakadaffKadaff arenakadaff Data 31 martie 2007 12:19:08
Problema Xor Max Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>


long int *v ;

struct type
{
	long int x , y ; } *info , poz ;


void intr(long int x , long int poz , long int a , long int b , long int i)
{
	if(poz <= a && poz >= b) v[i] ^= x ;
	else
	{
		v[i] ^= x ;
		long int mij = (a + b) / 2 ;
		if(poz <= mij) intr(x , poz , a , mij , i * 2) ;
		else intr(x , poz , mij + 1 , b , i * 2 + 1) ;
	}
}


void init(long int a , long int b , long int i)
{
	if(a == b)
	{
		info[i].x = a ;
		info[i].y = b ;
	}
	else
	{
		info[i].x = a ;
		info[i].y = b ;
		long int mij = (a + b) / 2 ;
		init(a , mij , i * 2) ;
		init(mij + 1 , b , i * 2 + 1) ;
	}
}


int main()
{
	long int i , j , max , n ;
	FILE *in , *out ;
	v = (long int *) malloc(200100 * sizeof(long int)) ;
	info =(struct type *) malloc(200100 * sizeof(struct type)) ;
	in = fopen("xormax.in" , "rt") ;
	out = fopen("xormax.out" , "wt") ;
	fscanf(in , "%ld" , &n) ;
	for(i = 1 ; i <= n ; i++)
	{
		fscanf(in , "%ld" , &j) ;
		intr(j , i , 1 , n , 1) ;
	}
	init(1 , n , 1) ;
	for(i = 2 , max = v[1] , poz.x = info[1].x , poz.y = info[1].y ; i <= 2 * n + 10 ; i++)
	{
		if(max < v[i])
		{
			max = v[i] ;
			poz.x = info[i].x ;
			poz.y = info[i].y ;
			continue ;
		}
		if(max == v[i] && info[i].y <= poz.y && info[i].x >= poz.x)
		{
			poz.y = info[i].y ;
			poz.x = info[i].x ;
		}
	}
	fprintf(out , "%ld %ld %ld" , max , poz.x , poz.y) ;
	fclose(in) ;
	fclose(out) ;
	return 0 ;
}