Pagini recente » Cod sursa (job #768447) | Cod sursa (job #785237) | Cod sursa (job #1127507) | Cod sursa (job #885209) | Cod sursa (job #2397921)
#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];
int nivmax;
void dfsniv(int nod, int hc)
{
h[nod] = hc;
nivmax = max(nivmax, hc);
for(int m : g[nod])
dfsniv(m, hc + 1);
}
void dfs(int nod, int hc, int bc)
{
if(hc % k == 0)
{
bc = tb.size();
tb.push_back(t[nod]);
}
bk[nod] = tb[bc];
for(int m : g[nod])
dfs(m, hc + 1, bc);
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
int m;
fin >> n >> m;
for(int i = 2; i <= n; i++)
{
int a;
fin >> a;
t[i] = a;
g[a].push_back(i);
}
dfsniv(1, 0);
k = int(sqrt(nivmax));
dfs(1, 0, -1);
while(m--)
{
int a, b;
fin >> 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];
}
fout << a << '\n';
}
return 0;
}