Pagini recente » Cod sursa (job #2337660) | Cod sursa (job #2649516) | Cod sursa (job #2917207) | Cod sursa (job #860248) | Cod sursa (job #2090775)
#include<cstdio>
#include<algorithm>
#include<vector>
#define nmax 100005
using namespace std;
static int h=200;
int m,n,k,a[nmax],x,y,tata[nmax],niv[nmax];
vector<int>v[nmax];
void dfs(int nod,int n1,int lev){niv[nod]=lev;tata[nod]=n1;if(lev%h==0){n1=nod;}for(int j=0;j<v[nod].size();j++){dfs(v[nod][j],n1,lev+1);}}
int lca(int x,int y){while(tata[x]!=tata[y]){if(niv[x]>niv[y]){x=tata[x];}else{y=tata[y];}while(x!=y){if(niv[x]>niv[y]){x=a[x];}else{y=a[y];}}}return x;}
int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=2;i<=n;i++){scanf("%d",&a[i]);v[a[i]].push_back(i);}
dfs(1,0,0);for(int i=1;i<=m;i++){scanf("%d %d",&x,&y);printf("%d\n",lca(x,y));}
}