Pagini recente » Cod sursa (job #1623588) | Arhiva de probleme | Cod sursa (job #838059) | Cod sursa (job #1196775) | Cod sursa (job #528468)
Cod sursa(job #528468)
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
#define FOR(i, a, b) for(int i = a ; i <= b ; i++)
#define FORV(V) for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)
const int NMAX = 100005;
const int H = 618;//il fac 2 * 314
int N, M;
int T[NMAX], T2[NMAX];
int LV[NMAX];
vector<int> Graf[NMAX];
void citi()
{
cin >> N >> M;
FOR(i, 2, N)
{
cin >> T[i];
Graf[T[i]].push_back(i);
}
}
void dfs(int nod, int str, int lev)
{
T2[nod] = str;
LV[nod] = lev;
if(lev % H == 0) str = nod;
FORV(Graf[nod])
dfs(*it, str, lev + 1);
}
int lca(int x, int y)
{
while(T2[x] != T2[y])
if(LV[x] > LV[y]) x = T2[x];
else y = T2[y];
while(x != y)
if(LV[x] > LV[y]) x = T[x];
else y = T[y];
return x;
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
citi();
dfs(1, 0, 0);
FOR(i, 1, M)
{
int x, y;
cin >> x >> y;
printf("%d\n", lca(x, y));
}
return 0;
}