Pagini recente » Cod sursa (job #2478763) | Cod sursa (job #3132939) | Cod sursa (job #976991) | Cod sursa (job #875626) | Cod sursa (job #1140123)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
typedef vector<int>::iterator iter;
#define MAXN 100005
#define MAXL 18
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, sz;
vector<int> G[MAXN];
vector< pair<int, int> > order;
int poz[MAXN], lvl[MAXN];
pair<int, int> dp[MAXL][2 * 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));
}
}
void precompute()
{
sz = order.size();
for (int j = 1; j <= sz; j++) {
dp[0][j] = order[j - 1];
}
for (int i = 1; (1 << i) <= sz; i++) {
for (int j = 1; j + (1 << i) <= sz; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
if (dp[i - 1][j].second < dp[i - 1][j + (1 << (i - 1))].second) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j + (1 << (i - 1))];
}
}
}
}
int log(int nr)
{
int rez = 1;
while ((1 << rez) <= nr) rez++;
return rez - 1;
}
int query(int st, int dr)
{
int lg = log(dr - st + 1);
pair<int, int> rez = dp[lg][dr - (1 << lg) + 1];
if (dp[lg][st].second < rez.second) rez = dp[lg][st];
return rez.first;
}
int main()
{
f >> n >> m;
for (int i = 2; i <= n; i++) {
int x;
f >> x;
G[x].push_back(i);
}
euler(1, 0);
precompute();
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(min(poz[x], poz[y]) + 1, max(poz[x], poz[y]) + 1) << '\n';
}
f.close();
g.close();
return 0;
}