Cod sursa(job #2284706)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 17 noiembrie 2018 13:00:32
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <math.h>

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

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

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

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

   for (int i = 1; i <= N; ++i) {
      if (p[i] == child) {
         dfs(i, parent, l + 1);
      }
   }
}

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

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


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

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

   p[1] = 0;
   for (int i = 2; i <= N; ++i) {
      scanf("%d", &p[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;
}