Pagini recente » Cod sursa (job #2128754) | Cod sursa (job #2074859) | Cod sursa (job #166894) | Cod sursa (job #1939694) | Cod sursa (job #2471477)
#include <bits/stdc++.h>
#define Nmax 100005
#define Dmax 17
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
vector < int > v [Nmax];
int P[Nmax][Dmax];
int T[Nmax], H[Nmax];
int n,q,lvl, i1,i2;
void citesc ();
void preprocess ();
void DFS ( int x );
int solve ();
int main()
{
lvl = -1;
citesc();
}
int solve ()
{
if ( H[i1] < H[i2] )
swap (i1,i2);
int k;
for ( k = 0; (1<<k) <= H[i1] ; k++ );
k--;
for ( int j = k; j >= 0; j-- )
if ( H[i1] - ( 1<<j ) >= H[i2] )
i1= P[i1][j];
if ( i1 == i2 )
return i1;
for ( int j = k; j >=0; j-- )
if ( P[i1][j] != -1 && P[i1][j] != P[i2][j] )
{
i1 = P[i1][j];
i2 = P[i2][j];
}
return T[i1];
}
void citesc ()
{
int x;
fin >> n >> q;
for ( int i = 2; i <= n; i++)
{
fin >> x;
v[x].push_back(i);
T[i] = x;
}
preprocess();
DFS ( 1 );
for ( int i = 1 ; i <= q; i++ )
{
fin >> i1 >> i2;
fout << solve() << '\n';
}
fin.close();
}
void DFS ( int x )
{
lvl ++;
H[x] = lvl;
for ( int i = 0 ; i < v[x].size(); i++ )
DFS( v[x][i] );
lvl -- ;
}
void preprocess()
{
int x ;
for ( int j = 0; (1<<j) <= n; j++ )
for ( int i = 0; i <= n; i++ )
P[i][j] = -1;
for ( int i = 2; i <= n; i++ )
P[i][0] = T[i];
for ( int j = 1 ; (1<<j) <=n; j++ )
for ( int i = 1; i <= n; i++)
{
x = P[i][j-1];
if ( x != -1 )
P[i][j] = P [x][j-1];
}
return ;
}