Pagini recente » Cod sursa (job #2769339) | Cod sursa (job #155334) | Cod sursa (job #1332900) | Cod sursa (job #2827842) | Cod sursa (job #2100551)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
int rmq[20][200100];
int LOG[200100];
vector < vector < int > > gr (100100);
vector < int > lv (100100);
vector < int > pos (100100);
vector < int > euler;
void dfs(int root){
euler.push_back(root);
pos[root] = euler.size()-1;
for (auto &x : gr[root]){
lv[x] = lv[root] + 1;
dfs(x);
euler.push_back(root);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//rmq
int n , m;
cin>>n>>m;
for (int i=2; i<=2*n; i++){
LOG[i] = LOG[i/2] + 1;
}
for (int i=2; i<=n; i++){
int dad;
cin>>dad;
gr[dad].push_back(i);
}
dfs(1);
for (int i=0; i<euler.size(); i++){
rmq[0][i] = euler[i];
}
for (int bit=1; bit<=LOG[2*n]; bit++){
for (int i=0; i<euler.size(); i++){
if (lv[rmq[bit-1][i]] < lv[rmq[bit-1][i + (1 << (bit - 1))]]){
rmq[bit][i] = rmq[bit-1][i];
}
else{
rmq[bit][i] = rmq[bit-1][i + (1 << (bit - 1))];
}
}
}
for (int i=1; i<=m; i++){
int x , y;
cin>>x>>y;
x = pos[x];
y = pos[y];
if (y < x){
int aux = y;
y = x;
x = aux;
}
int dif = y - x + 1;
int l = LOG[dif];
if (lv[rmq[l][x]] < lv[rmq[l][y - (1 << l) + 1]]){
cout<<rmq[LOG[dif]][x];
}
else{
cout<<rmq[LOG[dif]][y - (1 << l) + 1];
}
cout<<'\n';
}
return 0;
}