Pagini recente » Cod sursa (job #2980259) | Cod sursa (job #2055185) | Cod sursa (job #2327257) | Cod sursa (job #3188844) | Cod sursa (job #1730273)
#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];
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;
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 && y >= 0; i++)
{
if( y & (1<<i) ){
p = dp[i][p];
y = (1<<i);
}
}
return p;
}
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<< x << "\n";
return ;
}
for(int j = 20; j >= 0 ; j--) {
if(dp[j][x] != dp[j][y]) {
x = dp[j][x];
y = dp[j][y];
}
}
g<< Stramos(x,1) << "\n";
}
int main()
{
int x, y;
Read();
Dfs(1,0);
//g<< Stramos (7,1);
for(int i = 1 ; i <= m; i++) {
f>> x >> y;
//g<< x << y << "\n";
Solve(x,y);
}
return 0;
}