Pagini recente » Cod sursa (job #21232) | Cod sursa (job #1771980) | Cod sursa (job #2699346) | Cod sursa (job #2534791) | Cod sursa (job #1840139)
// Patrick Sava
// Expected : 100
#include <bits/stdc++.h>
using namespace std ;
#define FORN(a,b,c) for(int a=b;a<=c;++a)
#define FORNBACK(a,b,c) for (int a=b;a>=c;--a)
#define mp make_pair
#define pb push_back
const int MAX = 1e5 + 14 ;
vector < int > gr [ MAX ], lant [ MAX ] ;
int nrlant ;
int lantdenod[MAX] ;
int poz [MAX] ;
int sub [MAX] ;
int tata [MAX] ;
int lvl [ MAX ] ;
int readInt () {
bool minus = false;
int result = 0;
char ch;
ch = getchar();
while (true) {
if (ch == '-') break;
if (ch >= '0' && ch <= '9') break;
ch = getchar();
}
if (ch == '-') minus = true; else result = ch-'0';
while (true) {
ch = getchar();
if (ch < '0' || ch > '9') break;
result = result*10 + (ch - '0');
}
if (minus)
return -result;
else
return result;
}
void dfs ( int nod )
{
sub [nod] = 1 ;
int where = 0 ;
for ( auto x : gr [nod] ) {
tata [x] = nod ;
lvl [x] = lvl [nod] + 1 ;
dfs (x);
sub [nod] += sub [x] ;
if (sub [x] > sub [where] ) {
where = x ;
}
}
if (gr[nod].size()==0){
++ nrlant ;
lant [nrlant].pb(nod) ;
poz [nod] = lant [nrlant].size() - 1;
lantdenod [nod] = nrlant ;
}
else {
lant [lantdenod[where]].pb(nod) ;
poz [nod] = lant [lantdenod[where]].size() - 1 ;
lantdenod [nod] = lantdenod[where] ;
}
}
int lca ( int x , int y )
{
lvl [0] = -1;
while (1)
{
if ( lantdenod [x] == lantdenod [y] )
{
if ( poz [x] < poz [y] ) {
return y ;
}
return x ;
}
int xx = lant [ lantdenod [x] ].back() ;
int yy = lant [ lantdenod [y] ].back() ;
if ( lvl [tata [ xx ]] < lvl [tata [ yy ]] ) {
swap (x,y) ;
}
x = tata [ lant [ lantdenod [x] ].back() ] ;
}
}
int main ()
{
freopen ("lca.in", "r", stdin) ;
freopen ("lca.out" ,"w", stdout) ;
int n, m;
n = readInt() ;
m = readInt() ;
FORN ( i , 2 , n ) {
int x ;
x = readInt() ;
gr [x].pb (i) ;
}
dfs (1) ;
while (m--)
{
int x,y ;
x = readInt() ; y = readInt() ;
printf ("%d\n" , lca(x,y)) ;
}
return 0 ;
}