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

#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <bitset>    // bitset
#include <cctype>    // isupper, islower, isdigit, toupper, tolower
#include <climits>
#include <cstdint> // int64_t, int*_t
#include <cstdio>  // printf
#include <deque>   // deque
#include <functional>
#include <iomanip> //setprecision
#include <iostream>
#include <map> // map
#include <math.h>
#include <queue>         // queue, priority_queue
#include <set>           // set
#include <stack>         // stack
#include <string>        // string, to_string, stoi
#include <tuple>         // tuple, make_tuple
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <utility>       // pair, make_pair
#include <vector>        // vector
using namespace std;
template <typename T> bool chmax(T &u, const T z) {
  if (u < z) {
    u = z;
    return true;
  } else
    return false;
}
template <typename T> bool chmin(T &u, const T z) {
  if (u > z) {
    u = z;
    return true;
  } else
    return false;
}
#define ll long long
const ll INF = 1LL << 60;
const ll mod = 100000007;
#define rep(i, n) for (ll i = 0; i < (ll)(n); ++i)
vector<pair<ll, ll>> s[100001];
ll dis[100001];
struct UnionFind {
  vector<int> d;                     // データ
  UnionFind(int n = 0) : d(n, -1) {} // 初期値は全部根(-1)とする
  int find(int x) {
    if (d[x] < 0)
      return x;
    return d[x] = find(d[x]);
  }
  bool unite(int x, int y) { // 2つ頂点をくっつける
    x = find(x);
    y = find(y);
    if (x == y)
      return false; // 一致していればOK
    if (d[x] > d[y])
      swap(x, y); // サイズが大きいものをxとする（根は負なので大小関係に注意）
    d[x] += d[y]; // サイズの合算
    d[y] = x;     // 根をxとする
    return false;
  }
  bool same(int x, int y) { // 同じ集合に属しているかを判定する
    return find(x) == find(y);
  }
  int size(int x) { // サイズを求める（根はマイナスなので、マイナスをとる）
    return -d[find(x)];
  }
};
ll deg[200200];
vector<ll> to[200200];
int main() {
  ll a, b;
  cin >> a >> b;
  UnionFind c(a);
  rep(i, b) {
    ll x, y;
    cin >> x >> y;
    x--;
    y--;
    deg[x]++;
    deg[y]++;
    c.unite(x, y);
  }
  int ans = 0;
  rep(i, a) { ans = max(ans, c.size(i)); }
  cout << ans;
}

Error: -6
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc


Fixed submission:

#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <bitset>    // bitset
#include <cctype>    // isupper, islower, isdigit, toupper, tolower
#include <climits>
#include <cstdint> // int64_t, int*_t
#include <cstdio>  // printf
#include <deque>   // deque
#include <functional>
#include <iomanip> //setprecision
#include <iostream>
#include <map> // map
#include <math.h>
#include <queue>         // queue, priority_queue
#include <set>           // set
#include <stack>         // stack
#include <string>        // string, to_string, stoi
#include <tuple>         // tuple, make_tuple
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <utility>       // pair, make_pair
#include <vector>        // vector
using namespace std;
template <typename T> bool chmax(T &u, const T z) {
  if (u < z) {
    u = z;
    return true;
  } else
    return false;
}
template <typename T> bool chmin(T &u, const T z) {
  if (u > z) {
    u = z;
    return true;
  } else
    return false;
}
#define ll long long
const ll INF = 1LL << 60;
const ll mod = 100000007;
#define rep(i, n) for (ll i = 0; i < (ll)(n); ++i)
vector<vector<bool>> d(100001, vector<bool>(100100));
vector<pair<ll, ll>> s[100001];
ll dis[100001];
int main() {
  ll a, b;
  cin >> a >> b;
  vector<ll> c(a + 1, 0);
  rep(i, b) {
    ll x, y;
    cin >> x >> y;
    if (!d[x][y]) {
      c[x]++;
      c[y]++;
    }
    d[x][y] = true;
    d[y][x] = true;
  }
  ll ans = 0;
  rep(i, a + 1) { ans = max(ans, c[i] + 1); }
  cout << ans;
}