Pagini recente » preoli9 | Cod sursa (job #906429) | Cod sursa (job #704559) | Cod sursa (job #2736563) | Cod sursa (job #1734803)
#include <bits/stdc++.h>
using namespace std;
void DFS (int node, int first, int level);
unsigned int n, m;
unsigned int father[100001];
unsigned int u, v;
const int h=200;
vector <int> ls[100001];
unsigned int grandpa[100001], lev[100001];
unsigned int i;
unsigned int lca;
int main ()
{
ifstream fin ("lca.in");
fin >> n >> m;
for (i=2; i<=n; i++)
{
fin >> father[i];
ls[father[i]].push_back(i);
}
DFS(1,1,0);
ofstream fout ("lca.out");
for (i=1; i<=m; i++)
{
fin >> u >> v;
while (grandpa[u] != grandpa[v])
if (lev[u] > lev[v])
u = grandpa[u];
else
v = grandpa[v];
while (u != v)
if (lev[u] > lev[v])
u = father[u];
else
v = father[v];
lca = u;
fout << lca << '\n';
}
fout.close();
fin.close();
return 0;
}
void DFS (int node, int first, int level)
{
unsigned int i;
grandpa[node] = first;
lev[node] = level;
if (level%h == 0)
first = node;
for (i=0; i<ls[node].size(); i++)
DFS(ls[node][i],first,level+1);
}