Problem p02998 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T> using vt = vector<T>;
template <class T> using vvt = vector<vt<T>>;
template <class T> using ttt = tuple<T, T>;
using tii = tuple<int, int>;
using vi = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define pb push_back
#define mt make_tuple
#define ALL(a) (a).begin(), (a).end()
#define FST first
#define SEC second
#define DEB cerr << "!" << endl
#define SHOW(a, b) cerr << (a) << " " << (b) << endl
#define DIV int(1e9 + 7)
const int INF = (INT_MAX / 2);
const ll LLINF = (LLONG_MAX / 2);
const double eps = 1e-8;
// const double PI = M_PI;
inline ll pow(ll x, ll n, ll m) {
  ll r = 1;
  while (n > 0) {
    if ((n & 1) == 1)
      r = r * x % m;
    x = x * x % m;
    n >>= 1;
  }
  return r % m;
}
inline ll lcm(ll d1, ll d2) { return d1 / __gcd(d1, d2) * d2; }
#define chmax(a, b) a = max(a, b)
class UF {
public:
  vi value;
  vi over; // When over < 0, 'over' keep number of node(using negative number).
           // -1 means this tree is a node.
  int root(int index) {
    int t = index;
    stack<int> stack_i;
    while (over[t] >= 0) {
      stack_i.push(t);
      t = over[t];
    }
    while (!stack_i.empty()) {
      int i = stack_i.top();
      stack_i.pop();
      over[i] = t;
    } // reconnect
    return t;
  }
  void merge(int a, int b) {
    if (this->root(a) == this->root(b))
      return;
    over[root(a)] += over[root(b)]; // over have a number of nodes.
    over[root(b)] = root(a);
  }
  int NumNode(int a) { return -over[root(a)]; }
  UF(int Nodes) {
    value.resize(Nodes);
    over.resize(Nodes);
    rep(i, Nodes) over[i] = -1;
  }
};
/*Coding Space*/
UF uf(300050);
int cnt[200020][2] = {};
const int D = 100005;
int main() {
  int n;
  cin >> n;
  rep(i, n) {
    int x, y;
    cin >> x >> y;
    y += D;
    uf.merge(x, y);
  }
  rep(i, 200020) { cnt[uf.root(i)][i / D]++; }
  ll ans = 0;
  rep(i, 200020) ans += cnt[i][0] * cnt[i][1];
  cout << ans - n << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T> using vt = vector<T>;
template <class T> using vvt = vector<vt<T>>;
template <class T> using ttt = tuple<T, T>;
using tii = tuple<int, int>;
using vi = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define pb push_back
#define mt make_tuple
#define ALL(a) (a).begin(), (a).end()
#define FST first
#define SEC second
#define DEB cerr << "!" << endl
#define SHOW(a, b) cerr << (a) << " " << (b) << endl
#define DIV int(1e9 + 7)
const int INF = (INT_MAX / 2);
const ll LLINF = (LLONG_MAX / 2);
const double eps = 1e-8;
// const double PI = M_PI;
inline ll pow(ll x, ll n, ll m) {
  ll r = 1;
  while (n > 0) {
    if ((n & 1) == 1)
      r = r * x % m;
    x = x * x % m;
    n >>= 1;
  }
  return r % m;
}
inline ll lcm(ll d1, ll d2) { return d1 / __gcd(d1, d2) * d2; }
#define chmax(a, b) a = max(a, b)
class UF {
public:
  vi value;
  vi over; // When over < 0, 'over' keep number of node(using negative number).
           // -1 means this tree is a node.
  int root(int index) {
    int t = index;
    stack<int> stack_i;
    while (over[t] >= 0) {
      stack_i.push(t);
      t = over[t];
    }
    while (!stack_i.empty()) {
      int i = stack_i.top();
      stack_i.pop();
      over[i] = t;
    } // reconnect
    return t;
  }
  void merge(int a, int b) {
    if (this->root(a) == this->root(b))
      return;
    over[root(a)] += over[root(b)]; // over have a number of nodes.
    over[root(b)] = root(a);
  }
  int NumNode(int a) { return -over[root(a)]; }
  UF(int Nodes) {
    value.resize(Nodes);
    over.resize(Nodes);
    rep(i, Nodes) over[i] = -1;
  }
};
/*Coding Space*/
UF uf(300050);
ll cnt[400020][2] = {};
const int D = 100005;
int main() {
  int n;
  cin >> n;
  rep(i, n) {
    int x, y;
    cin >> x >> y;
    y += D;
    uf.merge(x, y);
  }
  rep(i, 200020) { cnt[uf.root(i)][i / D]++; }
  ll ans = 0;
  rep(i, 200020) ans += cnt[i][0] * cnt[i][1];
  cout << ans - n << endl;
}