Pagini recente » Cod sursa (job #2664295) | Cod sursa (job #3243541) | Cod sursa (job #1465895) | Cod sursa (job #2797233) | Cod sursa (job #1869218)
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <math.h>
FILE *fin = fopen("lca.in", "r"), *fout = fopen("lca.out", "w");
#define NMAX 100001
#define LOGMAX 18
#define getmin(a, b) (a < b) ? a : b
#define getmax(a, b) (b > a) ? b : a
int n, m, nr;
int rmq[LOGMAX + 1][NMAX + 1], p[NMAX + 1];
std::vector <int> v[NMAX + 1];
inline void sw(int &a, int &b) {
int aux = a;
a = b;
b = aux;
}
void dfs(int x) {
rmq[0][++nr] = x;
if(!p[x]) {
p[x] = nr;
}
for(int i = 0;i < v[x].size();i++) {
dfs(v[x][i]);
rmq[0][++nr] = x;
}
}
int main(void) {
fscanf(fin, "%d%d", &n, &m);
for(int i = 2;i <= n;i++) {
int elem;
fscanf(fin, "%d", &elem);
v[elem].push_back(i);
}
dfs(1);
for(int j = 1;(1 << j) <= nr;j++)
for(int i = 1;i + (1 << j) <= nr + 1;i++)
rmq[j][i] = getmin(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
for(int i = 1;i <= m;i++) {
int a, b;
fscanf(fin, "%d%d", &a, &b);
if(p[a] > p[b])
sw(a, b);
int d = (int)log2(p[b] - p[a]);
fprintf(fout, "%d\n", getmin(rmq[d][p[a]], rmq[d][p[b] - (1 << d) + 1]));
}
fclose(fin);
fclose(fout);
return 0;
}