Pagini recente » Cod sursa (job #1895971) | Cod sursa (job #1869711) | Cod sursa (job #2152838) | Cod sursa (job #3178866) | Cod sursa (job #44433)
Cod sursa(job #44433)
#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) ;
}
}
int init(long int a , long int b)
{
long i , j ;
info[1].x = a ;
info[1].y = b ;
j = 1 ;
i = 1 ;
long int mij ;
while(i <= j)
{
if(info[i].x != info[i].y)
{
mij = (info[i].x + info[i].y) / 2 ;
info[2 * i].x = info[i].x ;
info[2 * i].y = mij ;
info[2 * i + 1].x = mij + 1 ;
info[2 * i + 1].y = info[i].y ;
j+=2 ;
}
i++ ;
}
return j ;
}
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) ;
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] && (info[i].x != info[i].y))
{
max = v[i] ;
poz.x = info[i].x ;
poz.y = info[i].y ;
continue ;
}
if(max == v[i] && info[i].x != info[i].y) 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 ;
}