#include <bits/stdc++.h>
using namespace std;
int n, m, cnt, a[131072], b[20], l[20][131072], r[20][131072], f[131072],
    g[131072];
struct node {
  int x, y;
  node() {}
  node(int a, int b) { x = a, y = b; }
} c[131072];
const bool cmp(const node &x, const node &y) { return x.y < y.y; }
int main() {
  scanf("%d%d", &n, &m);
  for (; m; m >>= 1) b[++cnt] = m;
  b[++cnt] = 0;
  for (int i = (1); i <= (cnt >> 1); i++) swap(b[i], b[cnt - i + 1]);
  m = 1 << cnt - 1;
  for (int i = (1); i <= (n); i++) scanf("%d", &a[i]);
  for (int i = (1); i <= (cnt); i++) {
    l[i][1] = 1;
    r[i][n] = n;
    for (int j = (2); j <= (n); j++)
      l[i][j] = a[j] - a[j - 1] <= b[i] ? l[i][j - 1] : j;
    for (int j = (n - 1); j >= (1); j--)
      r[i][j] = a[j + 1] - a[j] <= b[i] ? r[i][j + 1] : j;
  }
  for (int i = (0); i <= (m - 1); i++) g[i] = n + 1, f[i] = 0;
  for (int i = (1); i <= (m - 1); i++)
    for (int j = (1); j <= (cnt - 1); j++)
      if ((i >> j - 1) & 1) {
        int k = i ^ 1 << j - 1;
        f[i] = max(f[i], f[k] < n ? r[j][f[k] + 1] : n);
        g[i] = min(g[i], g[k] > 1 ? l[j][g[k] - 1] : 1);
      }
  for (int i = (0); i <= (m - 1); i++)
    if (f[i] + 1 < g[m - 1 ^ i] - 1)
      c[i + 1] = node(f[i] + 1, g[m - 1 ^ i] - 1);
    else {
      for (int j = (1); j <= (n); j++) puts("Possible");
      return 0;
    }
  sort(c + 1, c + 1 + m, cmp);
  for (int i = 1, j = 1, k = 0; i <= n; i++) {
    while (j <= m && c[j].y <= r[cnt][i]) {
      j++;
      k = max(k, c[j].x);
    }
    if (k >= l[cnt][i])
      puts("Possible");
    else
      puts("Impossible");
  }
  return 0;
}
