Cod sursa(job #2348442)

Utilizator Alex221Dumitru Alexandru Alex221 Data 19 februarie 2019 18:43:03
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,x,y,t[100001],d[100001],dmax,tx[100001],d2[100001];
vector <int> graf[100001];
 void dfs (int nod, int t2, int inaltime)
{ int j;
    tx[nod]=t2; d2[nod]=inaltime;
  if(inaltime%dmax==0) t2=nod;
   for( j=0;j<n;j++)
      if(t[j]==nod)
        dfs(j,t2,inaltime+1);
}
 int LCA(int a, int b)
{  if(t[a]==t[b]) return t[a];
  while(tx[a]!=tx[b])
     if(d2[a]>d2[b]) a=tx[a];
     else b=tx[b];
  while(a!=b)
    if(d2[a]>d2[b]) a=t[a];
     else b=t[b];
  return a;
}
int main()
{ f>>n>>m;
  for(int i=2;i<=n;i++)
  { f>>t[i];
      d[i]=d[t[i]]+1;
  }
  for(int i=2;i<=n;i++)
    if(dmax<d[i]) dmax=d[i];
    dmax++;
    dfs(1,0,0);
  for(int i=1;i<=m;i++)
  { f>>x>>y;
    g<<LCA(x,y)<<'\n';
  }
    return 0;
}