Problem p02573 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
using LL = long long;
#define FOR(i, x, y)                                                           \\
  for (decay<decltype(y)>::type i = (x), _##i = (y); i < _##i; ++i)
#define FORD(i, x, y)                                                          \\
  for (decay<decltype(x)>::type i = (x), _##i = (y); i > _##i; --i)
#ifdef zerol
#define dbg(x...)                                                              \\
  do {                                                                         \\
    cout << "\\033[32;1m" << #x << " -> ";                                      \\
    err(x);                                                                    \\
  } while (0)
void err() { cout << "\\033[39;0m" << endl; }
template <template <typename...> class T, typename t, typename... A>
void err(T<t> a, A... x) {
  for (auto v : a)
    cout << v << ' ';
  err(x...);
}
template <typename T, typename... A> void err(T a, A... x) {
  cout << a << ' ';
  err(x...);
}
#else
#define dbg(...)
#endif

#ifdef L_JUDGE
#pragma warning(disable : 4996)
#endif

using namespace std;

template <typename T> inline bool read(T &ret) {
  T x = 0, f = 1;
  char ch = getchar();
  while (ch != EOF && (ch > '9' || ch < '0')) {
    if (ch == '-')
      f = -1;
    ch = getchar();
  }
  if (EOF == ch)
    return false;
  do
    x = x * 10 + ch - 48, ch = getchar();
  while (ch >= '0' && ch <= '9');
  ret = x * f;
  return true;
}

inline char nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
template <typename T> bool rn(T &v) {
  static char ch;
  while (ch != EOF && !isdigit(ch))
    ch = nc();
  if (ch == EOF)
    return false;
  for (v = 0; isdigit(ch); ch = nc())
    v = v * 10 + ch - '0';
  return true;
}

template <typename T> void o(T p) {
  static int stk[70], tp;
  if (p == 0) {
    putchar('0');
    return;
  }
  if (p < 0) {
    p = -p;
    putchar('-');
  }
  while (p)
    stk[++tp] = p % 10, p /= 10;
  while (tp)
    putchar(stk[tp--] + '0');
}

LL bin(LL x, LL n, LL MOD) {
  LL ret = MOD != 1;
  for (x %= MOD; n; n >>= 1, x = x * x % MOD)
    if (n & 1)
      ret = ret * x % MOD;
  return ret;
}
inline LL get_inv(LL x, LL p) { return bin(x, p - 2, p); }

void Solve() {}

const int MAXN = 2e5 + 10;
int N, M;
int pa[MAXN];
int cnt[MAXN];

int find(int x) {
  if (x == pa[x])
    return x;
  pa[x] = find(pa[x]);
  return pa[x];
}

int main() {
#ifdef L_JUDGE
  freopen("in1.txt", "r", stdin);
  //		freopen("out.txt","w",stdout);
#endif
  // std::ios::sync_with_stdio(false);
  // std::cin.tie(0);
  while (cin >> N >> M) {
    int a, b;
    for (int i = 1; i <= N; i++) {
      pa[i] = i;
      cnt[i] = 1;
    }
    for (int i = 0; i < M; i++) {
      scanf("%d%d", &a, &b);
      int fa = find(a);
      int fb = find(b);
      if (fa != fb) {
        pa[fa] = fb;
        cnt[fb] += cnt[fa];
      }
    }
    int ans = 0;
    for (int i = 1; i <= N; i++) {
      ans = max(ans, cnt[i]);
    }
    cout << ans << endl;
  }
  return 0;

#ifdef L_JUDGE
  fclose(stdin);
  fclose(stdout);
  //		system("out.txt");
#endif

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
using LL = long long;
#define FOR(i, x, y)                                                           \\
  for (decay<decltype(y)>::type i = (x), _##i = (y); i < _##i; ++i)
#define FORD(i, x, y)                                                          \\
  for (decay<decltype(x)>::type i = (x), _##i = (y); i > _##i; --i)
#ifdef zerol
#define dbg(x...)                                                              \\
  do {                                                                         \\
    cout << "\\033[32;1m" << #x << " -> ";                                      \\
    err(x);                                                                    \\
  } while (0)
void err() { cout << "\\033[39;0m" << endl; }
template <template <typename...> class T, typename t, typename... A>
void err(T<t> a, A... x) {
  for (auto v : a)
    cout << v << ' ';
  err(x...);
}
template <typename T, typename... A> void err(T a, A... x) {
  cout << a << ' ';
  err(x...);
}
#else
#define dbg(...)
#endif

#ifdef L_JUDGE
#pragma warning(disable : 4996)
#endif

using namespace std;

template <typename T> inline bool read(T &ret) {
  T x = 0, f = 1;
  char ch = getchar();
  while (ch != EOF && (ch > '9' || ch < '0')) {
    if (ch == '-')
      f = -1;
    ch = getchar();
  }
  if (EOF == ch)
    return false;
  do
    x = x * 10 + ch - 48, ch = getchar();
  while (ch >= '0' && ch <= '9');
  ret = x * f;
  return true;
}

inline char nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
template <typename T> bool rn(T &v) {
  static char ch;
  while (ch != EOF && !isdigit(ch))
    ch = nc();
  if (ch == EOF)
    return false;
  for (v = 0; isdigit(ch); ch = nc())
    v = v * 10 + ch - '0';
  return true;
}

template <typename T> void o(T p) {
  static int stk[70], tp;
  if (p == 0) {
    putchar('0');
    return;
  }
  if (p < 0) {
    p = -p;
    putchar('-');
  }
  while (p)
    stk[++tp] = p % 10, p /= 10;
  while (tp)
    putchar(stk[tp--] + '0');
}

LL bin(LL x, LL n, LL MOD) {
  LL ret = MOD != 1;
  for (x %= MOD; n; n >>= 1, x = x * x % MOD)
    if (n & 1)
      ret = ret * x % MOD;
  return ret;
}
inline LL get_inv(LL x, LL p) { return bin(x, p - 2, p); }

void Solve() {}

const int MAXN = 2e5 + 10;
int N, M;
int pa[MAXN];
int cnt[MAXN];

int find(int x) {
  int root = x;
  while (pa[root] != root) {
    root = pa[root];
  }
  pa[x] = root;
  return root;
}

int main() {
#ifdef L_JUDGE
  freopen("in1.txt", "r", stdin);
  //		freopen("out.txt","w",stdout);
#endif
  // std::ios::sync_with_stdio(false);
  // std::cin.tie(0);
  while (cin >> N >> M) {
    int a, b;
    for (int i = 1; i <= N; i++) {
      pa[i] = i;
    }
    for (int i = 0; i < M; i++) {
      scanf("%d%d", &a, &b);
      int fa = find(a);
      int fb = find(b);
      if (fa != fb) {
        pa[fa] = fb;
      }
    }
    memset(cnt, 0, sizeof(cnt));
    int ans = 0;
    for (int i = 1; i <= N; i++) {
      int fi = find(i);
      cnt[fi]++;
      ans = max(ans, cnt[fi]);
    }
    cout << ans << endl;
  }
  return 0;

#ifdef L_JUDGE
  fclose(stdin);
  fclose(stdout);
  //		system("out.txt");
#endif

  return 0;
}