Problem p03440 (C++)

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

#define MOD 1000000007
#define ll long long int
#define vi vector<int>
#define vii vector<vector<int>>
#define PI 3.1415926535897932384626433832795
#define INF 9223372036854775807LL

int arr[100005];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> arr[i];
  }
  vii graph(n + 2, vi());
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    graph[x].push_back(y);
    graph[y].push_back(x);
  }
  int next = 0;
  vector<multiset<int>> trees;
  int ind = 0;
  vector<bool> was(n + 2, false);
  int sizsum = 0;
  while (next != n) {
    while (next < n && was[next]) {
      next++;
    }
    if (next == n) {
      break;
    }
    trees.push_back(multiset<int>());
    stack<int> st;
    st.push(next);
    was[next] = true;
    while (!st.empty()) {
      int v = st.top();
      st.pop();
      trees[ind].insert(arr[v]);
      for (int u : graph[v]) {
        if (!was[u]) {
          was[u] = true;
          st.push(u);
        }
      }
    }
    ind++;
  }
  if (n < 2 * ind - 2) {
    cout << "Impossible";
    return 0;
  }
  multiset<int> curr;
  multiset<pair<int, int>> ot;
  srand(time(0));
  int rn = rand() % ind;
  rn = 0;
  for (int el : trees[rn]) {
    curr.insert(el);
  }
  for (int i = 0; i < ind; i++) {
    if (i == rn) {
      continue;
    }
    for (int el : trees[i]) {
      ot.insert({el, i});
    }
  }
  ll ans = 0;
  while (ot.size() > 0) {
    int best = (*curr.begin());
    curr.erase(curr.begin());
    auto bestot = ot.begin();
    pair<int, int> pr = *bestot;
    for (int el : trees[pr.second]) {
      curr.insert(el);
      ot.erase(ot.find({el, pr.second}));
    }
    curr.erase(curr.find(pr.first));
    ans += best + pr.first;
  }
  cout << ans;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define MOD 1000000007
#define ll long long int
#define vi vector<int>
#define vii vector<vector<int>>
#define PI 3.1415926535897932384626433832795
#define INF 9223372036854775807LL

int arr[100005];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> arr[i];
  }
  vii graph(n + 2, vi());
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    graph[x].push_back(y);
    graph[y].push_back(x);
  }
  int next = 0;
  vector<multiset<int>> trees;
  int ind = 0;
  vector<bool> was(n + 2, false);
  int sizsum = 0;
  while (next != n) {
    while (next < n && was[next]) {
      next++;
    }
    if (next == n) {
      break;
    }
    trees.push_back(multiset<int>());
    stack<int> st;
    st.push(next);
    was[next] = true;
    while (!st.empty()) {
      int v = st.top();
      st.pop();
      trees[ind].insert(arr[v]);
      for (int u : graph[v]) {
        if (!was[u]) {
          was[u] = true;
          st.push(u);
        }
      }
    }
    ind++;
  }
  if (n < 2 * ind - 2) {
    cout << "Impossible";
    return 0;
  }
  multiset<int> curr;
  multiset<pair<int, int>> ot;
  srand(time(0));
  int rn = rand() % ind;
  rn = 0;
  for (int el : trees[rn]) {
    curr.insert(el);
  }
  for (int i = 0; i < ind; i++) {
    if (i == rn) {
      continue;
    }
    for (int el : trees[i]) {
      ot.insert({el, i});
    }
  }
  ll ans = 0;
  while (ot.size() > 0) {
    int best = (*curr.begin());
    curr.erase(curr.begin());
    auto bestot = ot.begin();
    pair<int, int> pr = *bestot;
    for (int el : trees[pr.second]) {
      curr.insert(el);
      ot.erase(ot.find({el, pr.second}));
    }
    curr.erase(curr.find(pr.first));
    while (curr.empty() && !ot.empty()) {
      curr.insert(pr.first);
      for (int el : trees[pr.second]) {
        curr.erase(curr.find(el));
        ot.insert({el, pr.second});
      }
      while (pr.second == (*bestot).second) {
        bestot++;
      }
      pr = *bestot;
      for (int el : trees[pr.second]) {
        curr.insert(el);
        ot.erase(ot.find({el, pr.second}));
      }
      curr.erase(curr.find(pr.first));
    }
    ans += best + pr.first;
  }
  cout << ans;
  return 0;
}