Cod sursa(job #2090778)

Utilizator Mihai9Oniga Mihai Mihai9 Data 18 decembrie 2017 18:33:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int m,n,k,a[100005],x,y,tata[100005],niv[100005];
vector<int>v[100005];
void dfs(int nod,int n1,int lev){niv[nod]=lev;tata[nod]=n1;if(lev%200==0){n1=nod;}for(int j=0;j<(int)(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));}}