#include <bits/stdc++.h>
using namespace std;
int n, m;
int po[400400];
int mlg;
vector<int> li[22];
int mr[22][400400];
int ml[22][400400];
void get_line(int pos, int ma) {
  li[pos].push_back(0);
  for (int i = 1; i <= n; ++i)
    if (i == 1 || po[i] - po[i - 1] > ma) li[pos].push_back(i);
  li[pos].push_back(n + 1);
  for (int i = 1, p = 0; i <= n; ++i) {
    mr[pos][i] = mr[pos][i - 1];
    if (i == li[pos][p + 1]) p++, mr[pos][i] = li[pos][p + 1] - 1;
  }
  mr[pos][n + 1] = n;
  ml[pos][n + 1] = n + 1;
  for (int i = n, p = li[pos].size() - 1; i; --i) {
    ml[pos][i] = ml[pos][i + 1];
    if (i == li[pos][p] - 1) p--, ml[pos][i] = li[pos][p];
  }
}
int pre[400400], suf[400400];
int ans[22];
void out(int ma) {
  for (int i = 1; i <= ma; ++i)
    for (int j = li[0][i]; j < li[0][i + 1]; ++j)
      puts(ans[i] ? "Possible" : "Impossible");
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%d", &po[i]);
  for (int tm = m; tm; mlg++, tm >>= 1) get_line(mlg, tm);
  get_line(mlg, 0);
  mlg++;
  int s = 1 << mlg, nxt;
  memset(suf, 0x3f, sizeof(suf));
  suf[0] = n + 1;
  for (int i = 0; i < s; ++i) {
    for (int j = 0; j < mlg; ++j) {
      if ((i >> j) & 1) continue;
      nxt = (i | (1 << j));
      pre[nxt] = max(pre[nxt], mr[j][pre[i] + 1]);
      suf[nxt] = min(suf[nxt], ml[j][suf[i] - 1]);
    }
  }
  int ma = li[0].size() - 2;
  if (ma > mlg) {
    for (int i = 1; i <= n; ++i) puts("Impossible");
    return 0;
  }
  s--;
  int ls = (s ^ 1);
  for (int i = 1, L, R; i <= ma; ++i) {
    L = li[0][i];
    R = li[0][i + 1] - 1;
    for (int j = 0; j <= s; ++j) {
      if (j & 1) continue;
      if (pre[j] >= L - 1 && suf[(s ^ j) & ls] <= R + 1) {
        ans[i] = 1;
        break;
      }
    }
  }
  out(ma);
  return 0;
}
