Pagini recente » Cod sursa (job #2550512) | Cod sursa (job #2036371) | Cod sursa (job #263627) | Cod sursa (job #2067507) | Cod sursa (job #2062126)
#include <fstream>
#include <vector>
#define f first
#define s second
#define DEF 100010
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
vector < int > D[DEF];
int n, m, k, log[2 * DEF], fa[DEF];
pair < int, int > sol[20][2 * DEF];
void dfs (int nod, int niv) {
sol[0][++ k].f = niv;
sol[0][k].s = nod;
if (!fa[nod])
fa[nod] = k;
for (int i = 0; i < D[nod].size (); ++ i) {
dfs (D[nod][i], niv + 1);
sol[0][++ k].f = niv;
sol[0][k].s = nod;
}
}
pair < int, int > min_p (pair < int, int > a, pair < int, int > b) {
if (a.f < b.f)
return a;
return b;
}
int main () {
fin >> n >> m;
for (int i = 2; i <= n; ++ i) {
int x;
fin >> x;
D[x].push_back (i);
}
dfs (1, 0);
for (int i = 2; i <= k; ++ i) {
log[i] = log[i / 2] + 1;
}
for (int i = 1; (1 << i) <= k; ++ i) {
for (int j = 1; j <= k - (1 << i) + 1; ++ j) {
sol[i][j] = min_p (sol[i - 1][j], sol[i - 1][j + (1 << (i - 1))]);
}
}
for (int i = 1; i <= m; ++ i) {
int x, y, l;
fin >> x >> y;
if (fa[x] > fa[y])
swap (x, y);
l = log[fa[y] - fa[x] + 1];
fout << min_p (sol[l][fa[x]], sol[l][fa[y] - (1 << l) + 1]).s << "\n";
}
return 0;
}