Cod sursa(job #2662984)

Utilizator victorzarzuZarzu Victor victorzarzu Data 24 octombrie 2020 23:53:11
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
#define n_max 100000

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m;
int nivel[n_max + 5], lant[n_max + 5], heavy[n_max + 5], t[n_max + 5], size[n_max + 5];
vector<int> graf[n_max + 5];

void Read()
{
  f>>n>>m;
  for(int i = 2;i <= n;++i)
    f>>t[i], graf[t[i]].push_back(i);
}

void dfs(int nod, int parinte)
{
  nivel[nod] = nivel[parinte] + 1;
  size[nod] = 1;
  int maxim = 0;
  for(auto it : graf[nod])
      {
        dfs(it, nod);
        size[nod] += size[it];
        if(maxim < size[it])
          maxim = size[it], heavy[nod] = it;
      }
}

void descompunere(int nod, int sus)
{
  lant[nod] = sus;
  if(heavy[nod])
    descompunere(heavy[nod], sus);
  for(auto it : graf[nod])
    if(it != heavy[nod])
      descompunere(it, it);
}

int solve(int x, int y)
{
  while(lant[x] != lant[y])
    {
      if(nivel[lant[x]] < nivel[lant[y]])
        swap(x, y);
      x = t[lant[x]];
    }
  return (nivel[x] > nivel[y] ? y : x);   
}

void Solve()
{
  dfs(1, 0);
  descompunere(1, 1);
  int x, y;
  for(int i = 1;i <= m;++i) 
    f>>x>>y, g<<solve(x, y)<<'\n';
}

int main()
{
  Read();
  Solve();
  return 0;
}