Problem p03771 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define db double
#define pint pair<int, int>
#define mk make_pair
#define pb push_back
#define eb emplace_back
#define ins insert
#define fi first
#define se second
#define Rep(x, y, z) for (int x = y; x <= z; x++)
#define Red(x, y, z) for (int x = y; x >= z; x--)
using namespace std;
const int MAXN = 1e5 + 5;
char buf[1 << 12], *pp1 = buf, *pp2 = buf, nc;
int ny;
inline char gc() {
  return pp1 == pp2 &&
                 (pp2 = (pp1 = buf) + fread(buf, 1, 1 << 12, stdin), pp1 == pp2)
             ? EOF
             : *pp1++;
}
// inline char gc(){return getchar();}
inline int read() {
  int x = 0;
  for (ny = 1; nc = gc(), (nc < 48 || nc > 57) && nc != EOF;)
    if (nc == 45)
      ny = -1;
  if (nc < 0)
    return nc;
  for (x = nc - 48; nc = gc(), 47 < nc && nc < 58 && nc != EOF;
       x = (x << 3) + (x << 1) + (nc ^ 48))
    ;
  return x * ny;
}
int n, t, v, len[20], p[MAXN], Fl[1 << 18], Fr[1 << 18], S, a[MAXN];
vector<int> L[20], R[20];
int main() {
  //	freopen("std.in","r",stdin);
  //	freopen("std.out","w",stdout);
  n = read(), v = read(), t = log2(v) + 1, S = (1 << t) - 1;
  Rep(i, 1, n) p[i] = read();
  Rep(i, 0, t) {
    len[i] = i ? len[i - 1] / 2 : v;
    for (int l = 1, r; l <= n; l = r + 1) {
      for (r = l; r < n && p[r + 1] - p[r] <= len[i]; r++)
        ;
      L[i].pb(l), R[i].pb(r);
    }
  }
  Rep(sta, 0, S) Fr[sta] = n + 1, Fl[sta] = 0;
  Rep(i, 1, t) Fl[1 << i - 1] = (*R[i].begin()),
                           Fr[1 << i - 1] = (*--L[i].end());
  Rep(sta, 1, S) Rep(j, 1, t) if (~sta >> (j - 1) & 1) {
    int t = sta | (1 << j - 1), pos;
    pos = upper_bound(L[j].begin(), L[j].end(), Fl[sta] + 1) - L[j].begin() - 1;
    assert(pos >= 0 && pos < R[j].size()), Fl[t] = max(Fl[t], R[j][pos]);
    pos = lower_bound(R[j].begin(), R[j].end(), Fr[sta] - 1) - R[j].begin();
    assert(pos >= 0 && pos < L[j].size()), Fr[t] = min(Fr[t], L[j][pos]);
  }
  Rep(s, 0, S) {
    int ed =
            upper_bound(L[0].begin(), L[0].end(), Fl[s] + 1) - L[0].begin() - 1,
        st =
            lower_bound(R[0].begin(), R[0].end(), Fr[S ^ s] - 1) - R[0].begin();
    if (st <= ed)
      a[st]++, a[ed + 1]--;
  }
  for (int i = 0; i < L[0].size(); i++) {
    a[i] += a[i - 1];
    Rep(j, L[0][i], R[0][i]) puts(a[i] ? "Possible" : "Impossible");
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define db double
#define pint pair<int, int>
#define mk make_pair
#define pb push_back
#define eb emplace_back
#define ins insert
#define fi first
#define se second
#define Rep(x, y, z) for (int x = y; x <= z; x++)
#define Red(x, y, z) for (int x = y; x >= z; x--)
using namespace std;
const int MAXN = 2e5 + 5;
char buf[1 << 12], *pp1 = buf, *pp2 = buf, nc;
int ny;
inline char gc() {
  return pp1 == pp2 &&
                 (pp2 = (pp1 = buf) + fread(buf, 1, 1 << 12, stdin), pp1 == pp2)
             ? EOF
             : *pp1++;
}
// inline char gc(){return getchar();}
inline int read() {
  int x = 0;
  for (ny = 1; nc = gc(), (nc < 48 || nc > 57) && nc != EOF;)
    if (nc == 45)
      ny = -1;
  if (nc < 0)
    return nc;
  for (x = nc - 48; nc = gc(), 47 < nc && nc < 58 && nc != EOF;
       x = (x << 3) + (x << 1) + (nc ^ 48))
    ;
  return x * ny;
}
int n, t, v, len[20], p[MAXN], Fl[1 << 18], Fr[1 << 18], S, a[MAXN];
vector<int> L[20], R[20];
int main() {
  //	freopen("std.in","r",stdin);
  //	freopen("std.out","w",stdout);
  n = read(), v = read(), t = log2(v) + 1, S = (1 << t) - 1;
  Rep(i, 1, n) p[i] = read();
  Rep(i, 0, t) {
    len[i] = i ? len[i - 1] / 2 : v;
    for (int l = 1, r; l <= n; l = r + 1) {
      for (r = l; r < n && p[r + 1] - p[r] <= len[i]; r++)
        ;
      L[i].pb(l), R[i].pb(r);
    }
  }
  Rep(sta, 0, S) Fr[sta] = n + 1, Fl[sta] = 0;
  Rep(i, 1, t) Fl[1 << i - 1] = (*R[i].begin()),
                           Fr[1 << i - 1] = (*--L[i].end());
  Rep(sta, 1, S) Rep(j, 1, t) if (~sta >> (j - 1) & 1) {
    int t = sta | (1 << j - 1), pos;
    pos = upper_bound(L[j].begin(), L[j].end(), Fl[sta] + 1) - L[j].begin() - 1;
    assert(pos >= 0 && pos < R[j].size()), Fl[t] = max(Fl[t], R[j][pos]);
    pos = lower_bound(R[j].begin(), R[j].end(), Fr[sta] - 1) - R[j].begin();
    assert(pos >= 0 && pos < L[j].size()), Fr[t] = min(Fr[t], L[j][pos]);
  }
  Rep(s, 0, S) {
    int ed =
            upper_bound(L[0].begin(), L[0].end(), Fl[s] + 1) - L[0].begin() - 1,
        st =
            lower_bound(R[0].begin(), R[0].end(), Fr[S ^ s] - 1) - R[0].begin();
    if (st <= ed)
      a[st]++, a[ed + 1]--;
  }
  for (int i = 0; i < L[0].size(); i++) {
    a[i] += a[i - 1];
    Rep(j, L[0][i], R[0][i]) puts(a[i] ? "Possible" : "Impossible");
  }
  return 0;
}