Pagini recente » Cod sursa (job #732545) | Cod sursa (job #1996647) | Cod sursa (job #1746299) | Cod sursa (job #100146) | Cod sursa (job #1140053)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
typedef vector<int>::iterator iter;
#define MAXN 100005
ifstream f("lca.in");
ofstream g("lca.out");
int n, m;
vector<int> G[MAXN];
vector< pair<int, int> > order;
int poz[MAXN], lvl[MAXN];
void euler(int nd = 1, int lv = 0)
{
order.push_back(make_pair(nd, lv));
for (iter it = G[nd].begin(); it != G[nd].end(); it++) {
euler(*it, lv + 1);
order.push_back(make_pair(nd, lv));
}
}
int query(int st, int dr)
{
int mn = order[st].second, rez = st;
for (int i = st + 1; i <= dr; i++) {
if (mn > order[i].second) {
mn = order[i].second;
rez = order[i].first;
}
}
return rez;
}
int main()
{
f >> n >> m;
for (int i = 2; i <= n; i++) {
int x;
f >> x;
G[x].push_back(i);
}
euler(1, 0);
for (int i = order.size() - 1; i >= 0; i--) {
poz[order[i].first] = i;
}
for (int i = 1; i <= m; i++) {
int x, y;
f >> x >> y;
g << query(poz[x], poz[y]) << '\n';
}
f.close();
g.close();
return 0;
}