Problem p03990 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

#define mp make_pair
#define pb push_back
#define SZ(x) ((int)(x).size())

using namespace std;
typedef long long LL;

template <typename T, typename TT>
ostream &operator<<(ostream &out, pair<T, TT> t) {
  return out << "(" << t.X << "," << t.Y << ")";
}
template <typename T> ostream &operator<<(ostream &out, vector<T> t) {
  out << "[";
  for (auto x : t)
    out << x << " ";
  out << "]";
  return out;
}
template <typename T> inline bool cmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T> inline bool cmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T> void read(T &x) {
  int f = 1;
  char ch;
  x = 0;
  while (!isdigit(ch = getchar()))
    if (ch == '-')
      f = -1;
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}

const int NX = 101234;

int n, s_a, s_b, k, dep[NX], par[NX], l[NX], r[NX];
vector<int> e_a[NX], e_b[NX];

void dfs(int x, int fa) {
  l[x] = ++k;
  for (int y : e_b[x]) {
    if (y != fa) {
      dep[y] = dep[x] + 1;
      par[y] = x;
      dfs(y, x);
    }
  }
  r[x] = k;
}

bool cho[NX], good[NX];
int ans = 0;
void dfs2(int x, int fa, int d) {
  if (d < dep[x]) {
    cmax(ans, dep[x] << 1);
    if (good[x])
      puts("-1"), exit(0);
  } else
    return;

  for (int y : e_a[x]) {
    if (y != fa)
      dfs2(y, x, d + 1);
  }
}

int main() {
  read(n);
  read(s_a);
  read(s_b);
  vector<pair<int, int>> buf;
  for (int i = 1; i < n; i++) {
    int u, v;
    read(u);
    read(v);
    buf.pb(mp(u, v));
  }

  for (int i = 1; i < n; i++) {
    int u, v;
    read(u);
    read(v);
    e_b[u].pb(v);
    e_b[v].pb(u);
  }

  dfs(s_b, 0);
  for (int k = 0; k < SZ(buf); k++) {
    int i = buf[k].first;
    int j = buf[k].second;

    if (l[i] > l[j])
      swap(i, j);
    bool t = r[j] <= r[i] && dep[j] > dep[i] + 2;

    if (t || (r[j] > r[i] && par[i] != par[j])) {
      good[i] = true;
      good[j] = true;
    } else {
      e_a[i].pb(j);
      e_a[j].pb(i);
    }
  }

  dfs2(s_a, 0, 0);

  cout << ans << "\n";
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

#define mp make_pair
#define pb push_back
#define SZ(x) ((int)(x).size())

using namespace std;
typedef long long LL;

template <typename T, typename TT>
ostream &operator<<(ostream &out, pair<T, TT> t) {
  return out << "(" << t.X << "," << t.Y << ")";
}
template <typename T> ostream &operator<<(ostream &out, vector<T> t) {
  out << "[";
  for (auto x : t)
    out << x << " ";
  out << "]";
  return out;
}
template <typename T> inline bool cmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T> inline bool cmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T> void read(T &x) {
  int f = 1;
  char ch;
  x = 0;
  while (!isdigit(ch = getchar()))
    if (ch == '-')
      f = -1;
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}

const int NX = 201234;

int n, s_a, s_b, k, dep[NX], par[NX], l[NX], r[NX];
vector<int> e_a[NX], e_b[NX];

void dfs(int x, int fa) {
  l[x] = ++k;
  for (int y : e_b[x]) {
    if (y != fa) {
      dep[y] = dep[x] + 1;
      par[y] = x;
      dfs(y, x);
    }
  }
  r[x] = k;
}

bool cho[NX], good[NX];
int ans = 0;
void dfs2(int x, int fa, int d) {
  if (d < dep[x]) {
    cmax(ans, dep[x] << 1);
    if (good[x])
      puts("-1"), exit(0);
  } else
    return;

  for (int y : e_a[x]) {
    if (y != fa)
      dfs2(y, x, d + 1);
  }
}

int main() {
  read(n);
  read(s_a);
  read(s_b);
  vector<pair<int, int>> buf;
  for (int i = 1; i < n; i++) {
    int u, v;
    read(u);
    read(v);
    buf.pb(mp(u, v));
  }

  for (int i = 1; i < n; i++) {
    int u, v;
    read(u);
    read(v);
    e_b[u].pb(v);
    e_b[v].pb(u);
  }

  dfs(s_b, 0);
  for (int k = 0; k < SZ(buf); k++) {
    int i = buf[k].first;
    int j = buf[k].second;

    if (l[i] > l[j])
      swap(i, j);
    bool t = r[j] <= r[i] && dep[j] > dep[i] + 2;

    if (t || (r[j] > r[i] && par[i] != par[j])) {
      good[i] = true;
      good[j] = true;
    } else {
      e_a[i].pb(j);
      e_a[j].pb(i);
    }
  }

  dfs2(s_a, 0, 0);

  cout << ans << "\n";
  return 0;
}