Problem p03554 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iostream>
#include <limits>
#include <vector>
using namespace std;

template <typename Type> class RMQ {
private:
  int size_;
  std::vector<Type> dat;

public:
  RMQ() : size_(0), dat(std::vector<Type>()){};
  RMQ(int size__) {
    for (size_ = 1; size_ < size__;)
      size_ <<= 1;
    dat.resize(size_ << 1, std::numeric_limits<Type>::max());
  }
  template <class T> RMQ(T begin_, T end_) {
    int n = end_ - begin_;
    for (size_ = 1; size_ < n; size_ <<= 1)
      ;
    dat.resize(size_ << 1, std::numeric_limits<Type>::max());
    for (int i = 0; i < n; i++)
      dat[i + size_] = *(begin_ + i);
    for (int i = size_ - 1; i > 0; i--)
      dat[i] = std::min(dat[i << 1], dat[(i << 1) + 1]);
  }
  inline unsigned size() { return size_; }
  inline void update(int i, Type x) {
    i += size_;
    dat[i] = x;
    while (i > 1) {
      i >>= 1;
      dat[i] = std::min(dat[i << 1], dat[i << 1 | 1]);
    }
  }
  inline Type query(int l, int r) {
    Type ret = std::numeric_limits<Type>::max();
    l += size_;
    r += size_;
    while (l != r) {
      if (l & 1)
        ret = std::min(ret, dat[l++]);
      l >>= 1;
      if (r & 1)
        ret = std::min(ret, dat[--r]);
      r >>= 1;
    }
    return ret;
  }
};

int n, q, b[200009], l[200009], r[200009], dp[200009], sum;
vector<int> V[100009];

int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    sum += b[i];
    if (b[i] == 0)
      b[i] = -1;
    else
      b[i] = 1;
  }
  for (int i = 1; i <= n; i++) {
    b[i] += b[i - 1];
  }
  cin >> q;
  for (int i = 1; i <= q; i++) {
    cin >> l[i] >> r[i];
    V[l[i]].push_back(r[i]);
  }
  RMQ<int> X(n + 3);
  for (int i = 1; i <= n; i++) {
    X.update(i, (1 << 30));
    dp[i] = (1 << 30);
  }
  X.update(0, 0);
  int V1 = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < V[i].size(); j++) {
      int p1 = i, p2 = V[i][j];
      dp[p2] = min(dp[p2], X.query(p1, p2 + 1) - b[p2]);
      dp[p2] = min(dp[p2], V1 + (b[p1 - 1] - b[p2]));
      X.update(p2, dp[p2] + b[p2]);
    }
    V1 = min(V1, dp[i]);
  }
  int minx = 0;
  for (int i = 1; i <= n; i++)
    minx = min(minx, dp[i]);
  cout << sum + minx << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <iostream>
#include <limits>
#include <vector>
using namespace std;

template <typename Type> class RMQ {
private:
  int size_;
  std::vector<Type> dat;

public:
  RMQ() : size_(0), dat(std::vector<Type>()){};
  RMQ(int size__) {
    for (size_ = 1; size_ < size__;)
      size_ <<= 1;
    dat.resize(size_ << 1, std::numeric_limits<Type>::max());
  }
  template <class T> RMQ(T begin_, T end_) {
    int n = end_ - begin_;
    for (size_ = 1; size_ < n; size_ <<= 1)
      ;
    dat.resize(size_ << 1, std::numeric_limits<Type>::max());
    for (int i = 0; i < n; i++)
      dat[i + size_] = *(begin_ + i);
    for (int i = size_ - 1; i > 0; i--)
      dat[i] = std::min(dat[i << 1], dat[(i << 1) + 1]);
  }
  inline unsigned size() { return size_; }
  inline void update(int i, Type x) {
    i += size_;
    dat[i] = x;
    while (i > 1) {
      i >>= 1;
      dat[i] = std::min(dat[i << 1], dat[i << 1 | 1]);
    }
  }
  inline Type query(int l, int r) {
    Type ret = std::numeric_limits<Type>::max();
    l += size_;
    r += size_;
    while (l != r) {
      if (l & 1)
        ret = std::min(ret, dat[l++]);
      l >>= 1;
      if (r & 1)
        ret = std::min(ret, dat[--r]);
      r >>= 1;
    }
    return ret;
  }
};

int n, q, b[200009], l[200009], r[200009], dp[200009], sum;
vector<int> V[200009];

int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    sum += b[i];
    if (b[i] == 0)
      b[i] = -1;
    else
      b[i] = 1;
  }
  for (int i = 1; i <= n; i++) {
    b[i] += b[i - 1];
  }
  cin >> q;
  for (int i = 1; i <= q; i++) {
    cin >> l[i] >> r[i];
    V[l[i]].push_back(r[i]);
  }
  RMQ<int> X(n + 3);
  for (int i = 1; i <= n; i++) {
    X.update(i, (1 << 30));
    dp[i] = (1 << 30);
  }
  X.update(0, 0);
  int V1 = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < V[i].size(); j++) {
      int p1 = i, p2 = V[i][j];
      dp[p2] = min(dp[p2], X.query(p1, p2 + 1) - b[p2]);
      dp[p2] = min(dp[p2], V1 + (b[p1 - 1] - b[p2]));
      X.update(p2, dp[p2] + b[p2]);
    }
    V1 = min(V1, dp[i]);
  }
  int minx = 0;
  for (int i = 1; i <= n; i++)
    minx = min(minx, dp[i]);
  cout << sum + minx << endl;
  return 0;
}