#include <bits/stdc++.h>
using namespace std;
void MI(long long &a, long long v) { a = min(a, v); }
void MA(long long &a, long long v) { a = max(a, v); }
const long long N = 2e5, L = 18, PL = 1 << L;
long long l, n, v, pl;
deque<long long> len;
void gen(long long x[], long long nxt[][N], long long reach[]) {
  for (long long k = 0; k < (long long)(l); k++) {
    long long cur = 0;
    for (long long i = 0; i < (long long)(n + 1); i++) {
      if (i == n || (i - 1 >= 0 && abs(x[i] - x[i - 1]) > len[k])) {
        while (cur < i) {
          nxt[k][cur] = i;
          cur++;
        }
      }
    }
  }
  for (long long mask = 0; mask < (long long)(pl); mask++) {
    reach[mask] = 0;
    for (long long k = 0; k < (long long)(l); k++)
      if (mask & 1 << k) MA(reach[mask], nxt[k][reach[mask - (1 << k)]]);
  }
}
void print(long long nxt[][N]) {
  for (long long k = 0; k < (long long)(l); k++) {
    cout << len[k] << ": ";
    for (long long i = 0; i < (long long)(n); i++)
      cout << nxt[k][i] << " \n"[i == n - 1];
  }
}
long long x[N], rev[N];
long long nxt[L][N], pre[L][N], rLeft[PL], rRight[PL];
bool ok[N];
signed main() {
  cin >> n >> v;
  for (long long i = 0; i < (long long)(n); i++)
    cin >> x[i], rev[n - 1 - i] = x[i], ok[i] = false;
  len = {v};
  long long cur = v;
  while (cur) cur /= 2, len.push_front(cur);
  l = len.size();
  pl = 1 << l;
  gen(x, nxt, rLeft);
  gen(rev, pre, rRight);
  long long start = pl / 2;
  long long offer[n + 1];
  for (long long i = 0; i < (long long)(n + 1); i++) offer[i] = -1;
  for (long long mleft = 0; mleft < (long long)(start); mleft++) {
    long long le = rLeft[mleft], ri = n - rRight[start - 1 - mleft];
    MA(offer[ri], le);
  }
  long long best = -1;
  cur = 0;
  while (cur < n) {
    long long lim = nxt[l - 1][cur];
    for (long long i = cur; i <= lim; i++) MA(best, offer[i]);
    for (long long i = cur; i < lim; i++)
      cout << (cur <= best ? "Possible" : "Impossible") << endl;
    cur = lim;
  }
}
