Pagini recente » Cod sursa (job #2691192) | Cod sursa (job #1176841) | Cod sursa (job #19616) | Cod sursa (job #1247351) | Cod sursa (job #3131818)
#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],timp;
bool esteparinte(int u,int v)
{
return in[u]<=in[v]&&out[u]>=out[v];
}
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;
}