Pagini recente » Cod sursa (job #1918321) | Cod sursa (job #1173133) | Cod sursa (job #1489995) | Cod sursa (job #339042) | Cod sursa (job #773700)
Cod sursa(job #773700)
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>
using namespace std;
#define MAXN 100005
#define MAXLOGN 20
vector<int> graph[MAXN];
int H[MAXN];
int v[3 * MAXN], poz[3 * MAXN];
int lg[3 * MAXN];
int rmq[3 * MAXN][MAXLOGN];
int t, x, y, N, M, vsz;
void parc(int node, int level) {
poz[node] = vsz;
H[node] = level;
v[vsz++] = node;
for(size_t i = 0; i < graph[node].size(); i++) {
parc(graph[node][i], level + 1);
v[vsz++] = node;
}
}
int lca(int x, int y) {
int px = poz[x];
int py = poz[y];
if(px > py)
swap(px, py);
int k = lg[py - px + 1];
if(H[rmq[px][k]] < H[rmq[py - (1 << k) + 1][k]])
return rmq[px][k];
else
return rmq[py - (1 << k) + 1][k];
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out","w", stdout);
scanf("%d %d", &N, &M);
for(int i = 2; i <= N; i++) {
scanf("%d", &t);
graph[t].push_back(i);
}
parc(1, 0);
//for(int i = 0; i < vsz; i++) printf("%3d", v[i]); printf("\n");
//for(int i = 0; i < vsz; i++) printf("%3d", H[v[i]]); printf("\n");
for(int i = 0; i < vsz; i++)
rmq[i][0] = v[i];
for(int j = 1; (1 << j) <= vsz; j++)
for(int i = 0; i + (1 << j) <= vsz; i++)
if(H[rmq[i][j - 1]] < H[rmq[i + (1 << (j - 1))][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
lg[1] = 0;
for(int i = 2; i <= vsz; i++)
lg[i] = lg[i / 2] + 1;
for(int i = 0; i < M; i++) {
scanf("%d %d", &x, &y);
int res = lca(x, y);
printf("%d\n", res);
}
return 0;
}