Pagini recente » Cod sursa (job #2636730) | Cod sursa (job #3179892) | Cod sursa (job #2172590) | Cod sursa (job #417960) | Cod sursa (job #2279950)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N = 100001;
int n, m, t[N], s[31][N], ti[N], to[N], timp;
vector <int> fii[N];
void dfs(int x) {
ti[x] = ++timp;
for (size_t i = 0; i < fii[x].size(); i++) {
int y = fii[x][i];
dfs(y);
}
to[x] = ++timp;
}
bool stramos(int x, int y) {
return (ti[x] <= ti[y] && to[x] >= to[y]);
}
int lca(int x, int y) {
if (x == 1 || y == 1) return 1;
int pas = 30;
while (pas >= 0) {
if (s[pas][x] != 0 && !stramos(s[pas][x], y)) x = s[pas][x];
pas--;
}
return s[0][x];
}
int main()
{
in >> n >> m;
t[1] = 0;
for (int i = 2; i <= n; i++) {
in >> t[i];
s[0][i] = t[i];
fii[t[i]].push_back(i);
}
dfs(1);
/// s[i][j] = s[i - 1][ s[i - 1][j] ]
for (int i = 1; i <= 30; i++) {
for (int j = 1; j <= n; j++) s[i][j] = s[i - 1][ s[i - 1][j] ];
}
int a, b;
for (int i = 0; i < m; i++) {
in >> a >> b;
out << lca(a, b) << '\n';
}
in.close();
out.close();
return 0;
}