Pagini recente » Cod sursa (job #2090264) | Cod sursa (job #1409264) | Cod sursa (job #2162074) | Cod sursa (job #677191) | Cod sursa (job #3132493)
#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;
bool esteparinte(int u,int v)
{
if(in[u]<=in[v]&&out[u]>=out[v])
return 1;
return 0;
}
void dfs(int nod)
{
timp++;
in[nod]=timp;
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;
}