Pagini recente » Cod sursa (job #3214588) | Cod sursa (job #818677) | Cod sursa (job #2974000) | Cod sursa (job #1185947) | Cod sursa (job #3212371)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
#define pb push_back
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N = 1e5+3;
int n, m, k, t[N], ST[18][N], first[N], niv[N];
vector<vector<int>> e;
void read(), eulerTour(int);
int query(int,int);
int main()
{
read();
for (int i = 1, pw = 2; pw <= k; i++, pw *= 2)
for (int j = 1; j + pw / 2 <= k; j++)
ST[i][j] = (niv[ST[i-1][j]] < niv[ST[i-1][j+pw/2]] ? ST[i-1][j] : ST[i-1][j+pw/2]);
while (m--){
int a, b; fin >> a >> b;
a = first[a]; b = first[b];
if (a > b) swap(a, b);
fout << query(a, b) << '\n';
}
return 0;
}
void read(){
fin >> n >> m;
e.resize(n+3);
for (int i = 2; i <= n; i++) {
fin >> t[i];
if (t[i]) e[t[i]].pb(i);
}
eulerTour(1);
}
void eulerTour(int nod){
first[nod] = ++k;
niv[nod] = niv[t[nod]] + 1;
ST[0][k] = nod;
for (auto it: e[nod]){
eulerTour(it);
ST[0][++k] = nod;
}
}
int query(int l, int r){
int pw = 31 - __builtin_clz(r - l + 1);
return (niv[ST[pw][l]] < niv[ST[pw][r - (1<<pw) + 1]] ? ST[pw][l] : ST[pw][r - (1<<pw) + 1]);
}