Pagini recente » Cod sursa (job #694517) | Cod sursa (job #2202053) | Cod sursa (job #1817858) | Cod sursa (job #355919) | Cod sursa (job #1910843)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <vector <int> > v;
int k = -1;
vector <pair <int, int> > nivel;
int N1, N2, n, m;
void DF(int R) {
k++;
nivel.push_back(make_pair(R, k));
for(int i = 0; i < v[R].size(); i++) {
DF(v[R][i]);
nivel.push_back(make_pair(R, k));
}
k--;
}
int findNod(int start) {
int j = 0;
for (j = start; nivel[j].first != N1 && nivel[j].first != N2; j++);
return j;
}
int main()
{
fin>>n>>m;
int x, y;
v.resize(n + 1);
for (int i = 2; i <= n; i++) {
fin>>x;
v[x].push_back(i);
}
DF(1);
/*
for (int i = 0; i <nivel.size(); i++) {
fout<<nivel[i].first<<' ';
}
fout<<'\n';
for (int i = 0; i <nivel.size(); i++) {
fout<<nivel[i].second<<' ';
}
*/
for (int i = 1; i <= m; i++) {
fin>>N1>>N2;
int j = 0, k = 0;
j = findNod(0);
k = findNod(j + 1);
while (j == k) {
j = k;
k = findNod(j + 1);
}
int min = 999999999, aux;
for (int p = j; p <= k; p++) {
if (min > nivel[p].second) {
min = nivel[p].second;
aux = nivel[p].first;
}
}
fout<<aux<<' ';
}
fin.close();
fout.close();
return 0;
}