Pagini recente » Cod sursa (job #3264989) | Cod sursa (job #2214547) | Cod sursa (job #2414387) | Cod sursa (job #2920968) | Cod sursa (job #3041225)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int euler[200001],nivel[200001];
int poz_noduri[100001];
int dp[200001][30];
int n,m,cnt;
vector<int>adiacenta[100001];
void DFS(int nod,int level)
{
euler[++cnt] = nod;
nivel[cnt] = level;
poz_noduri[nod] = cnt;
for(auto x:adiacenta[nod])
{
DFS(x,level+1);
euler[++cnt] = nod;
nivel[cnt] = level;
}
}
int aflare(int x,int y)
{
int l = y-x+1;
int put = log2(l);
if(nivel[dp[x][put]]>nivel[dp[y-(1<<put)+1][put]])
return dp[y-(1<<l)+1][put];
return dp[x][put];
}
int main()
{
f >> n >> m;
for(int i = 2;i<=n;i++)
{
int x;
f >> x;
adiacenta[x].push_back(i);
}
DFS(1,0);
for(int i = 1;i<=cnt;i++)
dp[i][0] = i;
int l = log2(cnt)+1;
for(int put = 1;put<=l;put++)
{
for(int st = 1;st<=cnt-(1<<put)+1;st++)
{
if(nivel[dp[st][put-1]]<nivel[dp[st+(1<<(put-1))][put-1]])
{
dp[st][put] = dp[st][put-1];
}
else
dp[st][put] = dp[st+(1<<(put-1))][put-1];
}
}
for(int i = 1;i<=m;i++)
{
int x,y;
f >> x >> y;
if(poz_noduri[x]>poz_noduri[y])
swap(x,y);
g << euler[aflare(poz_noduri[x],poz_noduri[y])]<<'\n';
}
}