Pagini recente » Cod sursa (job #1671072) | Cod sursa (job #189639) | Cod sursa (job #1824385) | Cod sursa (job #1974470) | Cod sursa (job #2433455)
#include <bits/stdc++.h>
#define MAX (int)(1e5+5)
#define RMAX 350
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
typedef pair <int, int> pairINT;
int n,q,sz;
int Depth[MAX],lg[MAX],EulerTour[MAX*2],Poz[MAX];
vector <int> Child[MAX];
pairINT rmq[RMAX][MAX*2];
void read();
void solve();
void createRMQ();
void dfs(int,int);
int main(){
read();
dfs(1,1);
createRMQ();
solve();
return 0;
}
void solve(){
int x,y,dist;
pairINT it;
while(q--){
fin>>x>>y;
x=Poz[x], y=Poz[y];
if(x>y)
swap(x,y);
dist=y-x;
it=min(rmq[lg[dist]][x],
rmq[lg[dist]][y-(1<<lg[dist])+1]);
fout<<it.second<<'\n';
}
}
void createRMQ(){
int i,j;
//precalculate lg2
for(i=2;i<=sz;++i)
lg[i]=lg[i/2]+1;
for(i=1;i<=sz;++i)
rmq[0][i]=make_pair(Depth[EulerTour[i]],EulerTour[i]);
for(i=1;i<=lg[sz];++i){
for(j=1;j+(1<<(i-1))<=sz;++j){
rmq[i][j]=min(rmq[i-1][j],
rmq[i-1][j+(1<<(i-1))]);
}
}
}
void dfs(int nod,int depth){
Depth[nod]=depth;
EulerTour[++sz]=nod;
if(!Poz[nod])
Poz[nod]=sz;
for(auto it:Child[nod]){
dfs(it,depth+1);
EulerTour[++sz]=nod;
}
}
void read(){
int i,x;
fin>>n>>q;
for(i=2;i<=n;++i){
fin>>x;
Child[x].push_back(i);
}
}