Problem p03855 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <tuple>
#include <vector>
using namespace std;
#define INF 11000000000
#define MAX 110000
#define MOD 1000000007
typedef long long ll;
typedef pair<int, int> P;
typedef pair<pair<int, int>, int> p;
typedef pair<pair<int, int>, int> p;
#define bit(n, k) ((n >> k) & 1) /*nのk bit目*/
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

int par[110000]; // 親
int ran[110000]; // 木の深さ
int a[110000], b[110000];

// n要素を初期化
void init(int n) {
  for (int i = 0; i < n; i++) {
    par[i] = i;
    ran[i] = 0;
  }
}

// 木の根を求める
int find(int x) {
  if (par[x] == x) {
    return x;
  } else {
    return par[x] = find(par[x]);
  }
}

// xとyの属する集合を併合
void unite(int x, int y) {
  x = find(x);
  y = find(y);
  if (x == y)
    return;

  if (ran[x] < ran[y]) {
    par[x] = y;
  } else {
    par[y] = x;
    if (ran[x] == ran[y])
      ran[x]++;
  }
}

// xとyが同じ集合に属するか否か
bool same(int x, int y) { return find(x) == find(y); }

int main() {
  int N, K, L;
  cin >> N >> K >> L;
  init(N);
  for (int i = 0; i < K; i++) {
    int p, q;
    cin >> p >> q;
    p--;
    q--;
    unite(p, q);
  }
  for (int i = 0; i < N; i++) {
    a[i] = find(i);
  }
  init(N);
  for (int i = 0; i < L; i++) {
    int r, s;
    cin >> r >> s;
    r--;
    s--;
    unite(r, s);
  }
  for (int i = 0; i < N; i++) {
    b[i] = find(i);
  }
  map<P, int> M;
  for (int i = 0; i < N; i++) {
    M[P(a[i], b[i])]++;
  }
  for (int i = 0; i < N; i++) {
    if (i)
      cout << " ";
    cout << M[P(a[i], b[i])];
  }
  cout << endl;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <tuple>
#include <vector>
using namespace std;
#define INF 11000000000
#define MAX 110000
#define MOD 1000000007
typedef long long ll;
typedef pair<int, int> P;
typedef pair<pair<int, int>, int> p;
typedef pair<pair<int, int>, int> p;
#define bit(n, k) ((n >> k) & 1) /*nのk bit目*/
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

int par[210000]; // 親
int ran[210000]; // 木の深さ
int a[210000], b[210000];

// n要素を初期化
void init(int n) {
  for (int i = 0; i < n; i++) {
    par[i] = i;
    ran[i] = 0;
  }
}

// 木の根を求める
int find(int x) {
  if (par[x] == x) {
    return x;
  } else {
    return par[x] = find(par[x]);
  }
}

// xとyの属する集合を併合
void unite(int x, int y) {
  x = find(x);
  y = find(y);
  if (x == y)
    return;

  if (ran[x] < ran[y]) {
    par[x] = y;
  } else {
    par[y] = x;
    if (ran[x] == ran[y])
      ran[x]++;
  }
}

// xとyが同じ集合に属するか否か
bool same(int x, int y) { return find(x) == find(y); }

int main() {
  int N, K, L;
  cin >> N >> K >> L;
  init(N);
  for (int i = 0; i < K; i++) {
    int p, q;
    cin >> p >> q;
    p--;
    q--;
    unite(p, q);
  }
  for (int i = 0; i < N; i++) {
    a[i] = find(i);
  }
  init(N);
  for (int i = 0; i < L; i++) {
    int r, s;
    cin >> r >> s;
    r--;
    s--;
    unite(r, s);
  }
  for (int i = 0; i < N; i++) {
    b[i] = find(i);
  }
  map<P, int> M;
  for (int i = 0; i < N; i++) {
    M[P(a[i], b[i])]++;
  }
  for (int i = 0; i < N; i++) {
    if (i)
      cout << " ";
    cout << M[P(a[i], b[i])];
  }
  cout << endl;
}