Problem p03440 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> Pii;
typedef pair<int, ll> Pil;
typedef pair<ll, ll> Pll;
typedef pair<ll, int> Pli;

#define fi first
#define se second

const ll MOD = 1e9 + 7;
const ll MOD2 = 998244353;
const ll MOD3 = 1812447359;
const ll INF = 1ll << 62;
const double PI = 2 * asin(1);

void yes() { printf("yes\n"); }
void no() { printf("no\n"); }
void Yes() { printf("Yes\n"); }
void No() { printf("No\n"); }
void YES() { printf("YES\n"); }
void NO() { printf("NO\n"); }

int N, M, G[int(1e5 + 5)];
ll A[int(1e5 + 5)];
Pii P[int(1e5 + 5)];
vector<ll> now[int(1e5 + 5)];

void Unite() {
  int X, Y;
  cin >> X >> Y;
  int GX = G[X], GY = G[Y];
  while (GX != G[GX])
    GX = G[GX];
  while (GY != G[GY])
    GY = G[GY];

  G[max(GX, GY)] = min(GX, GY);
}

int main() {
  cin >> N >> M;
  for (int i = 0; i < N; i++) {
    cin >> A[i];
    G[i] = i;
  }
  for (int i = 0; i < M; i++)
    Unite();
  for (int i = 0; i < N; i++) {
    int Gi = G[i];
    while (Gi != G[Gi])
      Gi = G[Gi];
    G[i] = Gi;
    now[G[i]].push_back(A[i]);
    P[G[i]].fi++;
    P[i].se = i;
  }
  sort(P, P + N, greater<Pii>());

  priority_queue<ll, vector<ll>, greater<ll>> que;
  for (int i = 0; i < (int)now[P[0].se].size(); i++)
    que.push(now[0][i]);

  ll ans = 0;
  for (int i = 1; i < N; i++) {
    if (now[P[i].se].size() == 0)
      continue;

    if (que.size() == 0) {
      cout << "Impossible" << endl;
      return 0;
    }
    ans += que.top();
    que.pop();
    sort(now[P[i].se].begin(), now[P[i].se].end());
    ans += now[P[i].se][0];

    for (int j = 1; j < now[P[i].se].size(); j++) {
      que.push(now[P[i].se][j]);
    }
  }
  cout << ans << endl;

  return 0;
}


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

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> Pii;
typedef pair<int, ll> Pil;
typedef pair<ll, ll> Pll;
typedef pair<ll, int> Pli;

#define fi first
#define se second

const ll MOD = 1e9 + 7;
const ll MOD2 = 998244353;
const ll MOD3 = 1812447359;
const ll INF = 1ll << 62;
const double PI = 2 * asin(1);

void yes() { printf("yes\n"); }
void no() { printf("no\n"); }
void Yes() { printf("Yes\n"); }
void No() { printf("No\n"); }
void YES() { printf("YES\n"); }
void NO() { printf("NO\n"); }

int N, M, G[int(1e5 + 5)];
ll A[int(1e5 + 5)];
Pii P[int(1e5 + 5)];
vector<ll> now[int(1e5 + 5)];

void Unite() {
  int X, Y;
  cin >> X >> Y;
  int GX = G[X], GY = G[Y];
  while (GX != G[GX])
    GX = G[GX];
  while (GY != G[GY])
    GY = G[GY];

  G[max(GX, GY)] = min(GX, GY);
}

int main() {
  cin >> N >> M;
  for (int i = 0; i < N; i++) {
    cin >> A[i];
    G[i] = i;
  }
  for (int i = 0; i < M; i++)
    Unite();
  for (int i = 0; i < N; i++) {
    int Gi = G[i];
    while (Gi != G[Gi])
      Gi = G[Gi];
    G[i] = Gi;
    now[G[i]].push_back(A[i]);
    P[G[i]].fi++;
    P[i].se = i;
  }
  sort(P, P + N, greater<Pii>());

  priority_queue<ll, vector<ll>, greater<ll>> que;
  for (int i = 0; i < (int)now[P[0].se].size(); i++)
    que.push(now[P[0].se][i]);

  ll ans = 0;
  for (int i = 1; i < N; i++) {
    if (now[P[i].se].size() == 0)
      continue;

    if (que.size() == 0) {
      cout << "Impossible" << endl;
      return 0;
    }
    ans += que.top();
    que.pop();
    sort(now[P[i].se].begin(), now[P[i].se].end());
    ans += now[P[i].se][0];

    for (int j = 1; j < now[P[i].se].size(); j++) {
      que.push(now[P[i].se][j]);
    }
  }
  cout << ans << endl;

  return 0;
}