Cod sursa(job #45161)

Utilizator arenakadaffKadaff arenakadaff Data 1 aprilie 2007 09:25:59
Problema Xor Max Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#include <stdlib.h>


long int *v ;

struct type
{
	long int x , y , val; } *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) ;
	}
}


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


int main()
{
	long int i , j , k , max , n ;
	FILE *in , *out ;
	v = (long int *) malloc(300100 * sizeof(long int)) ;
	info =(struct type *) malloc(300100 * sizeof(struct type)) ;
	in = fopen("xormax.in" , "rt") ;
	out = fopen("xormax.out" , "wt") ;
	fscanf(in , "%ld" , &n) ;
	j = init(1 , n , 1) ;
	for(i = 1 ; i <= j ; i++) v[i] = 0 ;
	k = j ;
	for(i = 1 ; i <= n ; i++)
	{
		fscanf(in , "%ld" , &j) ;
		intr(j , i , 1 , n , 1) ;
	}
//	j = init(1 , n) ;
	j = k ;
	for(i = 2 , max = v[1] , poz.x = info[1].x , poz.y = info[1].y ; i <= j ; i++)
	{
		if(max < v[i])
		{
			max = v[i] ;
			poz.x = info[i].x ;
			poz.y = info[i].y ;
			continue ;
		}
		if(max == v[i]) if(info[i].y < poz.y || (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 ;
}