Problem p03682 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int Inf = 2100000010;
constexpr ll INF = 2000000000000000000;
constexpr ll MOD = 1000000007;
const double PI = 3.1415926535897;
typedef pair<ll, ll> P;
typedef pair<int, P> PP;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

void mod(ll &val, ll M) {
  val = val % M;
  if (val < 0) {
    val += M;
  }
}

template <typename T> T RS(T N, T P, T M) {
  if (P == 0) {
    return 1;
  }
  if (P < 0) {
    return 0;
  }
  if (P % 2 == 0) {
    ll t = RS(N, P / 2, M);
    if (M == -1)
      return t * t;
    return t * t % M;
  }
  if (M == -1) {
    return N * RS(N, P - 1, M);
  }
  return N * RS(N, P - 1, M) % M;
}

struct Union_find {
  int par[200010]; // 親
  int siz
      [200010]; // 根ノードiの木に含まれる要素数。iが根ノード出ない場合無意味な値となる。

  // n要素で初期化
  Union_find(int n) {
    for (int i = 0; i < n; i++) {
      par[i] = i;
      siz[i] = 1;
    }
  }

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

  // ｘとｙの属する集合を併合
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) {
      return;
    }
    if (siz[x] < siz[y]) {
      swap(x, y);
    }
    par[y] = x;
    siz[x] += siz[y];
  }

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

  int size(int x) { return siz[find(x)]; }
};

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

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

int V, E;
edge graph[100010];

ll Kruskal() {
  sort(graph, graph + E, comp);
  Union_find uf(V);
  ll ret = 0;
  for (int i = 0; i < E; i++) {
    edge e = graph[i];
    if (!uf.same(e.u, e.v)) {
      uf.unite(e.u, e.v);
      ret += e.cost;
    }
  }
  return ret;
}

int main() {
  cin >> V;
  E = V * 2 - 2;
  vector<tuple<int, int, int>> vec(V);
  for (int i = 0; i < V; i++) {
    int A, B;
    cin >> A >> B;
    vec.at(i) = make_tuple(A, B, i);
  }
  sort(vec.begin(), vec.end());
  for (int i = 0; i < V - 1; i++) {
    graph[i] = edge{get<2>(vec.at(i)), get<2>(vec.at(i + 1)),
                    get<0>(vec.at(i + 1)) - get<0>(vec.at(i))};
    swap(get<0>(vec.at(i)), get<1>(vec.at(i)));
  }
  swap(get<0>(vec.at(V - 1)), get<1>(vec.at(V - 1)));
  sort(vec.begin(), vec.end());
  for (int i = 0; i < V - 1; i++) {
    graph[V - 1 + i] = edge{get<2>(vec.at(i)), get<2>(vec.at(i + 1)),
                            get<0>(vec.at(i + 1)) - get<0>(vec.at(i))};
  }
  cout << Kruskal() << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int Inf = 2100000010;
constexpr ll INF = 2000000000000000000;
constexpr ll MOD = 1000000007;
const double PI = 3.1415926535897;
typedef pair<ll, ll> P;
typedef pair<int, P> PP;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

void mod(ll &val, ll M) {
  val = val % M;
  if (val < 0) {
    val += M;
  }
}

template <typename T> T RS(T N, T P, T M) {
  if (P == 0) {
    return 1;
  }
  if (P < 0) {
    return 0;
  }
  if (P % 2 == 0) {
    ll t = RS(N, P / 2, M);
    if (M == -1)
      return t * t;
    return t * t % M;
  }
  if (M == -1) {
    return N * RS(N, P - 1, M);
  }
  return N * RS(N, P - 1, M) % M;
}

struct Union_find {
  int par[200010]; // 親
  int siz
      [200010]; // 根ノードiの木に含まれる要素数。iが根ノード出ない場合無意味な値となる。

  // n要素で初期化
  Union_find(int n) {
    for (int i = 0; i < n; i++) {
      par[i] = i;
      siz[i] = 1;
    }
  }

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

  // ｘとｙの属する集合を併合
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) {
      return;
    }
    if (siz[x] < siz[y]) {
      swap(x, y);
    }
    par[y] = x;
    siz[x] += siz[y];
  }

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

  int size(int x) { return siz[find(x)]; }
};

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

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

int V, E;
edge graph[200010];

ll Kruskal() {
  sort(graph, graph + E, comp);
  Union_find uf(V);
  ll ret = 0;
  for (int i = 0; i < E; i++) {
    edge e = graph[i];
    if (!uf.same(e.u, e.v)) {
      uf.unite(e.u, e.v);
      ret += e.cost;
    }
  }
  return ret;
}

int main() {
  cin >> V;
  E = V * 2 - 2;
  vector<tuple<int, int, int>> vec(V);
  for (int i = 0; i < V; i++) {
    int A, B;
    cin >> A >> B;
    vec.at(i) = make_tuple(A, B, i);
  }
  sort(vec.begin(), vec.end());
  for (int i = 0; i < V - 1; i++) {
    graph[i] = edge{get<2>(vec.at(i)), get<2>(vec.at(i + 1)),
                    get<0>(vec.at(i + 1)) - get<0>(vec.at(i))};
    swap(get<0>(vec.at(i)), get<1>(vec.at(i)));
  }
  swap(get<0>(vec.at(V - 1)), get<1>(vec.at(V - 1)));
  sort(vec.begin(), vec.end());
  for (int i = 0; i < V - 1; i++) {
    graph[V - 1 + i] = edge{get<2>(vec.at(i)), get<2>(vec.at(i + 1)),
                            get<0>(vec.at(i + 1)) - get<0>(vec.at(i))};
  }
  cout << Kruskal() << endl;
}