Problem p02573 (C++) — buggy submission, verdict: Runtime Error

/*~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
*$* WRITER:kakitamasziru/OxOmisosiru *$*
~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=*/
#ifdef LOCAL_JUDGE
#define _GLIBCXX_DEBUG
#endif
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <cstdint>   // int64_t, int*_t
#include <iomanip>
#include <iostream> // cout, endl, cin
#include <limits>   //setprecision
#include <string>   // string, to_string, stoi
#include <tuple>    // tuple, make_tuple
#include <utility>  // pair, make_pair
#include <vector>   // vector
// #include <cstdio> // printf
#include <map>   // map
#include <queue> // queue, priority_queue
#include <set>   // set
// #include <unordered_set> //unordered_set
#include <bitset> // bitset
#include <cmath>  //abs,,,
#include <deque>  // deque
#include <math.h> //pow,,,
#include <stack>  // stack
#define endl "\\n";
using namespace std;

const long long INF = 4000000000000000001;
const int inf = 1001001001;
const int MOD = 1000000007;
typedef pair<long long, long long> P;

// Solve N^M. This, mod_pow use Iterative Square Method.
long long mod_pow(long long N, long long M) {
  if (M == 0)
    return 1;
  long long res = mod_pow((N * N) % MOD, M / 2);
  // When end-of-a-lin bit is 1, times simple N.
  if (M & 1)
    res = (res * N) % MOD;
  return res %= MOD;
}
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }

int parent[214514];
long long connectSize[214514];
int tall[214514];

int searchRoot(int V) {
  // 頂点Vの親==頂点Vということは頂点Vはその木の根である。
  if (parent[V] == V) {
    return V;
  } else {
    // 一回ごとにparent[V]を更新する。辺の縮約
    return parent[V] = searchRoot(parent[V]);
  }
}

bool same(int X, int Y) {
  if (searchRoot(X) == searchRoot(Y))
    return true;
  else
    return false;
}

void unite(int X, int Y) {
  // X,Yの高さが高い方の木の「高さ0の根」に高さが低い方の根を付ける
  int Xroot = searchRoot(X);
  int Yroot = searchRoot(Y);
  // 同じ根を持つ木を併合することはしなくてよい
  if (Xroot == Yroot)
    return;
  if (tall[Xroot] > tall[Yroot]) {
    parent[Yroot] = Xroot;
    connectSize[Xroot] += connectSize[Yroot];
    connectSize[Yroot] = connectSize[Yroot];
  } else if (tall[Xroot] == tall[Yroot]) {
    parent[Yroot] = Xroot;
    // 高さが同じとき、YがXの根の下に入るのでYの深さはXより1深くなる
    tall[Yroot]++;
    connectSize[Xroot] += connectSize[Yroot];
  } else {
    parent[Xroot] = Yroot;
    connectSize[Yroot] += connectSize[Xroot];
    connectSize[Xroot] = connectSize[Yroot];
  }
}

int main() {
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int N;
  cin >> N;
  int M;
  cin >> M;
  for (int i = 0; i < N; i++) {
    parent[i] = i;
    connectSize[i] = 1;
    tall[i] = 0;
  }
  for (int i = 0; i < M; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    unite(a, b);
  }
  long long ans = 0;
  for (int i = 0; i < N; i++) {
    ans = max(connectSize[i], ans);
  }
  /*for(int i = 0;i<N;i++){
      ans = max(ans,parentCount.at(i));
  }*/
  cout << ans << endl;
}

Error: 0

Fixed submission:

/*~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
*$* WRITER:kakitamasziru/OxOmisosiru *$*
~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=*/
#ifdef LOCAL_JUDGE
#define _GLIBCXX_DEBUG
#endif
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <cstdint>   // int64_t, int*_t
#include <iomanip>
#include <iostream> // cout, endl, cin
#include <limits>   //setprecision
#include <string>   // string, to_string, stoi
#include <tuple>    // tuple, make_tuple
#include <utility>  // pair, make_pair
#include <vector>   // vector
// #include <cstdio> // printf
#include <map>   // map
#include <queue> // queue, priority_queue
#include <set>   // set
// #include <unordered_set> //unordered_set
#include <bitset> // bitset
#include <cmath>  //abs,,,
#include <deque>  // deque
#include <math.h> //pow,,,
#include <stack>  // stack
#define endl "\\n";
using namespace std;

const long long INF = 4000000000000000001;
const int inf = 1001001001;
const int MOD = 1000000007;
typedef pair<long long, long long> P;

// Solve N^M. This, mod_pow use Iterative Square Method.
long long mod_pow(long long N, long long M) {
  if (M == 0)
    return 1;
  long long res = mod_pow((N * N) % MOD, M / 2);
  // When end-of-a-lin bit is 1, times simple N.
  if (M & 1)
    res = (res * N) % MOD;
  return res %= MOD;
}
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }

int parent[114514];
long long connectSize[114514];
int tall[114514];

int searchRoot(int V) {
  // 頂点Vの親==頂点Vということは頂点Vはその木の根である。
  if (parent[V] == V) {
    return V;
  } else {
    // 一回ごとにparent[V]を更新する。辺の縮約
    return parent[V] = searchRoot(parent[V]);
  }
}

bool same(int X, int Y) {
  if (searchRoot(X) == searchRoot(Y))
    return true;
  else
    return false;
}

void unite(int X, int Y) {
  // X,Yの高さが高い方の木の「高さ0の根」に高さが低い方の根を付ける
  int Xroot = searchRoot(X);
  int Yroot = searchRoot(Y);
  // 同じ根を持つ木を併合することはしなくてよい
  if (Xroot == Yroot)
    return;
  if (tall[Xroot] > tall[Yroot]) {
    parent[Yroot] = Xroot;
    connectSize[Xroot] += connectSize[Yroot];
    connectSize[Yroot] = connectSize[Yroot];
  } else if (tall[Xroot] == tall[Yroot]) {
    parent[Yroot] = Xroot;
    // 高さが同じとき、YがXの根の下に入るのでYの深さはXより1深くなる
    tall[Yroot]++;
    connectSize[Xroot] += connectSize[Yroot];
  } else {
    parent[Xroot] = Yroot;
    connectSize[Yroot] += connectSize[Xroot];
    connectSize[Xroot] = connectSize[Yroot];
  }
}

int main() {
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int N;
  cin >> N;
  int M;
  cin >> M;
  for (int i = 0; i < N; i++) {
    parent[i] = i;
    connectSize[i] = 1;
    tall[i] = 0;
  }
  for (int i = 0; i < M; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    unite(a, b);
  }
  long long ans = 0;
  vector<int> parentCount(200005);
  for (int i = 0; i < N; i++) {
    ans = max(connectSize[i], ans);
  }
  /*for(int i = 0;i<N;i++){
      ans = max(ans,parentCount.at(i));
  }*/
  cout << ans << endl;
}