Pagini recente » Cod sursa (job #2340163) | Cod sursa (job #1734410) | Cod sursa (job #924028) | Cod sursa (job #536281) | Cod sursa (job #1557820)
#include<bits/stdc++.h>
using namespace std;
typedef struct lnod {
int nod;
lnod *next;
}*nod;
int i,j,n,m,LVL[100005],dpa[19][100005],lg[100005];
nod lda[100005];
void add(int x,nod &y) {
nod p=new lnod;
p->nod=x;
p->next=y;
y=p;
}
void dfs(int x,int y,int lvl) {
LVL[x]=lvl;
for(nod p=lda[x];p;p=p->next) dfs(p->nod,x,lvl+1);
}
int LCA(int x,int y){
if(LVL[x]<LVL[y]) swap(x,y);
for(int i=lg[LVL[x]];i>=0;--i)
if(LVL[x]-(1<<i)>=LVL[y]) x=dpa[i][x];
if(x==y) return x;
for(int i=lg[LVL[x]];i>=0;--i)
if(dpa[i][x] && dpa[i][x]!=dpa[i][y]) x=dpa[i][x],y=dpa[i][y];
return dpa[0][x];
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
ios_base::sync_with_stdio(0); cin.tie(0);
for(i=2;i<=1e5;++i) lg[i]=lg[i/2]+1;
cin>>n>>m;
for(i=2;i<=n;++i) cin>>dpa[0][i],add(i,lda[dpa[0][i]]);
for(i=1;i<=lg[n];++i)
for(j=1;j<=n;++j)
dpa[i][j]=dpa[i-1][dpa[i-1][j]];
dfs(1,0,0);
while(m--) cin>>i>>j,cout<<LCA(i,j)<<'\n';
return 0;
}