#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T sqr(const T &a) {
  return a * a;
}
void procStatus() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
long long read() {
  long long x = 0, flag = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') flag *= -1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
  return x * flag;
}
void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
const int Maxn = 4e5 + 9;
int n, V, a[Maxn];
void Init() {
  n = read(), V = read();
  for (int i = (1), i_end_ = (n); i <= i_end_; ++i) a[i] = read();
}
int pon[20][Maxn];
int len[Maxn], lef[Maxn], rig[Maxn];
int uppfind(int pos, int step) {
  int l = 1, r = len[step], ans = -1;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (pon[step][mid] > pos)
      ans = pon[step][mid], r = mid - 1;
    else
      l = mid + 1;
  }
  return ans;
}
int lowfind(int pos, int step) {
  int l = 1, r = len[step], ans = pon[step][l];
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (pon[step][mid] < pos)
      ans = pon[step][mid], l = mid + 1;
    else
      r = mid - 1;
  }
  return ans;
}
void Solve() {
  int cnt = 0;
  while ((1 << cnt) <= V) ++cnt;
  for (int i = (0), i_end_ = (cnt); i <= i_end_; ++i) {
    len[i] = 1;
    for (int j = (1), j_end_ = (n); j <= j_end_; ++j) {
      pon[i][len[i]] = j;
      if (j != n && a[j + 1] - a[j] > (V >> i)) ++len[i];
    }
    printf("In %d\n", i);
    for (int j = (1), j_end_ = (len[i]); j <= j_end_; ++j)
      printf("%d ", pon[i][j]);
    puts("");
    pon[i][len[i] + 1] = n + 1;
  }
  if (len[0] > cnt + 1) {
    for (int i = (1), i_end_ = (n); i <= i_end_; ++i) puts("Impossible");
    return;
  }
  for (int i = (0), i_end_ = ((1 << cnt) - 1); i <= i_end_; ++i)
    lef[i] = 0, rig[i] = n + 1;
  for (int i = (0), i_end_ = ((1 << cnt) - 1); i <= i_end_; ++i) {
    for (int j = (0), j_end_ = (cnt - 1); j <= j_end_; ++j) {
      if ((i >> j) & 1) continue;
      chkmax(lef[i ^ (1 << j)], max(uppfind(lef[i], j + 1), lef[i]));
      chkmin(rig[i ^ (1 << j)], min(lowfind(rig[i] - 1, j + 1), rig[i] - 1));
    }
    printf("%d: %d %d\n", i, lef[i], rig[i]);
  }
  for (int i = (1), i_end_ = (len[0]); i <= i_end_; ++i) {
    int l = pon[0][i - 1] + 1, r = pon[0][i];
    int flag = 0;
    for (int j = (0), j_end_ = ((1 << cnt) - 1); j <= j_end_; ++j)
      if (lef[j] >= l - 1 && rig[(1 << cnt) - 1 - j] <= r + 1) {
        flag = 1;
        break;
      }
    for (int j = (l), j_end_ = (r); j <= j_end_; ++j)
      puts(flag ? "Possible" : "Impossible");
  }
}
int main() {
  Init();
  Solve();
  return 0;
}
