Pagini recente » Cod sursa (job #2467907) | Cod sursa (job #2532592) | Cod sursa (job #1471115) | Cod sursa (job #2076710) | Cod sursa (job #1376374)
#include <fstream>
#include <vector>
using namespace std;
const int MAXN = 100002;
vector<int> g[MAXN];
int lev[MAXN];
int t[MAXN], t2[MAXN];
int h = 0;
void dfs(int node, int level)
{
lev[node] = level;
if (level > h)
h = level;
for (unsigned i = 0; i < g[node].size(); i++)
dfs(g[node][i], level+1);
}
void df(int node, int n1, int level)
{
t2[node] = n1;
if (level % h == 0)
n1 = node;
for (unsigned i = 0; i < g[node].size(); i++)
df(g[node][i], n1, level+1);
}
int lca(int x, int y)
{
while (t2[x] != t2[y])
if (lev[x] > lev[y])
x = t2[x];
else
y = t2[y];
while (x != y)
if (lev[x] > lev[y])
x = t[x];
else
y = t[y];
return x;
}
int main()
{
ifstream in("lca.in");
ofstream out("lca.out");
int n, m;
in >> n >> m;
for (int i = 2; i <= n; i++)
{
in >> t[i];
g[t[i]].push_back(i);
}
dfs(1, 0);
df(1, 0, 0);
int x, y;
while (m--)
{
in >> x >> y;
out << lca(x, y) << '\n';
}
return 0;
}