Problem p02788 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <cstring> //memset(dp,0,sizeof(dp))
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repp(i, n) for (int i = n - 1; i >= 0; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
using namespace std;
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
typedef pair<ll, ll> P;
typedef pair<ll, ll> Pll;
// 小数点以下　cout << fixed << setprecision(10) << num << endl;
// 桁数はlog10(mid)でやれ　log(mid)/log(10)はWA
// long*long<0で判定するな
// 開区間と閉区間
// アルファベットが何番目かは x=s[i]-'a'
// bfsはmain()内で　rep(i,h)rep(j,w)rep(i,4)でバグ
// 切り上げ：(a+(b-1))/b
// 32bit以上は 1ull<<j]
//  map 初期値0 for(auto itr=mp.begin();itr!=mp.end();++itr) itr->fi itr->se
//  で全探索 for(auto u:mp) u.fi u.se も可能
// n個のgcd,lcmは一つずつみて更新していく
// 大きな数を扱うときは素因数分解した形で持っておく
//  (l/a[i]) = l*powmod(a[i],MOD-2)%MOD;
//  auto itr=lower_bound(a.begin(),a.end(),

int main() {
  ll n, d, a;
  cin >> n >> d >> a;
  vector<Pll> m(n);
  rep(i, n) {
    cin >> m[i].fi >> m[i].se;
    if (m[i].se % a == 0)
      m[i].se /= a;
    else {
      m[i].se /= a;
      m[i].se++;
    }
  }
  // 座標と回数をpairで持つ
  sort(ALL(m));
  int fin[n]; // fin[l]=r; d[r]-d[l]<=2*dなるmaxr
  int k = 0;
  rep(i, n) {
    while (m[i].fi + 2 * d >= m[k].se) {
      k++;
    }
    k--;
    fin[i] = k;
  }
  ll ans = 0;
  int dam[n];
  rep(i, n) {
    if (i == 0) {
      dam[0] = m[0].se;
      continue;
    }
    auto itr = lower_bound(ALL(m), P(m[i].fi - 2 * d, 0));
    ll d;
    if (itr == m.begin())
      d = dam[i - 1];
    else {
      itr--;
      d = dam[i - 1] - dam[itr - m.begin()];
    }
    dam[i] = dam[i - 1] + max(0LL, m[i].se - d);
  }
  cout << dam[n - 1] << endl;
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <cstring> //memset(dp,0,sizeof(dp))
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repp(i, n) for (int i = n - 1; i >= 0; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
using namespace std;
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
typedef pair<ll, ll> P;
typedef pair<ll, ll> Pll;
// 小数点以下　cout << fixed << setprecision(10) << num << endl;
// 桁数はlog10(mid)でやれ　log(mid)/log(10)はWA
// long*long<0で判定するな
// 開区間と閉区間
// アルファベットが何番目かは x=s[i]-'a'
// bfsはmain()内で　rep(i,h)rep(j,w)rep(i,4)でバグ
// 切り上げ：(a+(b-1))/b
// 32bit以上は 1ull<<j]
//  map 初期値0 for(auto itr=mp.begin();itr!=mp.end();++itr) itr->fi itr->se
//  で全探索 for(auto u:mp) u.fi u.se も可能
// n個のgcd,lcmは一つずつみて更新していく
// 大きな数を扱うときは素因数分解した形で持っておく
//  (l/a[i]) = l*powmod(a[i],MOD-2)%MOD;
//  auto itr=lower_bound(a.begin(),a.end(),

int main() {
  ll n, d, a;
  cin >> n >> d >> a;
  vector<Pll> m(n);
  rep(i, n) {
    cin >> m[i].fi >> m[i].se;
    if (m[i].se % a == 0)
      m[i].se /= a;
    else {
      m[i].se /= a;
      m[i].se++;
    }
  }
  // 座標と回数をpairで持つ
  sort(ALL(m));
  ll dam[n];
  rep(i, n) {
    if (i == 0) {
      dam[0] = m[0].se;
      continue;
    }
    auto itr = lower_bound(ALL(m), P(m[i].fi - 2 * d, 0));
    ll d;
    if (itr == m.begin())
      d = dam[i - 1];
    else {
      itr--;
      d = dam[i - 1] - dam[itr - m.begin()];
    }
    dam[i] = dam[i - 1] + max(0LL, m[i].se - d);
  }
  cout << dam[n - 1] << endl;
}