Problem p03771 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = (l), i##end = (r); i <= i##end; ++i)
using std::cin;
using std::cout;
const int maxn = 200200;
typedef long long ll;
const int mod = 998244353;
inline ll pow(ll a, int b, int ans = 1) {
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1)
      ans = ans * a % mod;
  return ans;
}
inline ll inverse(int x) { return pow(x, mod - 2); }
int n, v, lg;
typedef std::pair<int, int> pr;
int g0[1 << 18], g1[1 << 18];
int x[maxn], ans[maxn];
std::vector<pr> vec[233];
inline void init(std::vector<pr> &v, int d) {
  int l = 1;
  for (int i = 2; i <= n; ++i)
    if (x[i] - x[i - 1] > d)
      v.emplace_back(l, i - 1), l = i;
  v.emplace_back(l, n);
}
inline void up(int &x, int y) {
  if (x < y)
    x = y;
}
inline void down(int &x, int y) {
  if (x > y)
    x = y;
}
int main() {
  std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> v;
  rep(i, 1, n) cin >> x[i];
  for (; v >> lg; ++lg)
    if (v >> lg)
      init(vec[lg], v >> lg);
  init(vec[lg++], 0);
  if (vec[0].size() < 20) {
    std::fill(g1, g1 + (1 << lg), n + 1);
    rep(i, 0, (1 << lg) - 1) {
      rep(j, 1, lg - 1) if ((i >> j & 1) == 0) {
        int l = 0, r = vec[j].size();
        for (; l + 1 != r;)
          (vec[j][l + r >> 1].first <= g0[i] + 1 ? l : r) = l + r >> 1;
        up(g0[i | 1 << j], vec[j][l].second), l = -1, r = vec[j].size() - 1;
        for (; l + 1 != r;)
          (vec[j][l + r >> 1].second >= g1[i] - 1 ? r : l) = l + r >> 1;
        down(g1[i | 1 << j], vec[j][r].first);
      }
    }
    for (pr i : *vec) {
      for (int j = 0; j < 1 << lg; j += 2) {
        if (g0[j] >= i.first - 1 &&
            i.second + 1 >= g1[~j & (1 << lg) - 1 & -2]) {
          std::fill(ans + i.first, ans + i.second + 1, 1);
          break;
        }
      }
    }
  }
  rep(i, 1, n) { cout << (ans[i] ? "Possible" : "Impossible") << '\n'; }
}


Fixed submission:
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = (l), i##end = (r); i <= i##end; ++i)
using std::cin;
using std::cout;
const int maxn = 200200;
typedef long long ll;
const int mod = 998244353;
inline ll pow(ll a, int b, int ans = 1) {
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1)
      ans = ans * a % mod;
  return ans;
}
inline ll inverse(int x) { return pow(x, mod - 2); }
int n, v, lg;
typedef std::pair<int, int> pr;
int g0[1 << 19], g1[1 << 19];
int x[maxn], ans[maxn];
std::vector<pr> vec[233];
inline void init(std::vector<pr> &v, int d) {
  int l = 1;
  for (int i = 2; i <= n; ++i)
    if (x[i] - x[i - 1] > d)
      v.emplace_back(l, i - 1), l = i;
  v.emplace_back(l, n);
}
inline void up(int &x, int y) {
  if (x < y)
    x = y;
}
inline void down(int &x, int y) {
  if (x > y)
    x = y;
}
int main() {
  std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> v;
  rep(i, 1, n) cin >> x[i];
  for (; v >> lg; ++lg)
    if (v >> lg)
      init(vec[lg], v >> lg);
  init(vec[lg++], 0);
  if (vec[0].size() < 20) {
    std::fill(g1, g1 + (1 << lg), n + 1);
    rep(i, 0, (1 << lg) - 1) {
      rep(j, 1, lg - 1) if ((i >> j & 1) == 0) {
        int l = 0, r = vec[j].size();
        for (; l + 1 != r;)
          (vec[j][l + r >> 1].first <= g0[i] + 1 ? l : r) = l + r >> 1;
        up(g0[i | 1 << j], vec[j][l].second), l = -1, r = vec[j].size() - 1;
        for (; l + 1 != r;)
          (vec[j][l + r >> 1].second >= g1[i] - 1 ? r : l) = l + r >> 1;
        down(g1[i | 1 << j], vec[j][r].first);
      }
    }
    for (pr i : *vec) {
      for (int j = 0; j < 1 << lg; j += 2) {
        if (g0[j] >= i.first - 1 &&
            i.second + 1 >= g1[~j & (1 << lg) - 1 & -2]) {
          std::fill(ans + i.first, ans + i.second + 1, 1);
          break;
        }
      }
    }
  }
  rep(i, 1, n) { cout << (ans[i] ? "Possible" : "Impossible") << '\n'; }
}