Problem p03727 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define Rep(i, a, b) for (register int i = (a); i <= int(b); ++i)
#define Dep(i, a, b) for (register int i = (a); i >= int(b); --i)
#define rep(i, a, b) for (register int i = (a); i < int(b); ++i)
#define mem(x, v) memset(x, v, sizeof(x))
#define gc getchar
#define pc putchar
#define fi first
#define queue QQQ
#define se second
#define debug(x) cout << #x " = " << x << endl;
#define pp(x, y) cout << "pp: " << x << " " << y << endl;
#define rank __RAnK
inline ll read() {
  register ll x = 0, f = 1;
  register char c = gc();
  for (; !isdigit(c); c = gc())
    if (c == '-')
      f = -1;
  for (; isdigit(c); c = gc())
    x = (x << 1) + (x << 3) + (c ^ 48);
  return x * f;
}
#define rd read
void write(ll x) {
  if (x < 0)
    x = -x, pc('-');
  if (x >= 10)
    write(x / 10);
  putchar(x % 10 + '0');
}
void writeln(ll x) {
  write(x);
  puts("");
}
const int maxn = 100005;
multiset<int> s[maxn];
map<pii, int> mp;
pii q[maxn * 2];
int front, rear, fa[maxn], n;
inline int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
int main() {
  n = rd();
  Rep(i, 1, n) fa[i] = i;
  front = rear = 0;
  Rep(i, 1, 2 * n - 2) {
    int x, y;
    x = rd(), y = rd();
    s[x].insert(y);
    s[y].insert(x);
    mp[make_pair(x, y)]++;
    mp[make_pair(y, x)]++;
    if (mp[make_pair(x, y)] == 2)
      q[rear++] = make_pair(x, y);
  }
  multiset<int>::iterator it;
  while (front < rear) {
    int x = q[front].fi, y = q[front].se;
    front++;
    x = find(x), y = find(y);
    s[x].erase(y);
    s[y].erase(x);
    if (s[x].size() < s[y].size())
      swap(x, y);
    for (it = s[y].begin(); it != s[y].end(); it++) {
      int i = *it;
      s[i].erase(y);
      s[i].insert(x);
      ++mp[pii(i, x)];
      ++mp[pii(x, i)];
      if (mp[pii(x, i)] == 2)
        q[rear++] = pii(x, i);
      s[x].insert(i);
    }
    fa[y] = x;
    s[y].clear();
  }
  Rep(i, 1, n) if (find(i) != find(1)) {
    puts("NO");
    return 0;
  }
  puts("YES");
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define Rep(i, a, b) for (register int i = (a); i <= int(b); ++i)
#define Dep(i, a, b) for (register int i = (a); i >= int(b); --i)
#define rep(i, a, b) for (register int i = (a); i < int(b); ++i)
#define mem(x, v) memset(x, v, sizeof(x))
#define gc getchar
#define pc putchar
#define fi first
#define queue QQQ
#define se second
#define debug(x) cout << #x " = " << x << endl;
#define pp(x, y) cout << "pp: " << x << " " << y << endl;
#define rank __RAnK
inline ll read() {
  register ll x = 0, f = 1;
  register char c = gc();
  for (; !isdigit(c); c = gc())
    if (c == '-')
      f = -1;
  for (; isdigit(c); c = gc())
    x = (x << 1) + (x << 3) + (c ^ 48);
  return x * f;
}
#define rd read
void write(ll x) {
  if (x < 0)
    x = -x, pc('-');
  if (x >= 10)
    write(x / 10);
  putchar(x % 10 + '0');
}
void writeln(ll x) {
  write(x);
  puts("");
}
const int maxn = 100005;
multiset<int> s[maxn];
map<pii, int> mp;
pii q[maxn * 2];
int front, rear, fa[maxn], n;
inline int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
int main() {
  n = rd();
  Rep(i, 1, n) fa[i] = i;
  front = rear = 0;
  Rep(i, 1, 2 * n - 2) {
    int x, y;
    x = rd(), y = rd();
    s[x].insert(y);
    s[y].insert(x);
    mp[make_pair(x, y)]++;
    mp[make_pair(y, x)]++;
    if (mp[make_pair(x, y)] == 2)
      q[rear++] = make_pair(x, y);
  }
  multiset<int>::iterator it;
  while (front < rear) {
    int x = q[front].fi, y = q[front].se;
    front++;
    x = find(x), y = find(y);
    if (x == y)
      continue;
    s[x].erase(y);
    s[y].erase(x);
    if (s[x].size() < s[y].size())
      swap(x, y);
    for (it = s[y].begin(); it != s[y].end(); it++) {
      int i = *it;
      s[i].erase(y);
      s[i].insert(x);
      ++mp[pii(i, x)];
      ++mp[pii(x, i)];
      if (mp[pii(x, i)] == 2)
        q[rear++] = pii(x, i);
      s[x].insert(i);
    }
    fa[y] = x;
    s[y].clear();
  }
  Rep(i, 1, n) if (find(i) != find(1)) {
    puts("NO");
    return 0;
  }
  puts("YES");
  return 0;
}