#include <vector>

using namespace std;

#define MAX_NODES 1024

vector<int> tree[MAX_NODES];
int ancestor[MAX_NODES];
int visited[MAX_NODES];
int question[MAX_NODES][MAX_NODES];

void Init(int node1, int node2)
{
  for (int i = 0; i < MAX_NODES; i++)
  {
    ancestor[MAX_NODES] = -1;
    visited[MAX_NODES] = 0;
  
    for (int j = 0; j < MAX_NODES; j++)
    {
      question[i][j] = 0;
    }
  }

  question[node1][node2] = 1;
  question[node2][node1] = 1;
}


void MakeUnion(int *p, int *rank, int node)
{
  p[node] = node;
  rank[node] = 0;
}

int FindSet(int *p, int node)
{
  if (p[node] != node)
  {
    p[node] = FindSet(p, p[node]);
  }

  return p[node];
}

void Link(int *p, int *rank, int node1, int node2)
{
  if (rank[node1] < rank[node2])
  {
    p[node1] = node2;
  }
  else if (rank[node1] == rank[node2])
  {
    p[node1] = node2;
    rank[node2]++;
  }
  else
  {
    p[node2] = node1;
  }
}

void Union(int *p, int *rank, int node1, int node2)
{
  Link(p, rank, FindSet(p, node1), FindSet(p, node2));
}

void Lca(int *p, int *rank, int node)
{
  MakeUnion(p, rank, node);

  ancestor[FindSet(p, node)] = node;

  for (int i = 0; i < tree[node].size(); i++)
  {
    int node2 = tree[node][i];

    Lca(p, rank, node2);
    Union(p, rank, node, node2);

    ancestor[FindSet(p, node)] = node;
  }

  visited[node] = 1;

  for (i = 0; i < MAX_NODES; i++)
  {
    if (question[node][i] == 1 && visited[i] == 1)
    {
      printf("%d && %d 's ancestor is %d\n", node , i, ancestor[FindSet(p, i)]);
    }
  }

}