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

#include <bits/stdc++.h>

using namespace std;
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define chmin(x, y) (x) = min((x), (y))
#define chmax(x, y) (x) = max((x), (y))
#define endl "\\n"
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}

void solve() {
  int H, W;
  cin >> H >> W;
  const int inf = 1e9;

  map<int, int> mp; // mp[今] = 最初の位置
  multiset<int> diff; // mpで管理してる区間における 今 - 最初 の集合

  for (int i = 0; i < W; i++) {
    mp[i] = i;
    diff.insert(0);
  }

  for (int i = 0; i < H; i++) {
    // cerr << "mp: ";
    // for(auto e : mp) {
    //     cerr << e << " ";
    // }
    // cerr << endl;

    // cerr << "diff: ";
    // for(auto e : diff) {
    //     cerr << e << " ";
    // }
    // cerr << endl;

    int a, b;
    cin >> a >> b;
    a--; // 半開区間 [a, b)
    auto it = mp.lower_bound(a);
    while (it->first < b && it != mp.end()) {
      if (mp.find(b) == mp.end() || it->second > mp.at(b)) {
        if (b == W) {
          if (diff.find(inf) == diff.end()) {
            diff.insert(inf);
          }
        } else {
          if (mp.find(b) != mp.end() && diff.find(b - mp.at(b)) != diff.end()) {
            diff.erase(diff.lower_bound(b - mp.at(b)));
          }
          diff.insert(b - it->second);
        }
        mp[b] = it->second;
      }
      diff.erase(diff.lower_bound(it->first - it->second));
      it = mp.erase(it);
    }

    if (*diff.begin() >= inf) {
      cout << -1 << endl;
    } else {
      cout << *diff.begin() + i + 1 << endl;
    }
  }
  // cerr << "mp: ";
  // for(auto e : mp) {
  //     cerr << e << " ";
  // }
  // cerr << endl;
  // cerr << "diff: ";
  // for(auto e : diff) {
  //     cerr << e << " ";
  // }
  // cerr << endl;
}

int main() {
#ifdef LOCAL_ENV
  cin.exceptions(ios::failbit);
#endif
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout.setf(ios::fixed);
  cout.precision(16);

  solve();
}


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


Fixed submission:

#include <bits/stdc++.h>

using namespace std;
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define chmin(x, y) (x) = min((x), (y))
#define chmax(x, y) (x) = max((x), (y))
#define endl "\\n"
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}

void solve() {
  int H, W;
  cin >> H >> W;
  const int inf = 1e9;

  map<int, int> mp; // mp[今] = 最初の位置
  multiset<int> diff; // mpで管理してる区間における 今 - 最初 の集合

  for (int i = 0; i < W; i++) {
    mp[i] = i;
    diff.insert(0);
  }

  for (int i = 0; i < H; i++) {
    // cerr << "mp: ";
    // for(auto e : mp) {
    //     cerr << e << " ";
    // }
    // cerr << endl;

    // cerr << "diff: ";
    // for(auto e : diff) {
    //     cerr << e << " ";
    // }
    // cerr << endl;

    int a, b;
    cin >> a >> b;
    a--; // 半開区間 [a, b)
    auto it = mp.lower_bound(a);
    while (it->first < b && it != mp.end()) {
      if (mp.find(b) == mp.end() || it->second > mp.at(b)) {
        if (b == W) {
          if (diff.find(inf) == diff.end()) {
            diff.insert(inf);
          }
        } else {
          if (diff.find(b - mp.at(b)) != diff.end()) {
            diff.erase(diff.lower_bound(b - mp.at(b)));
          }
          diff.insert(b - it->second);
        }
        mp[b] = it->second;
      }
      diff.erase(diff.lower_bound(it->first - it->second));
      it = mp.erase(it);
    }

    if (*diff.begin() >= inf) {
      cout << -1 << endl;
    } else {
      cout << *diff.begin() + i + 1 << endl;
    }
  }
  // cerr << "mp: ";
  // for(auto e : mp) {
  //     cerr << e << " ";
  // }
  // cerr << endl;
  // cerr << "diff: ";
  // for(auto e : diff) {
  //     cerr << e << " ";
  // }
  // cerr << endl;
}

int main() {
#ifdef LOCAL_ENV
  cin.exceptions(ios::failbit);
#endif
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout.setf(ios::fixed);
  cout.precision(16);

  solve();
}