#include <bits/stdc++.h>
using namespace std;
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
inline int read() {
  register int x = 0;
  register int f = 1;
  register char c;
  while (!isdigit(c = getchar()))
    if (c == '-') f = -1;
  while (x = (x << 1) + (x << 3) + (c xor 48), isdigit(c = getchar()))
    ;
  return x * f;
}
template <class T>
inline void write(T x) {
  static char stk[30];
  static int top = 0;
  if (x < 0) {
    x = -x, putchar('-');
  }
  while (stk[++top] = x % 10 xor 48, x /= 10, x)
    ;
  while (putchar(stk[top--]), top)
    ;
}
template <typename T>
inline bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
const int maxN = (int)2e5, LOG = 18;
bool ans[maxN + 2];
int f[maxN + 2], g[maxN + 2], x[maxN + 2], n, V, Floor;
struct Seg {
  int l, r;
  Seg() {}
  Seg(int l, int r) : l(l), r(r) {}
  bool operator<(Seg B) const { return r < B.r; }
};
vector<Seg> seg[LOG + 1], rev_seg[LOG + 1];
void Input() {
  n = read(), V = read();
  for (int i = 1; i <= n; ++i) x[i] = read();
}
void Init() {
  for (int t = 0; (V * 2) >> t; ++t) {
    Floor = t;
    int last = 1, d = V >> t;
    for (int i = 1; i <= n; ++i) {
      if (x[i + 1] - x[i] > d) {
        seg[t].push_back(Seg(last, i));
        rev_seg[t].push_back(Seg(n - i + 1, n - last + 1));
        last = i + 1;
      }
    }
    seg[t].push_back(Seg(last, n));
    rev_seg[t].push_back(Seg(1, n - last + 1));
    reverse(rev_seg[t].begin(), rev_seg[t].end());
  }
}
void Solve() {
  for (int S = 0; S < 1 << Floor + 1; S += 2) {
    for (int i = 1; i <= Floor; ++i)
      if (!(S >> i & 1)) {
        int p = upper_bound(seg[i].begin(), seg[i].end(), Seg(0, f[S])) -
                seg[i].begin();
        if (p != (int)seg[i].size()) chkmax(f[S | (1 << i)], seg[i][p].r);
      }
  }
  for (int S = 0; S < 1 << Floor + 1; S += 2) {
    for (int i = 1; i <= Floor; ++i)
      if (!(S >> i & 1)) {
        int p =
            upper_bound(rev_seg[i].begin(), rev_seg[i].end(), Seg(0, g[S])) -
            rev_seg[i].begin();
        if (p != (int)rev_seg[i].size())
          chkmax(g[S | (1 << i)], rev_seg[i][p].r);
      }
  }
  for (auto s : seg[0]) {
    bool ok = 0;
    for (int S = 0; S < 1 << Floor + 1; S += 2) {
      int T = ((1 << Floor + 1) - 1) ^ 1 ^ S;
      if (f[S] >= s.l - 1 and g[T] >= (n - s.r + 1) - 1) {
        ok = 1;
        break;
      }
    }
    if (ok)
      for (int i = s.l; i <= s.r; ++i) ans[i] = 1;
  }
  for (int i = 1; i <= n; ++i)
    if (ans[i])
      puts("Possible");
    else
      puts("Impossible");
}
int main() {
  Input();
  Init();
  Solve();
  return 0;
}
