Problem p01273 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define ll long long
#define INF 1000000005
#define MOD 1000000007
#define EPS 1e-10
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n)-1; i >= 0; --i)
#define srep(i, s, t) for (int i = (int)(s); i < (int)(t); ++i)
#define each(a, b) for (auto(a) : (b))
#define all(v) (v).begin(), (v).end()
#define len(v) (int)(v).size()
#define zip(v) sort(all(v)), v.erase(unique(all(v)), v.end())
#define cmx(x, y) x = max(x, y)
#define cmn(x, y) x = min(x, y)
#define fi first
#define se second
#define pb push_back
#define show(x) cout << #x << " = " << (x) << endl
#define spair(p) cout << #p << ": " << p.fi << " " << p.se << endl
#define svec(v)                                                                \
  cout << #v << ":";                                                           \
  rep(kbrni, v.size()) cout << " " << v[kbrni];                                \
  cout << endl
#define sset(s)                                                                \
  cout << #s << ":";                                                           \
  each(kbrni, s) cout << " " << kbrni;                                         \
  cout << endl
#define smap(m)                                                                \
  cout << #m << ":";                                                           \
  each(kbrni, m) cout << " {" << kbrni.first << ":" << kbrni.second << "}";    \
  cout << endl

using namespace std;

typedef pair<int, int> P;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<double> vd;
typedef vector<P> vp;

const int MAX_N = 100005;

struct tri {
  int t, s, d;
  bool operator<(const tri &another) const { return t < another.t; }
};

class UF {
private:
  int sz;
  vector<int> par, nrank, size;

public:
  UF() {}
  UF(int node_size) {
    sz = node_size;
    par.resize(sz), nrank.resize(sz), size.resize(sz);
    rep(i, sz) {
      par[i] = i;
      nrank[i] = 0;
      size[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 (nrank[x] < nrank[y])
      swap(x, y);
    par[y] = x;
    size[x] += size[y];
    if (nrank[x] == nrank[y])
      nrank[x]++;
  }
  int query(int x) {
    x = find(x);
    return size[x];
  }
  bool same(int x, int y) { return find(x) == find(y); }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  while (1) {
    int n, m;
    cin >> n >> m;
    if (n == 0) {
      break;
    }
    vector<tri> vec(m);
    rep(i, m) {
      int t, s, d;
      cin >> t >> s >> d;
      s--, d--;
      vec[i] = (tri){t, s, d};
    }
    sort(all(vec));
    UF uf(n);
    rep(i, m) {
      if (uf.same(0, vec[i].s)) {
        uf.unite(0, vec[i].t);
      }
    }
    cout << uf.query(0) << endl;
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define ll long long
#define INF 1000000005
#define MOD 1000000007
#define EPS 1e-10
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n)-1; i >= 0; --i)
#define srep(i, s, t) for (int i = (int)(s); i < (int)(t); ++i)
#define each(a, b) for (auto(a) : (b))
#define all(v) (v).begin(), (v).end()
#define len(v) (int)(v).size()
#define zip(v) sort(all(v)), v.erase(unique(all(v)), v.end())
#define cmx(x, y) x = max(x, y)
#define cmn(x, y) x = min(x, y)
#define fi first
#define se second
#define pb push_back
#define show(x) cout << #x << " = " << (x) << endl
#define spair(p) cout << #p << ": " << p.fi << " " << p.se << endl
#define svec(v)                                                                \
  cout << #v << ":";                                                           \
  rep(kbrni, v.size()) cout << " " << v[kbrni];                                \
  cout << endl
#define sset(s)                                                                \
  cout << #s << ":";                                                           \
  each(kbrni, s) cout << " " << kbrni;                                         \
  cout << endl
#define smap(m)                                                                \
  cout << #m << ":";                                                           \
  each(kbrni, m) cout << " {" << kbrni.first << ":" << kbrni.second << "}";    \
  cout << endl

using namespace std;

typedef pair<int, int> P;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<double> vd;
typedef vector<P> vp;

const int MAX_N = 100005;

struct tri {
  int t, s, d;
  bool operator<(const tri &another) const { return t < another.t; }
};

class UF {
private:
  int sz;
  vector<int> par, nrank, size;

public:
  UF() {}
  UF(int node_size) {
    sz = node_size;
    par.resize(sz), nrank.resize(sz), size.resize(sz);
    rep(i, sz) {
      par[i] = i;
      nrank[i] = 0;
      size[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 (nrank[x] < nrank[y])
      swap(x, y);
    par[y] = x;
    size[x] += size[y];
    if (nrank[x] == nrank[y])
      nrank[x]++;
  }
  int query(int x) {
    x = find(x);
    return size[x];
  }
  bool same(int x, int y) { return find(x) == find(y); }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  while (1) {
    int n, m;
    cin >> n >> m;
    if (n == 0) {
      break;
    }
    vector<tri> vec(m);
    rep(i, m) {
      int t, s, d;
      cin >> t >> s >> d;
      s--, d--;
      vec[i] = (tri){t, s, d};
    }
    sort(all(vec));
    UF uf(n);
    rep(i, m) {
      if (uf.same(0, vec[i].s)) {
        uf.unite(0, vec[i].d);
      }
    }
    cout << uf.query(0) << endl;
  }
  return 0;
}