Cod sursa(job #2284710)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 17 noiembrie 2018 13:08:45
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <math.h>
#include <vector>

using namespace std;

const int NMAX =  100005;
const int MMAX = 2000005;
const int H = 200;

int   p[NMAX];
int  p2[NMAX];
int lev[NMAX];
int N, M;

vector<int> G[NMAX];

void dfs(int child, int parent, int l) {
   p2[child] = parent;
   lev[child] = l;

   if (l % H == 0) {
      parent = child;
   }

   for (auto i : G[child]) {
      dfs(i, parent, l + 1);
   }
}

void lca(int x, int y) {
   while (p2[x] != p2[y]) {
      if (lev[p2[x]] < lev[p2[y]]) {
         y = p2[y];
      } else {
         x = p2[x];
      }
   }

   while (x != y) {
      if (lev[x] < lev[y]) {
         y = p[y];
      } else {
         x = p[x];
      }
   }
   printf("%d\n", x);
}


int main() {
   freopen("lca.in", "r", stdin);
   freopen("lca.out", "w", stdout);

   scanf("%d %d", &N, &M);

   p[1] = 0;
   for (int i = 2; i <= N; ++i) {
      scanf("%d", &p[i]);
      G[p[i]].push_back(i);
   }

   dfs(1,0,0);

   for (int i = 0; i < M; ++i) {
      int x,y;
      scanf("%d%d", &x, &y);
      lca(x,y);
   }

   fclose(stdin);
   fclose(stdout);
   return 0;
}