Pagini recente » Cod sursa (job #134732) | Cod sursa (job #2098320) | Cod sursa (job #1314002) | Cod sursa (job #1584062) | Cod sursa (job #1660063)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int M[30][400020],nM,First[100005],n,L[400020],m,H[100005];
vector <int> V[100005];
void dfs(int nod,int lv){
M[0][++nM]=nod;
H[nod]=lv;
if(!First[nod]){
First[nod]=nM;
}
for(int i=0;i<V[nod].size();i++){
dfs(V[nod][i],lv+1);
M[0][++nM]=nod;
H[nod]=lv;
}
}
void read(){
f>>n>>m;int x;
for(int i=2;i<=n;i++){
f>>x;
V[x].push_back(i);
}
}
void rmq(){
for(int i=1;(1<<i)<=nM;i++){
for(int j=1;j+(1<<i)<=nM;j++){
int l=1<<(i-1);
int a=M[i-1][j],b=M[i-1][j+l];
if(H[a]<H[b]){
M[i][j]=a;
}else{
M[i][j]=b;
}
}
}
}
void p2(){
L[1]=0;
for(int i=2;i<=nM;i++){
L[i]=L[i/2]+1;
}
}
int main()
{
read();
dfs(1,0);
rmq();
p2();int x,y;
for(int i=0;i<m;i++){
f>>x>>y;
int a,b;
a=First[x];
b=First[y];
if(a>b){
swap(a,b);
}
int z=b-a+1;
int l=L[z];
a=M[l][a];;
b=M[l][b-(1<<l)+1];
if(H[a]<H[b]){
g<<a;
}else{
g<<b;
}
g<<"\n";
}
return 0;
}