#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, V, x[N], toR[18][N], toL[18][N], len;
int fL[1 << 18], fR[1 << 18];
void prepare(int toR[][N], int *fL, const vector<int> &x) {
  int V = ::V;
  len = 0;
  while (V >= 0) {
    toR[len][n] = toR[len][n + 1] = n;
    for (int i = (n)-1; i >= (1); --i)
      toR[len][i] = abs(x[i] - x[i + 1]) <= V ? toR[len][i + 1] : i;
    len++;
    if (V == 0) break;
    V >>= 1;
  }
  for (int i = 0; i < (1 << len); ++i) fL[i] = 0;
  for (int i = 0; i < (1 << len); ++i) {
    for (int j = 0; j < (len); ++j)
      if (~i >> j & 1) fL[i | 1 << j] = max(fL[i | 1 << j], toR[j][fL[i] + 1]);
  }
}
int main() {
  scanf("%d%d", &n, &V);
  for (int i = 1; i < (n + 1); ++i) scanf("%d", x + i);
  vector<int> v(x, x + 1 + n);
  prepare(toR, fL, v);
  reverse(v.begin() + 1, v.begin() + 1 + n);
  prepare(toL, fR, v);
  vector<pair<int, int> > seg;
  int full = (1 << len) - 1 - 1;
  for (int i = 0; i < (1 << len); ++i)
    if (~i & 1) {
      seg.push_back(make_pair(-fR[i], fL[full ^ i]));
    }
  sort((seg).begin(), (seg).end());
  int cur = 0, leftmost = -1;
  for (int i = 1; i < (n + 1); ++i) {
    int left = n + 1 - toL[0][n + 1 - i];
    int right = toR[0][i];
    while (cur < (int)(seg).size() && -seg[cur].first + right >= n) {
      leftmost = max(leftmost, seg[cur].second);
      cur++;
    }
    if (leftmost + 1 >= left)
      puts("Possible");
    else
      puts("Impossible");
  }
  return 0;
}
