Pagini recente » Cod sursa (job #2247895) | Cod sursa (job #1765962) | Cod sursa (job #2482604) | Cod sursa (job #1205950) | Cod sursa (job #3282926)
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
#define root 1
int n, m, x, y, fap[100001];
vector<int> g[100001];
vector<pair<int, int>> euler;
void dfs(int i, int par, int grd=0){
if (!fap[i])fap[i]=euler.size();
euler.push_back({i, grd});
for (auto it:g[i]){
dfs(it, i, grd+1);
euler.push_back({i, grd});
}
}
pair<int, int> aint[100001];
void init(int nod=1, int st=1, int dr=n){
if (st==dr){
aint[nod]=euler[st];
return;
}
int mij=(st+dr)/2;
init(2*nod, st, mij);
init(2*nod+1, mij+1, dr);
aint[nod]=(aint[2*nod].second<aint[2*nod+1].second ? aint[2*nod] : aint[2*nod+1]);
}
pair<int, int> query(int nod=1, int st=1, int dr=n){
if (y<st || dr<x)return {0, INT_MAX};
if (x<=st && dr<=y)return aint[nod];
int mij=(st+dr)/2;
auto q1=query(2*nod, st, mij), q2=query(2*nod+1, mij+1, dr);
return (q1.second<q2.second ? q1 : q2);
}
int main(){
euler.push_back({0, 0});
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
cin>>n>>m;
for (int i=2; i<=n; ++i){
cin>>x;
g[x].push_back(i);
}
dfs(root, -1);
//for (auto it:euler)cout<<it.first<<" - "<<it.second<<endl;
// aci vine aint
n=euler.size();
init();
while (m--){
cin>>x>>y;
if (x>y)swap(x, y);
x=fap[x], y=fap[y];
cout<<query().first<<"\n";
}
return 0;
}