Problem p03682 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <vector>
using namespace std;
#define INF 11000000000
#define MOD 1000000007
typedef long long ll;
typedef pair<pair<ll, ll>, int> p;
typedef pair<ll, ll> P;

int par[110000]; // 親
int ran[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); }

struct edge {
  int u, v, cost;
};

bool comp(const edge &e1, const edge &e2) { return e1.cost < e2.cost; }

edge es[110000];
int V, E, mycount = 0; // 頂点数と辺数
int N;

ll kruskal() {
  sort(es, es + E, comp);
  int res = 0;
  for (int i = 0; i < E; i++) {
    edge e = es[i];
    if (!same(e.u, e.v)) {
      unite(e.u, e.v);
      res += e.cost;
    }
  }
  return res;
}

void koutiku(p z[]) {
  for (int i = 0; i < N - 1; i++) {
    es[mycount].u = z[i].second;
    es[mycount].v = z[i + 1].second;
    es[mycount].cost = z[i + 1].first.first - z[i].first.first;
    mycount++;
  }
}

int main() {
  cin >> N;
  init(N);
  p z1[110000], z2[110000];
  for (int i = 0; i < N; i++) {
    cin >> z1[i].first.first >> z1[i].first.second;
    z1[i].second = i;
    z2[i].first.first = z1[i].first.second;
    z2[i].first.second = z1[i].first.first;
    z2[i].second = i;
  }
  sort(z1, z1 + N);
  sort(z2, z2 + N);
  koutiku(z1);
  koutiku(z2);
  E = mycount;
  cout << kruskal() << endl;
  ;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <vector>
using namespace std;
#define INF 11000000000
#define MOD 1000000007
typedef long long ll;
typedef pair<pair<ll, ll>, int> p;
typedef pair<ll, ll> P;

int par[110000]; // 親
int ran[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); }

struct edge {
  int u, v, cost;
};

bool comp(const edge &e1, const edge &e2) { return e1.cost < e2.cost; }

edge es[1100000];
int V, E, mycount = 0; // 頂点数と辺数
int N;

ll kruskal() {
  sort(es, es + E, comp);
  int res = 0;
  for (int i = 0; i < E; i++) {
    edge e = es[i];
    if (!same(e.u, e.v)) {
      unite(e.u, e.v);
      res += e.cost;
    }
  }
  return res;
}

void koutiku(p z[]) {
  for (int i = 0; i < N - 1; i++) {
    es[mycount].u = z[i].second;
    es[mycount].v = z[i + 1].second;
    es[mycount].cost = z[i + 1].first.first - z[i].first.first;
    mycount++;
  }
}

int main() {
  cin >> N;
  init(N);
  p z1[110000], z2[110000];
  for (int i = 0; i < N; i++) {
    cin >> z1[i].first.first >> z1[i].first.second;
    z1[i].second = i;
    z2[i].first.first = z1[i].first.second;
    z2[i].first.second = z1[i].first.first;
    z2[i].second = i;
  }
  sort(z1, z1 + N);
  sort(z2, z2 + N);
  koutiku(z1);
  koutiku(z2);
  E = mycount;
  cout << kruskal() << endl;
  ;
}