Pagini recente » Cod sursa (job #170545) | Cod sursa (job #764495) | Cod sursa (job #1475805) | Cod sursa (job #779504) | Cod sursa (job #3132714)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int tata[100005];
vector<int> muchii[100005];
int in[100005],out[100005];
int timp;
int stramosi[100005][21];
bool esteparinte(int u,int v)
{
if(in[u]<=in[v]&&out[u]>=out[v])
return 1;
return 0;
}
int LCA(int u,int v)
{
if(esteparinte(u,v))
return u;
if(esteparinte(v,u))
return v;
for(int i=17;i>=0;i--)
if(stramosi[i][u]!=0&&!esteparinte(stramosi[i][u],v))
u=stramosi[i][u];
return tata[]
}
void dfs(int nod)
{
timp++;
in[nod]=timp;
stramosi[0][nod]=tata[nod];
for(int i=1;i<=17;i++)
stramosi[i][nod]=stramosi[i-1][stramosi[i-1][nod]];
for(int i:muchii[nod])
if(i!=tata[nod])
dfs(i);
out[nod]=timp;
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>tata[i];
muchii[i].push_back(tata[i]);
muchii[tata[i]].push_back(i);
}
dfs(1);
while(m--)
{
int u,v;
fin>>u>>v;
int lca=u;
while(!esteparinte(lca,v))
lca=tata[lca];
fout<<lca<<'\n';
}
return 0;
}