Pagini recente » Istoria paginii utilizator/obidan | Istoria paginii utilizator/ancasorana | Diferente pentru utilizator/popoiu.george intre reviziile 36 si 35 | Cod sursa (job #1764056) | Cod sursa (job #458056)
Cod sursa(job #458056)
#include <vector>
#include <cstdlib>
#include <fstream>
#include <algorithm>
#define SIZE 900001
#define Nmax 100111
/*
*
*/
using namespace std;
ifstream in( "lca.in" );
ofstream out( "lca.out" );
int N, idx;
char file[SIZE];
int f[Nmax], was[Nmax];
inline void read( int& x )
{
while( file[idx] < '0' || file[idx] > '9' )
if( ++idx == SIZE )
{
idx=0;
in.read( file, SIZE );
}
for( x=0; file[idx] >= '0' && file[idx] <= '9'; )
{
x=x*10+file[idx]-'0';
if( ++idx == SIZE )
{
idx=0;
in.read( file, SIZE );
}
}
}
inline int solve( int x, int y )
{
fill( was, was+N+1, false );
for( ; x != f[x] || y != f[y]; x=f[x], y=f[y] )
{
if( x != f[x] )
{
if( 2 == was[x] )
return x;
was[x]=1;
}
if( y != f[y] )
{
if( 1 == was[y] )
return y;
was[y]=2;
}
}
return x;
}
int main( void )
{
int M, i, x, y;
read(N); read(M);
f[1]=1;
for( i=2; i <= N; ++i )
read( f[i] );
for( ; M; --M )
{
read( x ); read( y );
out<<solve( x, y )<<"\n";
}
return EXIT_SUCCESS;
}