#include <bits/stdc++.h>
using namespace std;
const pair<int, int> DD[] = {{1, 0},  {1, 1},   {0, 1},  {-1, 1},
                             {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
inline int readChar();
template <class T = int>
inline T readInt();
template <class T>
inline void writeInt(T first, char end = 0);
inline void writeChar(int first);
inline void writeWord(const char *s);
static const int buf_size = 4096;
inline int getChar() {
  static char buf[buf_size];
  static int len = 0, pos = 0;
  if (pos == len) pos = 0, len = fread(buf, 1, buf_size, stdin);
  if (pos == len) return -1;
  return buf[pos++];
}
inline int readChar() {
  int c = getChar();
  while (c <= 32) c = getChar();
  return c;
}
template <class T>
inline T readInt() {
  int s = 1, c = readChar();
  T first = 0;
  if (c == '-') s = -1, c = getChar();
  while ('0' <= c && c <= '9') first = first * 10 + c - '0', c = getChar();
  return s == 1 ? first : -first;
}
static int write_pos = 0;
static char write_buf[buf_size];
inline void writeChar(int first) {
  if (write_pos == buf_size)
    fwrite(write_buf, 1, buf_size, stdout), write_pos = 0;
  write_buf[write_pos++] = first;
}
template <class T>
inline void writeInt(T first, char end) {
  if (first < 0) writeChar('-'), first = -first;
  char s[24];
  int n = 0;
  while (first || !n) s[n++] = '0' + first % 10, first /= 10;
  while (n--) writeChar(s[n]);
  if (end) writeChar(end);
}
inline void writeWord(const char *s) {
  while (*s) writeChar(*s++);
}
struct Flusher {
  ~Flusher() {
    if (write_pos) fwrite(write_buf, 1, write_pos, stdout), write_pos = 0;
  }
} flusher;
template <class T>
T smin(T &a, T b) {
  if (a > b) a = b;
  return a;
}
template <class T>
T smax(T &a, T b) {
  if (a < b) a = b;
  return a;
}
int main(void) {
  srand(time(0));
  cout << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  static int Dp1[20][1 << 20];
  static int Dp2[20][1 << 20];
  int n, k;
  n = readInt();
  k = readInt();
  vector<int> ss;
  ss.push_back(k / 2);
  while (ss.back()) ss.push_back(ss.back() / 2);
  static int s[1 << 20];
  for (int i = 1; i <= n; ++i) s[i] = readInt();
  static int D1[1 << 20];
  static int D2[1 << 20];
  const int lg = ss.size();
  const int N = 1 << lg;
  for (int t = 0; t < lg; ++t) {
    Dp1[t][1] = 0;
    for (int i = 2; i <= n; ++i)
      if (s[i] - s[i - 1] <= ss[t])
        Dp1[t][i] = Dp1[t][i - 1];
      else
        Dp1[t][i] = i - 1;
    Dp2[t][n] = Dp2[t][n + 1] = n + 1;
    for (int i = n - 1; i; --i)
      if (s[i + 1] - s[i] <= ss[t])
        Dp2[t][i] = Dp2[t][i + 1];
      else
        Dp2[t][i] = i + 1;
  }
  D1[0] = 0;
  for (int mask = 1; mask < N; ++mask)
    for (int i = 0; i < lg; ++i)
      if ((mask >> i) & 1) smax(D1[mask], Dp2[i][D1[mask ^ (1 << i)] + 1] - 1);
  for (int mask = 0; mask < N; ++mask) D2[mask] = n + 1;
  for (int mask = 1; mask < N; ++mask)
    for (int i = 0; i < lg; ++i)
      smin(D2[mask], Dp1[i][D2[mask ^ (1 << i)] - 1] + 1);
  static int answer[1 << 20];
  static int tt[1 << 20];
  tt[1] = 1;
  for (int i = 2; i <= n; ++i)
    if (s[i] - s[i - 1] <= k)
      tt[i] = tt[i - 1];
    else
      tt[i] = i;
  for (int mask = 0; mask < N; ++mask) {
    const int l = D1[mask] + 1;
    const int r = D2[(N - 1) ^ mask] - 1;
    if (l > r) ++answer[1], --answer[n + 1];
    if (tt[r] <= l) ++answer[l], --answer[r + 1];
  }
  for (int i = 1; i <= n; ++i) answer[i] += answer[i - 1];
  for (int i = 1; i <= n; ++i)
    if (answer[i])
      puts("Possible");
    else
      puts("Impossible");
  cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
  return 0;
}
