Cod sursa(job #2806323)

Utilizator victorzarzuZarzu Victor victorzarzu Data 22 noiembrie 2021 15:34:25
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define n_max 100000 

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

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

void dfs(int node, int parent)
{
  level[node] = level[parent] + 1;
  size[node] = 1;
    
  int maximum = 0;
  for(auto it : graf[node])
    if(it != parent)
      {
        dfs(it, node);
        size[node] += size[it];
        if(maximum < size[it])
          maximum = size[it], heavy[node] = it;
      }
}

void decomposition(int node, int superior)
{
  seq[node] = superior, position[node] = ++pos;
  if(heavy[node])
    decomposition(heavy[node], superior);
  for(auto it : graf[node])
    if(it != t[node] && it != heavy[node])
      decomposition(it, it);
}

int lca(int x, int y)
{
  while(seq[x] != seq[y])
    {
      if(position[seq[x]] < position[seq[y]])
        swap(x, y);
      x = t[seq[x]];
    }
  if(level[x] > level[y])
    return y;
  return x;    
}

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

int main()
{
  read();
  solve();
  return 0;
}