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

#include <bits/stdc++.h>
using namespace std;
#define pi 2 * asin(1.0)
#define MAX 10000000
#define MOD 1000000007

// Answer

int main() {

  long N, M, t;
  typedef pair<long, long> P;
  cin >> N >> M;
  vector<P> ab(M);
  vector<P> ba(M);
  vector<long> X(N, 1);
  for (long i = 0; i < M; i++) {
    cin >> ab.at(i).first;
    cin >> ab.at(i).second;
    if (ab.at(i).first > ab.at(i).second) {
      t = ab.at(i).first;
      ab.at(i).first = ab.at(i).second;
      ab.at(i).second = t;
    }
    ba.at(i).first = ab.at(i).second;
    ba.at(i).second = ab.at(i).first;
  }
  sort(ab.begin(), ab.end());
  sort(ba.begin(), ba.end());
  queue<long> que;
  long count, max = 0;
  for (long i = 0; i < N; i++) {
    count = 0;
    que.push(i + 1);
    while (que.size()) {
      long q = que.front();
      que.pop();
      // cout<<q<<endl;
      if (X.at(q - 1) == 1) {
        count++;
        X.at(q - 1) = 0;
        P pp = make_pair(q, 0);
        auto itr1 = lower_bound(ab.begin(), ab.end(), pp);
        auto itr2 = lower_bound(ba.begin(), ba.end(), pp);
        long it = distance(ab.begin(), itr1);
        long it2 = distance(ba.begin(), itr2);
        //   cout<<distance(ab.begin(),itr1)<<endl;
        while (it < M && (q == ab.at(it).first)) {
          que.push(ab.at(it).second);
          it++;
        }
        while (it2 < M && (q == ba.at(it2).first)) {
          que.push(ba.at(it2).second);
          it2++;
        }
      }
    }
    if (max < count) {
      max = count;
    }
  }
  cout << max << endl;
}


Error: -6
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 18446744073709551615) >= this->size() (which is 5)


Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define pi 2 * asin(1.0)
#define MAX 10000000
#define MOD 1000000007

// Answer

int main() {

  long N, M, t;
  typedef pair<long, long> P;
  cin >> N >> M;
  vector<P> ab(M);
  vector<P> ba(M);
  vector<long> X(N, 1);
  for (long i = 0; i < M; i++) {
    cin >> ab.at(i).first;
    cin >> ab.at(i).second;
    if (ab.at(i).first > ab.at(i).second) {
      t = ab.at(i).first;
      ab.at(i).first = ab.at(i).second;
      ab.at(i).second = t;
    }
    ba.at(i).first = ab.at(i).second;
    ba.at(i).second = ab.at(i).first;
  }
  sort(ab.begin(), ab.end());
  sort(ba.begin(), ba.end());
  queue<long> que;
  long count, max = 0;
  for (long i = 0; i < N; i++) {
    count = 0;
    que.push(i);
    while (que.size()) {
      long q = que.front();
      que.pop();
      cout << q << endl;
      if (X.at(q - 1) == 1) {
        count++;
        X.at(q - 1) = 0;
        P pp = make_pair(q, 0);
        auto itr1 = lower_bound(ab.begin(), ab.end(), pp);
        auto itr2 = lower_bound(ba.begin(), ba.end(), pp);
        long it = distance(ab.begin(), itr1);
        long it2 = distance(ba.begin(), itr2);
        //   cout<<distance(ab.begin(),itr1)<<endl;
        while (it < M && (q == ab.at(it).first)) {
          que.push(ab.at(it).second);
          it++;
        }
        while (it2 < M && (q == ba.at(it2).first)) {
          que.push(ba.at(it2).second);
          it2++;
        }
      }
    }
    if (max < count) {
      max = count;
    }
  }
  cout << max << endl;
}