Pagini recente » Cod sursa (job #1515622) | Cod sursa (job #80731) | Cod sursa (job #2440813) | Cod sursa (job #421037) | Cod sursa (job #1952991)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define nmax 100005
int n, m, t[nmax], index[nmax];
vector <int> eul, niv, g[nmax];
bool viz[nmax]={0};
void citireArb()
{
int i;
fin>>n>>m;
for(i=2; i<=n; i++)
fin>>t[i];
}
void build()
{
int i;
for(i=1; i<=n; i++)
if(t[i])
{
g[i].push_back(t[i]);
g[t[i]].push_back(i);
}
}
void dfs(int nod, int level)
{
vector<int>::iterator it;
viz[nod]=1;
eul.push_back(nod);
index[nod]=eul.size()-1;
niv.push_back(level);
for(it=g[nod].begin(); it!=g[nod].end(); it++)
if(!viz[*it] && t[nod]!=*it)
{
dfs(*it, level+1);
eul.push_back(nod);
niv.push_back(level);
}
}
int minim(int x, int y)
{
int i, j, mn, r=0;
i=index[x];
j=index[y];
if(i>j)
{
mn=i;
i=j;
j=mn;
}
mn=nmax;
for(;i<=j;i++)
if(niv[i]<mn)
{
mn=niv[i];
r=eul[i];
}
return r;
}
int main()
{
int x, y;
citireArb();
build();
dfs(1, 0);
while(m)
{
m--;
fin>>x>>y;
fout<<minim(x, y)<<'\n';
}
return 0;
}