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

// 確か、r以下とそれ以外の境界部分のインデックスをうごうごやっていた……気がする。
// 書いた当時のことを覚えていないので、誰か解読してください。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  int n, m, p, q, r, x, y;
  vector<int>::iterator itx, ity, it;

  while (cin >> n >> m >> p >> q >> r) {
    vector<int> v1, v2;
    v1.push_back(0);
    v1.push_back(r);

    for (int i = 0; i < m; ++i) {
      cin >> x >> y;
      itx = upper_bound(v1.begin(), v1.end(), x);
      ity = upper_bound(v1.begin(), v1.end(), y);

      if ((ity - v1.begin()) % 2 == 0) {
        v2.push_back(0);
      }
      v2.push_back(0);

      for (it = ity; it != v1.end(); ++it) {
        v2.push_back(*it - y);
      }

      if ((v1.end() - itx) % 2 != 0) {
        v2.push_back(n - y);
      }
      for (it = itx; it != ity; ++it) {
        v2.push_back(*it - x + n - y);
      }

      it = v1.begin();
      if ((ity - v1.begin()) % 2 != 0) {
        ++it;
      }

      if (v1.size() > 2 && !it[1]) {
        it += 2; // 重複排除
      }

      if (*it + n - x == v2.back()) { // 重複排除
        ++it;
        v2.pop_back();
      }
      for (; it != itx; ++it) {
        v2.push_back(*it + n - x);
      }

      v1.swap(v2);
      v2.clear();
    }

    v1.insert(upper_bound(v1.begin(), v1.end(), p - 1), 2, p - 1);
    v1.insert(lower_bound(v1.begin(), v1.end(), q), q);
    v1.push_back(n);

    it = upper_bound(v1.begin(), v1.end(), p - 1);
    if ((it - v1.begin()) % 2 != 0)
      --it;

    int ans = 0;
    for (; *it < q; ++it) {
      int prev = *it;
      ++it;
      ans += *it - prev;
    }

    cout << ans << '\\n';
  }
}

Error: 0

Fixed submission:

// 確か、r以下とそれ以外の境界部分のインデックスをうごうごやっていた……気がする。
// 書いた当時のことを覚えていないので、誰か解読してください。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  int n, m, p, q, r, x, y;
  vector<int>::iterator itx, ity, it;

  while (cin >> n >> m >> p >> q >> r) {
    vector<int> v1, v2;
    v1.push_back(0);
    v1.push_back(r);

    for (int i = 0; i < m; ++i) {
      cin >> x >> y;
      itx = upper_bound(v1.begin(), v1.end(), x);
      ity = upper_bound(v1.begin(), v1.end(), y);

      if ((ity - v1.begin()) % 2 == 0) {
        v2.push_back(0);
      }
      v2.push_back(0);

      for (it = ity; it != v1.end(); ++it) {
        v2.push_back(*it - y);
      }

      if ((v1.end() - itx) % 2 != 0) {
        v2.push_back(n - y);
      }
      for (it = itx; it != ity; ++it) {
        v2.push_back(*it - x + n - y);
      }

      it = v1.begin();
      if ((ity - v1.begin()) % 2 != 0) {
        ++it;
      }
      if (v1.size() > 1 && !it[1]) {
        it += 2; // 重複排除
      }
      if (*it + n - x == v2.back()) { // 重複排除
        ++it;
        v2.pop_back();
      }
      for (; it != itx; ++it) {
        v2.push_back(*it + n - x);
      }

      v1.swap(v2);
      v2.clear();
    }

    v1.insert(upper_bound(v1.begin(), v1.end(), p - 1), 2, p - 1);
    v1.insert(lower_bound(v1.begin(), v1.end(), q), q);
    v1.push_back(n);

    it = upper_bound(v1.begin(), v1.end(), p - 1);
    if ((it - v1.begin()) % 2 != 0)
      --it;

    int ans = 0;
    for (; *it < q; ++it) {
      int prev = *it;
      ++it;
      ans += *it - prev;
    }

    cout << ans << '\\n';
  }
}