Pagini recente » Cod sursa (job #1968267) | Cod sursa (job #548329) | Cod sursa (job #1097741) | Cod sursa (job #1966893) | Cod sursa (job #2207819)
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <vector>
#include <string.h>
#define dMAX 100000
using namespace std;
int n, m, t, p, q;
int first[dMAX * 2 + 2];
int sparseTable[2 * dMAX][(int)log2(2 * dMAX) + 1];
pair<int, int> reprEuler[dMAX * 2 + 2];
int idx;
vector<int> graf[dMAX + 2];
char s[15];
int id;
ifstream fin("lca.in");
ofstream fout("lca.out");
void DFS(int v, int niv) {
reprEuler[++idx] = {v, niv};
first[v] = idx;
int newV, u;
for (u = 0; u < graf[v].size(); u++) {
newV = graf[v][u];
DFS(newV, niv + 1);
reprEuler[++idx] = {v, niv};
}
}
void MakeTable() {
int i, j, l, r;
for (i = 1; i <= idx; i++) sparseTable[i][0] = i;
for (j = 1; (1 << j) <= idx; j++) {
for (i = 1; i + (1 << j) - 1 <= idx; i++) {
l = sparseTable[i][j - 1];
r = sparseTable[i + (1 << (j - 1))][j - 1];
if (reprEuler[l].second < reprEuler[r].second) {
sparseTable[i][j] = l;
} else
sparseTable[i][j] = r;
}
}
}
int RMQ(int low, int r) {
int l = r - low + 1;
int k = (int)log2(l);
int t1, t2;
t1 = sparseTable[low][k];
t2 = sparseTable[low + l - (1 << k)][k];
if (reprEuler[t1].second < reprEuler[t2].second) {
return reprEuler[t1].first;
} else return reprEuler[t2].first;
}
int LCA(int x, int y) {
int a = first[x], b = first[y];
if (a > b) swap(a, b);
return RMQ(a, b);
}
void GetInt(int &t) {
t = 0;
while (isdigit(s[id])) {
t *= 10;
t += (int)s[id] - '0';
id++;
}
id++;
}
int main()
{
int i, j;
fin >> n >> m;
fin.get();
for (i = 2; i <= n; i++) {
fin >> t;
graf[t].push_back(i);
}
fin.get();
DFS(1, 0);
MakeTable();
for (i = 1; i <= m; i++) {
//fin >> p >> q;
fin.getline(s, 15);
id = 0;
GetInt(p);
GetInt(q);
fout << LCA(p, q) << '\n';
}
return 0;
}