Pagini recente » Cod sursa (job #947203) | Cod sursa (job #1064490) | Cod sursa (job #1404675) | Cod sursa (job #2113301) | Cod sursa (job #2126412)
#include<bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=100001;
int d[18][N];
int n,m,viz[N],Niv[N],q[N],u,sol,l,poz[N];
vector<int>L[N];
void citire(){
in>>n>>m;
int i,x;
for(i=2;i<=n;i++){
in>>x;
L[x].push_back(i);
}
}
void dfs_euler(int x,int niv){int i,z;
viz[x]=1;
q[++u]=x;
Niv[u]=niv;
poz[x]=u;
for(i=0;i<L[x].size();i++)
{z=L[x][i];
if(!viz[z]){dfs_euler(z,niv+1);
q[++u]=x;
Niv[u]=niv;}}}
int cmp(int x,int y){
if(Niv[x]<Niv[y])return x;
else return y;
}
void constr(){
int i,j,p=1,uu;
for(i=1;i<=u;i++)
d[0][i]=i;
uu=u-1;
l=log2(u);
for(i=1;i<=l;i++,p*=2,uu-=p)
for(j=1;j<=uu;j++)
d[i][j]=cmp(d[i-1][j],d[i-1][j+p]);
}
void rmq(int x,int y){
int w,k,p,minn;
if(x>y)swap(x,y);
w=y-x+1;
k=log2(w);
p=pow(2,k);
out<<q[cmp(d[k][x],d[k][y+1-p])]<<"\n";
}
void rez(){
int i,x,y;
for(i=1;i<=m;i++)
{in>>x>>y;
rmq(poz[x],poz[y]);}
}
int main(){int i,j;
citire();
dfs_euler(1,0);
constr();
rez();
return 0;}