Problem p02573 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using usize = std::size_t;
using namespace std;

#define rep(i, max) for (usize i = 0; i < max; ++i)
#define loop while (true)
#define allOf(collection) collection.begin(), collection.end()

unique_ptr<string> readLine() {
  unique_ptr<string> line(new string());
  getline(cin, *line);
  return line;
}
template <typename T1, typename T2> pair<T1, T2> readPair() {
  T1 res1;
  cin >> res1;
  T2 res2;
  cin >> res2;
  readLine();
  return make_pair(res1, res2);
}
template <typename T> unique_ptr<vector<T>> readVector(usize num) {
  unique_ptr<vector<T>> list(new vector<T>(num));
  rep(i, num) cin >> (*list)[i];
  readLine();
  return list;
}
void readValues() { readLine(); }
template <typename H, typename... T> void readValues(H &head, T &&...tails) {
  H a;
  cin >> a;
  head = a;
  readValues(forward<T>(tails)...);
}
void writeLine() { cout << endl; }
template <typename T> void write(const T &arg) { cout << arg; }
template <typename T> void writeLine(const vector<T> &arg) {
  if (arg.empty()) {
    writeLine();
    return;
  }
  write(arg[0]);
  for (int i = 1; i < arg.size(); ++i) {
    write(" ");
    write(arg[i]);
  }
  writeLine();
}
template <typename T> void writeLine(const T &arg) { cout << arg << endl; }
void recursiveCombination(vector<i32> &indexes, i32 s, i32 rest,
                          function<void(vector<i32> &)> f) {
  if (rest == 0) {
    f(indexes);
  } else {
    if (s < 0)
      return;
    recursiveCombination(indexes, s - 1, rest, f);
    indexes[rest - 1] = s;
    recursiveCombination(indexes, s - 1, rest - 1, f);
  }
}
void foreachWithCombination(i32 n, i32 k, function<void(vector<i32> &)> f) {
  auto indexes = vector<i32>(k);
  recursiveCombination(indexes, n - 1, k, f);
}
void foreachWithPermutaton(i32 n, function<void(vector<i32> &)> f) {
  auto indexes = vector<i32>();
  indexes.reserve(n);
  rep(i, n) indexes.push_back(i);
  do
    f(indexes);
  while (next_permutation(allOf(indexes)));
}
void foreachWithPermutaton(i32 n, i32 k, function<void(vector<i32> &)> f) {
  foreachWithCombination(n, k, [=](vector<i32> &combIndexes) {
    foreachWithPermutaton(k, [=](vector<i32> &permIndexes) {
      auto indexes = vector<i32>();
      indexes.reserve(k);
      rep(i, k) { indexes.push_back(combIndexes[permIndexes[i]]); }
      f(indexes);
    });
  });
}
void program();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  program();
}

struct UnionFind {

  vector<i32> list;

  UnionFind(i32 size) { list = vector<i32>(size, -1); }

  i32 root(i32 x) {
    if (list[x] < 0)
      return x;
    else
      return root(list[x]);
  }

  void unite(i32 x, i32 y) {
    i32 xRoot = root(x);
    i32 yRoot = root(y);
    if (xRoot == yRoot)
      return;
    list[xRoot] += list[yRoot];
    list[yRoot] = xRoot;
  }

  i32 sizeAt(i32 n) { return max(0, -list[n]); }
};

int n;
int m;

void program() {
  readValues(n, m);
  UnionFind uf = UnionFind(n);
  rep(i, m) {
    auto info = readPair<i32, i32>();
    uf.unite(info.first - 1, info.second - 1);
  }
  i32 maxi = 0;
  rep(i, n) { maxi = max(maxi, uf.sizeAt(i)); }
  writeLine(maxi);
}

Fixed submission:
#include <bits/stdc++.h>

using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using usize = std::size_t;
using namespace std;

#define rep(i, max) for (usize i = 0; i < max; ++i)
#define loop while (true)
#define allOf(collection) collection.begin(), collection.end()

unique_ptr<string> readLine() {
  unique_ptr<string> line(new string());
  getline(cin, *line);
  return line;
}
template <typename T1, typename T2> pair<T1, T2> readPair() {
  T1 res1;
  cin >> res1;
  T2 res2;
  cin >> res2;
  readLine();
  return make_pair(res1, res2);
}
template <typename T> unique_ptr<vector<T>> readVector(usize num) {
  unique_ptr<vector<T>> list(new vector<T>(num));
  rep(i, num) cin >> (*list)[i];
  readLine();
  return list;
}
void readValues() { readLine(); }
template <typename H, typename... T> void readValues(H &head, T &&...tails) {
  H a;
  cin >> a;
  head = a;
  readValues(forward<T>(tails)...);
}
void writeLine() { cout << endl; }
template <typename T> void write(const T &arg) { cout << arg; }
template <typename T> void writeLine(const vector<T> &arg) {
  if (arg.empty()) {
    writeLine();
    return;
  }
  write(arg[0]);
  for (int i = 1; i < arg.size(); ++i) {
    write(" ");
    write(arg[i]);
  }
  writeLine();
}
template <typename T> void writeLine(const T &arg) { cout << arg << endl; }
void recursiveCombination(vector<i32> &indexes, i32 s, i32 rest,
                          function<void(vector<i32> &)> f) {
  if (rest == 0) {
    f(indexes);
  } else {
    if (s < 0)
      return;
    recursiveCombination(indexes, s - 1, rest, f);
    indexes[rest - 1] = s;
    recursiveCombination(indexes, s - 1, rest - 1, f);
  }
}
void foreachWithCombination(i32 n, i32 k, function<void(vector<i32> &)> f) {
  auto indexes = vector<i32>(k);
  recursiveCombination(indexes, n - 1, k, f);
}
void foreachWithPermutaton(i32 n, function<void(vector<i32> &)> f) {
  auto indexes = vector<i32>();
  indexes.reserve(n);
  rep(i, n) indexes.push_back(i);
  do
    f(indexes);
  while (next_permutation(allOf(indexes)));
}
void foreachWithPermutaton(i32 n, i32 k, function<void(vector<i32> &)> f) {
  foreachWithCombination(n, k, [=](vector<i32> &combIndexes) {
    foreachWithPermutaton(k, [=](vector<i32> &permIndexes) {
      auto indexes = vector<i32>();
      indexes.reserve(k);
      rep(i, k) { indexes.push_back(combIndexes[permIndexes[i]]); }
      f(indexes);
    });
  });
}
void program();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  program();
}

struct UnionFind {

  vector<i32> list;

  UnionFind(i32 size) { list = vector<i32>(size, -1); }

  i32 root(i32 x) {
    if (list[x] < 0)
      return x;
    else
      return root(list[x]);
  }

  void unite(i32 x, i32 y) {
    i32 xRoot = root(x);
    i32 yRoot = root(y);
    if (xRoot == yRoot)
      return;
    if (list[xRoot] > list[yRoot])
      swap(xRoot, yRoot);
    list[xRoot] += list[yRoot];
    list[yRoot] = xRoot;
  }

  i32 sizeAt(i32 n) { return max(0, -list[n]); }
};

int n;
int m;

void program() {
  readValues(n, m);
  UnionFind uf = UnionFind(n);
  rep(i, m) {
    auto info = readPair<i32, i32>();
    uf.unite(info.first - 1, info.second - 1);
  }
  i32 maxi = 0;
  rep(i, n) { maxi = max(maxi, uf.sizeAt(i)); }
  writeLine(maxi);
}