Cod sursa(job #2090775)

Utilizator Mihai9Oniga Mihai Mihai9 Data 18 decembrie 2017 18:28:21
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#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));}
}