Pagini recente » Cod sursa (job #2874518) | Cod sursa (job #2829472) | Cod sursa (job #2275993) | Cod sursa (job #1285135) | Cod sursa (job #2397891)
#include <bits/stdc++.h>
using namespace std;
int n, k;
int t[100010];
int h[100010];
int bk[100010];
vector<int> tb;
vector<int> g[100010];
void dfs(int nod, int hc, int bc)
{
if(hc % k == 0)
{
bc = tb.size();
tb.push_back(t[nod]);
}
bk[nod] = tb[bc];
h[nod] = hc;
for(int m : g[nod])
dfs(m, hc + 1, bc);
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int m;
cin >> n >> m;
for(int i = 1; i < n; i++)
{
int a;
cin >> a;
a--;
t[i] = a;
g[a].push_back(i);
}
k = round(sqrt(n / 2));
dfs(0, 0, -1);
while(m--)
{
int a, b;
cin >> a >> b;
a--; b--;
while(bk[a] != bk[b])
{
if(h[a] < h[b])
b = bk[b];
else a = bk[a];
}
while(a != b)
{
if(h[a] < h[b])
b = t[b];
else a = t[a];
}
cout << a + 1 << '\n';
}
return 0;
}