Cod sursa(job #2677967)

Utilizator retrogradLucian Bicsi retrograd Data 27 noiembrie 2020 21:11:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#ifdef LOCAL
#include <debug.hpp>
#else
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,tune=native")
#define debug(...)
#endif 

#include <bits/stdc++.h>

using namespace std;

struct Lift {
  struct Data { int par, link, dep; };
  vector<Data> T;

  Lift(int n) : T(n) {}
  
  void Add(int node, int par) {
    if (par == -1) T[node] = Data{-1, node, 0};
    else {
      int link = par, a1 = T[par].link, a2 = T[a1].link;
      if (2 * T[a1].dep == T[a2].dep + T[par].dep)
        link = a2;
      T[node] = Data{par, link, T[par].dep + 1};
    }
  }
  
  int Kth(int node, int k) {
    int seek = T[node].dep - k;
    if (seek < 0) return -1;
    while (T[node].dep > seek) 
      node = (T[T[node].link].dep >= seek) 
        ? T[node].link : T[node].par;
    return node;
  }
  
  int LCA(int a, int b) {
    if (T[a].dep < T[b].dep) swap(a, b);
    while (T[a].dep > T[b].dep) 
      a = (T[T[a].link].dep >= T[b].dep) 
        ? T[a].link : T[a].par;
    while (a != b) {
      if (T[a].dep == 0) return -1;
      if (T[a].link != T[b].link) 
        a = T[a].link, b = T[b].link;
      else a = T[a].par, b = T[b].par;
    }
    return a;
  }
};

void DFS(int node, int par, 
    vector<vector<int>>& graph,
    Lift& L) {
  L.Add(node, par);
  for (auto vec : graph[node]) 
    DFS(vec, node, graph, L);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  
  ifstream cin("lca.in");
  ofstream cout("lca.out");

  int n, m; cin >> n >> m;
  vector<vector<int>> graph(n);
  for (int i = 1; i < n; ++i) {
    int par; cin >> par; --par;
    graph[par].push_back(i);
  }
  
  Lift L(n);
  DFS(0, -1, graph, L);

  for (int i = 0; i < m; ++i) {
    int a, b; cin >> a >> b; --a; --b;
    cout << 1 + L.LCA(a, b) << '\n';
  }
  return 0;
}