Pagini recente » Cod sursa (job #739605) | Cod sursa (job #2203332) | Cod sursa (job #594859) | Cod sursa (job #6811) | Cod sursa (job #1991999)
//BULANEALA
#include <bits/stdc++.h>
#define Nmax 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> arb[Nmax];
int elr[2*Nmax];
int lvl[Nmax];
int pz[Nmax];
int N;
void DFS(int x, int lv)
{
elr[++N]=x;
lvl[x]=lv;
if(!pz[x]) pz[x]=N;
for(list <int> :: iterator it=arb[x].begin();it!=arb[x].end();it++)
{
DFS(*it,lv+1);
elr[++N]=x;
}
}
int main()
{
int n,m,i,x,y,j,p,q;
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
arb[x].push_back(i);
}
DFS(1,0);
for(j=1;j<=m;j++)
{
f>>x>>y;
p=pz[x];
q=pz[y];
if(q<p) swap(p,q);
int minn=2e9,poz;
for(i=p;i<=q;i++)
if(lvl[elr[i]]<minn)
{
minn=lvl[elr[i]];
poz=elr[i];
}
g<<poz<<'\n';
}
return 0;
}