Pagini recente » Cod sursa (job #2315809) | Cod sursa (job #904946) | Cod sursa (job #2634900) | Cod sursa (job #1944895) | Cod sursa (job #2100533)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
pair <int , int> rmq[20][200100];
int LOG[100100];
vector < vector < int > > gr (100100);
vector < int > lv (100100);
vector < int > pos (100100);
vector < pair<int , int> > euler;
void dfs(int root){
euler.push_back({root , lv[root]});
pos[root] = euler.size()-1;
for (auto &x : gr[root]){
lv[x] = lv[root] + 1;
dfs(x);
euler.push_back({root , lv[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<=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].first = euler[i].first;
rmq[0][i].second = euler[i].second;
}
for (int bit=1; bit<=LOG[n]; bit++){
for (int i=0; i<euler.size(); i++){
if (rmq[bit-1][i] < rmq[bit-1][i + (1 << (bit - 1))]){
rmq[bit][i].first = rmq[bit-1][i].first;
rmq[bit][i].second = rmq[bit-1][i].second;
}
else{
rmq[bit][i].first = rmq[bit-1][i + (1 << (bit - 1))].first;
rmq[bit][i].second = rmq[bit-1][i + (1 << (bit - 1))].second;
}
}
}
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;
if (rmq[LOG[dif]][x].second < rmq[LOG[dif]][y - (1 << LOG[dif]) + 1].second){
cout<<rmq[LOG[dif]][x].first;
}
else{
cout<<rmq[LOG[dif]][y - (1 << LOG[dif]) + 1].first;
}
cout<<'\n';
}
return 0;
}