Pagini recente » Cod sursa (job #1640581) | Cod sursa (job #2007222) | Cod sursa (job #161572) | Cod sursa (job #1856997) | Cod sursa (job #1729445)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int NMAX = 100005;
int n , m, dp[23][NMAX], Niv[NMAX], Nvmax;
vector <int> Graf[NMAX];
inline void Read() {
int x;
f >> n >> m;
for(int i = 2; i <= n ; i++) {
f>> x;
dp[0][i] = x;
Graf[x].push_back(i);
}
for(int k = 1; (1<<k)<= n ; k++) {
for(int i = 1; i <= n ; i++) {
dp[k][i] = dp[k-1][dp[k-1][i]];
}
}
}
inline void Dfs(int nod, int nivel) {
Niv[nod] = nivel;
Nvmax = nivel;
for(auto i: Graf[nod]) {
Dfs(i, nivel+1);
}
}
inline int Stramos(int x, int y) { ///returneaza al y-lea stramos al lui x
int p = x;
for(int i = 0; i <= 20; i++)
{
if( y & (1<<i) ){
p = dp[i][p];
}
}
return p;
}
inline int Cb(int x, int y) {
int st = 0, dr = Nvmax, ret = -1;
while(st <= dr) {
int m = (st + dr) /2;
if(Stramos(x,Niv[x] - m) == Stramos(y,Niv[x] - m)) {
st = m + 1;
ret = Stramos(x,Niv[x] - m);
}
else
dr = m - 1;
}
return ret;
}
inline void Solve(int x, int y) {
if(Niv[x] < Niv[y])
swap(x,y);
x = Stramos(x, Niv[x] - Niv[y]);
if(x != y)
g<< Cb(x,y) << "\n";
else
g<< x << "\n";
}
int main()
{
int x, y;
Read();
Dfs(1,0);
Nvmax++;
//g<< Stramos (5,1);
for(int i = 1 ; i <= m; i++) {
f>> x >> y;
//g<< x << y << "\n";
Solve(x,y);
}
return 0;
}