Problem p03682 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
const lli mod = 1e9 + 7;
const lli pINF = LLONG_MAX;
const lli nINF = -LLONG_MAX;
void fast() {
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
}
lli power(lli a, lli b) {
  lli ans = 1;
  while (b != 0) {
    if (b % 2 == 1) {
      ans *= a;
    }
    b /= 2;
    a *= a;
  }
  return ans;
}
lli invmod(lli a) { return pow(a, mod - 2); }
#define vi vector<int>
#define vlli vector<lli>
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define si(n) scanf("%d", &n)
#define sli(n) scanf("%lld", &n)
#define printi(n) printf("%d\n", n)
#define printli(n) printf("%lld\n", n)
#define all(v) v.begin(), v.end()
#define forn(i, n) for (int i = 0; i < n; i++)
void print(int a[], int n) {
  for (int i = 0; i < n; i++)
    cout << a[i] << " ";
}
pair<pair<lli, lli>, int> point[100005];
vector<pair<lli, pair<int, int>>> edge;
int par[100005];

int find(int u) { return (par[u] == u) ? u : (find(par[u])); }

bool by_x(pair<pair<lli, lli>, int> x, pair<pair<lli, lli>, int> y) {
  return x.F.F < y.F.F;
}

bool by_y(pair<pair<lli, lli>, int> x, pair<pair<lli, lli>, int> y) {
  return x.F.S < y.F.S;
}

void pre() {
  for (int i = 0; i < 100005; i++)
    par[i] = i;
}

bool ok(int u, int v) {
  u = find(u);
  v = find(v);

  if (u != v) {
    par[u] = v;
    return true;
  }
  return false;
}

int main() {
  int n;
  si(n);

  for (int i = 0; i < n; i++) {
    sli(point[i].F.F);
    sli(point[i].F.S);
    point[i].S = i;
  }

  sort(point, point + n, by_x);

  for (int i = 1; i < n; i++) {
    edge.pb(
        mp(point[i].F.F - point[i - 1].F.F, mp(point[i].S, point[i - 1].S)));
  }

  sort(point, point + n, by_y);

  for (int i = 1; i < n; i++) {
    edge.pb(
        mp(point[i].F.S - point[i - 1].F.S, mp(point[i].S, point[i - 1].S)));
  }

  sort(all(edge));

  pre();

  lli ans = 0;
  for (auto i : edge) {
    lli cost = i.F;
    int u = i.S.F;
    int v = i.S.S;

    if (ok(u, v))
      ans += cost;
  }

  cout << ans << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
const lli mod = 1e9 + 7;
const lli pINF = LLONG_MAX;
const lli nINF = -LLONG_MAX;
void fast() {
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
}
lli power(lli a, lli b) {
  lli ans = 1;
  while (b != 0) {
    if (b % 2 == 1) {
      ans *= a;
    }
    b /= 2;
    a *= a;
  }
  return ans;
}
lli invmod(lli a) { return pow(a, mod - 2); }
#define vi vector<int>
#define vlli vector<lli>
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define si(n) scanf("%d", &n)
#define sli(n) scanf("%lld", &n)
#define printi(n) printf("%d\n", n)
#define printli(n) printf("%lld\n", n)
#define all(v) v.begin(), v.end()
#define forn(i, n) for (int i = 0; i < n; i++)
void print(int a[], int n) {
  for (int i = 0; i < n; i++)
    cout << a[i] << " ";
}
pair<pair<lli, lli>, int> point[100005];
vector<pair<lli, pair<int, int>>> edge;
int par[100005];

int find(int u) { return (par[u] == u) ? u : (par[u] = find(par[u])); }

bool by_x(pair<pair<lli, lli>, int> x, pair<pair<lli, lli>, int> y) {
  return x.F.F < y.F.F;
}

bool by_y(pair<pair<lli, lli>, int> x, pair<pair<lli, lli>, int> y) {
  return x.F.S < y.F.S;
}

void pre() {
  for (int i = 0; i < 100005; i++)
    par[i] = i;
}

bool ok(int u, int v) {
  u = find(u);
  v = find(v);

  if (u != v) {
    par[u] = v;
    return true;
  }
  return false;
}

int main() {
  int n;
  si(n);

  for (int i = 0; i < n; i++) {
    sli(point[i].F.F);
    sli(point[i].F.S);
    point[i].S = i;
  }

  sort(point, point + n, by_x);

  for (int i = 1; i < n; i++) {
    edge.pb(
        mp(point[i].F.F - point[i - 1].F.F, mp(point[i].S, point[i - 1].S)));
  }

  sort(point, point + n, by_y);

  for (int i = 1; i < n; i++) {
    edge.pb(
        mp(point[i].F.S - point[i - 1].F.S, mp(point[i].S, point[i - 1].S)));
  }

  sort(all(edge));

  pre();

  lli ans = 0;
  for (auto i : edge) {
    lli cost = i.F;
    int u = i.S.F;
    int v = i.S.S;

    if (ok(u, v))
      ans += cost;
  }

  cout << ans << endl;
  return 0;
}