Pagini recente » Cod sursa (job #3341204) | Cod sursa (job #119235) | Cod sursa (job #2766490) | Cod sursa (job #2219345) | Cod sursa (job #3345105)
#include <fstream>
#include <vector>
#define NMAX 100005
#define LOG 18
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N,M,poz,tata[NMAX],nivel[NMAX];
int first[NMAX],euler[NMAX],rmq[NMAX][LOG];
vector<int> tree[NMAX];
void citire()
{
fin>>N>>M;
for(int i=2; i<=N; i++)
{
fin>>tata[i];
tree[tata[i]].push_back(i);
}
}
void DFS(int nod)
{
euler[++poz]=nod;
first[nod]=poz;
for(int i=0; i<tree[nod].size(); i++)
{
int next_nod=tree[nod][i];
nivel[next_nod]=nivel[nod]+1;
DFS(next_nod);
euler[++poz]=nod;
}
}
int main()
{
citire();
poz=0;
DFS(1);
int a,b;
for(int q=1; q<=M; q++)
{
fin>>a>>b;
int vmin,ans;
ans=vmin=NMAX;
for(int i=min(first[a],first[b]); i<=max(first[a],first[b]); i++)
{
if(nivel[euler[i]]<vmin)
{
vmin=nivel[euler[i]];
ans=euler[i];
}
}
fout<< ans << "\n";
}
return 0;
}