Pagini recente » Cod sursa (job #2284252) | Cod sursa (job #3152989) | Cod sursa (job #1133961) | Cod sursa (job #2068171) | Cod sursa (job #1453239)
#define _CRT_SECURE_NO_DEPRECATE
#include <vector>
#define MAXN 100005
using namespace std;
const int h = 200;
int N, M, T[MAXN], T2[MAXN], Lev[MAXN];
vector <int> G[MAXN];
void DFS(int n, int n1, int lv){
Lev[n] = lv, T2[n] = n1;
if (!lv % h) n1 = n;
for (int i = 0; i < (int)G[n].size(); ++i)
DFS(G[n][i], n1, lv + 1);
}
int LCA(int x, int y){
while (T2[x] != T2[y])
if (Lev[x] > Lev[y]) x = T2[x];
else y = T2[y];
while (x != y)
if (Lev[x] > Lev[y]) x = T[x];
else y = T[y];
return x;
}
int main(){
FILE *fin = fopen("lca.in", "r"),
*fout = fopen("lca.out", "w");
fscanf(fin, "%d %d", &N, &M);
for (int i = 2; i <= N; ++i)
fscanf(fin, "%d", &T[i]),
G[T[i]].push_back(i);
DFS(1, 0, 0);
while (M--){
int x, y;
fscanf(fin, "%d %d", &x, &y);
fprintf(fout, "%d\n", LCA(x, y));
}
return 0;
}