Pagini recente » Istoria paginii runda/minune11/clasament | Cod sursa (job #1431445) | Cod sursa (job #672671) | Cod sursa (job #498720) | Cod sursa (job #1368864)
#include <cstdio>
#include <vector>
using namespace std;
#define maxim 100005
vector<int> graf[maxim];
int d[maxim],tata[maxim];
int n,m,i,j,x,a,b;
void dfs(int nod, int nivel)
{
d[nod]=nivel;
for(int i=0; i<graf[nod].size(); i++)
{
if(!tata[graf[nod][i]])
{
tata[graf[nod][i]]=nod;
dfs(graf[nod][i],nivel+1);
}
}
}
int lca(int a, int b)
{
while(a!=b)
{
if(d[a]>d[b])
a=tata[a];
else
b=tata[b];
}
return a;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=2; i<=n; i++)
{
scanf("%d",&x);
graf[x].push_back(i);
}
dfs(1,1);
for(i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",lca(a,b));
}
}