Problem p02537 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template <class T> void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
#define repr(i, from, to) for (ll i = (ll)from; i < (ll)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i, N) repr(i, 0, N)
#define per(i, N) for (ll i = (ll)N - 1; i >= 0; i--)

const ll MOD = pow(10, 9) + 7;
const ll LLINF = pow(2, 61) - 1;
const ll INF = pow(2, 30) - 1;

vector<ll> fac;
void c_fac(ll x = pow(10, 6) + 10) {
  fac.resize(x, true);
  rep(i, x) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
ll inv(ll a, ll m = MOD) {
  ll b = m, x = 1, y = 0;
  while (b != 0) {
    ll d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
ll nck(ll n, ll k) { return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD; }
ll modpow(ll x, ll p) {
  ll result = 1, now = 1, pm = x;
  while (now <= p) {
    if (p & now) {
      result = result * pm % MOD;
    }
    now *= 2;
    pm = pm * pm % MOD;
  }
  return result;
}
ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

struct SegTree {
  ll size;
  vector<ll> pos;
  SegTree(ll N) {
    size = 1;
    while (size < N)
      size <<= 1;
    pos.resize(2 * size, 0);
  }
  ll operator[](const ll &x) const { return pos[x + size]; }

  void set(ll x, const ll v) { pos[x + size] = v; }
  void update(ll x, const ll v) {
    set(x, v);
    x += size;
    while (x >>= 1)
      operate(x);
  }
  ll query(ll a, ll b) {
    ll L = 0, R = 0;
    for (a += size, b += size; a < b; a >>= 1, b >>= 1) {
      if (a & 1) {
        L = q(L, pos[a]);
        a++;
      }
      if (b & 1) {
        b--;
        R = q(pos[b], R);
      }
    }
    return q(L, R);
  }
  void operate(ll i) { pos[i] = q(pos[i * 2], pos[i * 2 + 1]); }
  ll q(ll x, ll y) { return max(x, y); }
};

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

int main() {
  ll N, K;
  cin >> N >> K;
  ll A[N];
  rep(i, N) cin >> A[i];

  ll MA = 10;
  SegTree st(MA);
  rep(i, N) {
    st.update(A[i],
              st.query(max(0ll, A[i] - K), min(MA - 1, A[i] + K) + 1) + 1);
    // rep(i,MA) cout << st[i] << " "; cout << endl;
  }

  ll result = st.query(0, MA);
  cout << result << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template <class T> void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
#define repr(i, from, to) for (ll i = (ll)from; i < (ll)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i, N) repr(i, 0, N)
#define per(i, N) for (ll i = (ll)N - 1; i >= 0; i--)

const ll MOD = pow(10, 9) + 7;
const ll LLINF = pow(2, 61) - 1;
const ll INF = pow(2, 30) - 1;

vector<ll> fac;
void c_fac(ll x = pow(10, 6) + 10) {
  fac.resize(x, true);
  rep(i, x) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
ll inv(ll a, ll m = MOD) {
  ll b = m, x = 1, y = 0;
  while (b != 0) {
    ll d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
ll nck(ll n, ll k) { return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD; }
ll modpow(ll x, ll p) {
  ll result = 1, now = 1, pm = x;
  while (now <= p) {
    if (p & now) {
      result = result * pm % MOD;
    }
    now *= 2;
    pm = pm * pm % MOD;
  }
  return result;
}
ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

struct SegTree {
  ll size;
  vector<ll> pos;
  SegTree(ll N) {
    size = 1;
    while (size < N)
      size <<= 1;
    pos.resize(2 * size, 0);
  }
  ll operator[](const ll &x) const { return pos[x + size]; }

  void set(ll x, const ll v) { pos[x + size] = v; }
  void update(ll x, const ll v) {
    set(x, v);
    x += size;
    while (x >>= 1)
      operate(x);
  }
  ll query(ll a, ll b) {
    ll L = 0, R = 0;
    for (a += size, b += size; a < b; a >>= 1, b >>= 1) {
      if (a & 1) {
        L = q(L, pos[a]);
        a++;
      }
      if (b & 1) {
        b--;
        R = q(pos[b], R);
      }
    }
    return q(L, R);
  }
  void operate(ll i) { pos[i] = q(pos[i * 2], pos[i * 2 + 1]); }
  ll q(ll x, ll y) { return max(x, y); }
};

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

int main() {
  ll N, K;
  cin >> N >> K;
  ll A[N];
  rep(i, N) cin >> A[i];

  ll MA = 300010;
  SegTree st(MA);
  rep(i, N) {
    st.update(A[i],
              st.query(max(0ll, A[i] - K), min(MA - 1, A[i] + K) + 1) + 1);
    // rep(i,MA) cout << st[i] << " "; cout << endl;
  }

  ll result = st.query(0, MA);
  cout << result << endl;
  return 0;
}