Cod sursa(job #2348605)

Utilizator Alex221Dumitru Alexandru Alex221 Data 19 februarie 2019 20:35:50
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.77 kb
#include <bits/stdc++.h>
#define MAXN 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,t[MAXN],lvl[MAXN],m,x,y,h,p[MAXN],a,b;
void dfs(int nod)
{ if(lvl[nod]<h)
    p[nod]=1;
  if(lvl[nod]%h==0)
    p[nod]=t[nod];
  else
    p[nod]=p[t[nod]];
  for(int k=2;k<=n;k++)
    if(t[k]==nod)
     dfs(k);
}
int LCA(int x, int y)
{ while(p[x]!=p[y])
   if(lvl[x]>lvl[y])
    x=p[x];
    else
    y=p[y];
 while(x!=y)
    if(lvl[x]>lvl[y])
    x=t[x];
   else
    y=t[y];
   return x;
}
int main()
{ f>>n>>m;
  for(int i=2;i<=n;i++)
  { f>>t[i];
    lvl[i]=lvl[t[i]]+1;
  }
 for(int i=1;i<=n;i++)
    if(h<t[i]) h=t[i];
  h=sqrt(h);
  dfs(1);
  for(int i=1;i<=m;i++)
  { f>>a>>b;
    g<<LCA(a,b)<<'\n';
  }
    return 0;
}