Cod sursa(job #2092523)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 21 decembrie 2017 20:57:53
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

void Dfs(int node, int cur_lvl, vector < int > &level, vector < vector < int > > &gr) {

  level[node] = cur_lvl;
  for (auto x : gr[node]) {
    Dfs(x, cur_lvl + 1, level, gr);
  }
}

int main() {
  
  int n, m;
  cin >> n >> m;

  vector < int > root(n + 1);
  vector < vector < int > > gr(n + 1);
  for (int i = 2; i <= n; i ++) {
    cin >> root[i];
    gr[root[i]].push_back(i);
  }

  vector < int > level(n + 1);
  Dfs(1, 1, level, gr);
  
  for (int i = 1; i <= m; i ++) {

    int x, y;
    cin >> x >> y;
    while (x != y) {

      if (level[x] >= level[y]) {
        x = root[x];
      }
      else {
        y = root[y];
      }
    }

    cout << x << '\n';
  }
}