Pagini recente » Cod sursa (job #2040996) | Cod sursa (job #1758085) | Cod sursa (job #888757) | Cod sursa (job #3260053) | Cod sursa (job #1649257)
# include <cstdio>
# include <vector>
# define pb push_back
using namespace std;
FILE *fin = fopen("lca.in", "rt");
FILE *fout = fopen("lca.out", "wt");
const int MAXN = 100005;
const int H = 200;
vector<int> v[MAXN], L(MAXN), T(MAXN), T2(MAXN);
int N, M;
void DFS(int nod, int niv, int tata) {
T2[nod] = tata;
L[nod] = niv;
if (niv % H == 0)
tata = nod;
for (int i=0; i<v[nod].size(); ++i)
DFS(v[nod][i], niv+1, tata);
}
int LCA(int x, int y) {
while (T2[x] != T2[y]) {
if (L[x] > L[y])
x = T2[x];
else
y = T2[y];
}
while (x != y) {
if (L[x] > L[y])
x = T[x];
else
y = T[y];
}
return x;
}
int main() {
int i, x, y;
fscanf(fin, "%d%d", &N, &M);
for (i=2; i<=N; ++i) {
fscanf(fin, "%d", &T[i]);
v[T[i]].pb(i);
}
DFS(1, 0, 0);
for (i=1; i<=M; ++i) {
fscanf(fin, "%d%d", &x, &y);
fprintf(fout, "%d\n", LCA(x, y));
}
return 0;
}