Pagini recente » oji-2018-11-12 | Cod sursa (job #3287013) | Cod sursa (job #2321793) | Cod sursa (job #652755) | Cod sursa (job #2716011)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Max=100005;
int tata[Max],niv[Max],n,m;
struct node
{
int val;
struct node *next;
}*v[Max];
void add(int x,int y)
{
node *p=new node;
p->val=y;
p->next=v[x];
v[x]=p;
}
void dfs(int nod,int t=0)
{
niv[nod]=niv[t]+1;
for(struct node *i=v[nod];i;i=i->next)
dfs(i->val,nod);
}
void citire()
{
in>>n>>m;
for(int i=2;i<=n;i++)
{
int x;
in>>x; tata[i]=x;
add(x,i);
}
}
void solve()
{
for(int i=1;i<=m;i++)
{
int x,y;
in>>x>>y;
while(x!=y)
{
if(niv[x]>niv[y])
x=tata[x];
else
y=tata[y];
}
out<<x<<"\n";
}
}
int main() {
citire();
dfs(1);
solve();
return 0;
}