Pagini recente » Cod sursa (job #2262494) | Cod sursa (job #1698768) | Cod sursa (job #375355) | Cod sursa (job #1118873) | Cod sursa (job #2085026)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N, M, sq, h;
int p[NMAX], p2[NMAX], lev[NMAX];
vector <int> v[NMAX];
void find_h(int nod, int niv)
{
h = max(h, niv);
vector <int> :: iterator it;
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
int nxt = *it;
find_h(nxt, niv + 1);
}
}
void dfs(int nod, int P, int niv)
{
p2[nod] = P;
lev[nod] = niv;
if (niv % sq == 0)
P = nod;
vector <int> :: iterator it;
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
int nxt = *it;
dfs(nxt, P, niv + 1);
}
}
int lca(int x, int y)
{
while (p2[x] != p2[y])
if (lev[x] < lev[y])
y = p2[y];
else x = p2[x];
while (x != y)
if (lev[x] < lev[y])
y = p[y];
else x = p[x];
return x;
}
int main()
{
fin >> N >> M;
for (int i = 2; i <= N; i++)
{
int x;
fin >> x;
v[x].push_back(i);
p[i] = x;
}
find_h(1, 0);
sq = sqrt(h);
dfs(1, 1, 0);
for (int i = 1; i <= M; i++)
{
int x, y;
fin >> x >> y;
fout << lca(x, y) << "\n";
}
return 0;
}