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

#include <bits/stdc++.h>
using namespace std;

#define ll long long int
#define pb push_back
#define FastIO cin.sync_with_stdio(false), cin.tie(NULL)
#define file                                                                   \\
  freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)

ll max(ll a, ll b) {
  if (a > b)
    return a;
  return b;
}

ll min(ll a, ll b) {
  if (a < b)
    return a;
  return b;
}

ll ceil_div(ll a, ll b) { return (a + b - 1) / b; }

const ll N = 3e5 + 5, INF = 2e9 + 2, MOD = 998244353, M = 6000, K = 20;
int a[N], segment[3 * N], b[N];

void build(int ind, int l, int r) {
  if (r <= l)
    return;
  if (r - l == 1) {
    segment[ind] = a[l];
    return;
  }
  int mid = (l + r) / 2;
  build(2 * ind, l, mid);
  build(2 * ind + 1, mid, r);
  segment[ind] = max(segment[2 * ind], segment[2 * ind + 1]);
}

void update(int ind, int l, int r, int i, int v) {
  int mid = (l + r) / 2;
  if (r - l == 1) {
    segment[ind] = v;
    return;
  }
  if (i < mid)
    update(2 * ind, l, mid, i, v);
  else
    update(2 * ind + 1, mid, r, i, v);
  segment[ind] = max(segment[2 * ind], segment[2 * ind + 1]);
}

int ql, qr;
ll query(int ind, int l, int r) {
  int mid = (l + r) / 2;
  if (l >= ql && r <= qr)
    return segment[ind];
  if (r <= ql || l >= qr || r <= l)
    return 0;
  ll ans = 0;
  ans = max(query(2 * ind, l, mid), query(2 * ind + 1, mid, r));
  return ans;
}

int main() {
  // FastIO;
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++)
    cin >> b[i];
  a[b[0]] = 1;
  if (n == 1) {
    cout << 1 << "\\n";
    return 0;
  }
  build(1, 0, N);

  ll tp;
  for (int i = 1; i < n; i++) {
    ql = max(0, b[i] - k);
    qr = min(N, b[i] + k + 1);
    tp = query(1, 0, N);
    a[b[i]] = tp + 1;
    update(1, 0, N, b[i], tp + 1);
  }

  cout << segment[1] << "\\n";

  return 0;
}


Error: -11

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define ll long long int
#define pb push_back
#define FastIO cin.sync_with_stdio(false), cin.tie(NULL)
#define file                                                                   \\
  freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)

ll max(ll a, ll b) {
  if (a > b)
    return a;
  return b;
}

ll min(ll a, ll b) {
  if (a < b)
    return a;
  return b;
}

ll ceil_div(ll a, ll b) { return (a + b - 1) / b; }

const ll N = 3e5 + 5, INF = 2e9 + 2, MOD = 998244353, M = 6000, K = 20;
int a[2 * N], segment[4 * N], b[N];

void build(int ind, int l, int r) {
  if (r == l)
    return;
  if (r - l == 1) {
    segment[ind] = a[l];
    return;
  }
  int mid = (l + r) / 2;
  build(ind * 2, l, mid);
  build(ind * 2 + 1, mid, r);
  segment[ind] = max(segment[2 * ind], segment[2 * ind + 1]);
}

void update(int ind, int l, int r, int i, int v) {
  int mid = (l + r) / 2;
  if (r - l == 1) {
    segment[ind] = v;
    return;
  }
  if (i < mid)
    update(2 * ind, l, mid, i, v);
  else
    update(2 * ind + 1, mid, r, i, v);
  segment[ind] = max(segment[2 * ind], segment[2 * ind + 1]);
}

int ql, qr;
ll query(int ind, int l, int r) {
  int mid = (l + r) / 2;
  if (l >= ql && r <= qr)
    return segment[ind];
  if (r <= ql || l >= qr)
    return 0;
  ll ans = 0;
  ans = max(query(2 * ind, l, mid), query(2 * ind + 1, mid, r));
  return ans;
}

int main() {
  FastIO;
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++)
    cin >> b[i];
  a[b[0]] = 1;
  build(1, 0, 2 * N);

  ll tp;
  for (int i = 1; i < n; i++) {
    ql = max(0, b[i] - k);
    qr = min(2 * N, b[i] + k + 1);
    tp = query(1, 0, 2 * N);
    a[b[i]] = tp + 1;
    update(1, 0, 2 * N, b[i], tp + 1);
  }

  cout << max(segment[1], *max_element(a, a + N)) << "\\n";

  return 0;
}