Pagini recente » Cod sursa (job #1699344) | Cod sursa (job #1943249) | Cod sursa (job #1469680) | Cod sursa (job #27294) | Cod sursa (job #1335701)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int Nmax = 100000 + 2;
vector <int> v[Nmax];
int lev[Nmax];
int tata[Nmax];
int n,m,i,x,y;
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod,int level)
{
int i;
lev[nod]=level;
for(i=0;i<v[nod].size();i++)
{
if(tata[v[nod][i]]==0)
{
tata[v[nod][i]]=nod;
dfs(v[nod][i],level+1);
}
}
}
int lca(int x,int y)
{
while(x!=y)
{
if(lev[x]>lev[y])
{
x=tata[x];
}
else
{
y=tata[y];
}
}
return x;
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
v[x].push_back(i);
}
dfs(1,1);
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
/* for(i=1;i<=n;i++)
{
fout<<lev[i]<<" ";
}*/
}