Pagini recente » Cod sursa (job #2640895) | Cod sursa (job #526790) | Cod sursa (job #2612659) | Cod sursa (job #2161899) | Cod sursa (job #1753087)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#pragma pack(push, 1)
using namespace std;
int n;
int a[20][100123];
vector <int> g[100123];
int lev[100123];
void dfs(int x, int k)
{
lev[x] = k;
for (vector<int>::iterator it=g[x].begin(); it != g[x].end(); ++it)
{
dfs(*it, k+1);
}
}
int lg[100123];
int lca(int x, int y)
{
if (lev[x] < lev[y]) swap(x, y);
for (int k = lg[x]; k >= 0; --k)
{
if (lev[x] - (1 << k) >= lev[y])
{
x = a[k][x];
}
}
if (x == y) return x;
for (int k = lg[y]; k >= 0; --k)
{
if (a[k][x] && a[k][x] != a[k][y])
{
x = a[k][x];
y = a[k][y];
}
}
return a[0][x];
}
int m;
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n,&m);
for (int i = 2; i <= n; ++i)
{
scanf("%d", &a[0][i]);
g[a[0][i]].push_back(i);
}
for (int i = 1; i <= n; ++i)
{
lg[i] = lg[i / 2] + 1;
}
// for (int i = 1; i <= 30; ++i) printf("%d ", lg[i]);
for (int k = 1; (1 << k) <= n; ++k)
{
for (int i = 1; i <= n; ++i)
{
a[k][i] = a[k - 1][a[k - 1][i]];
}
}
dfs(1, 0);
while (m--)
{
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}