#include <bits/stdc++.h>
struct {
  inline operator int() {
    int x;
    return scanf("%d", &x), x;
  }
  inline operator long long() {
    long long x;
    return scanf("%lld", &x), x;
  }
  template <class T>
  inline void operator()(T &x) {
    x = *this;
  }
  template <class T, class... A>
  inline void operator()(T &x, A &...a) {
    x = *this;
    this->operator()(a...);
  }
} read;
const int maxn = 400005, maxk = 20;
int x[maxn];
int exl[maxn], exr[maxn];
int l[maxk][maxn], r[maxk][maxn];
int len[maxk];
int main() {
  int n = read, v = read;
  for (int i = 1; i <= n; i++) read(x[i]);
  int d = 0;
  while (v) {
    len[d++] = v;
    v >>= 1;
  }
  ++d;
  for (int k = 0; k < d; k++) {
    l[k][1] = 1;
    for (int i = 2; i <= n; i++)
      if (x[i - 1] + len[k] >= x[i])
        l[k][i] = l[k][i - 1];
      else
        l[k][i] = i;
    r[k][n] = n;
    for (int i = n - 1; i; i--)
      if (x[i] + len[k] >= x[i + 1])
        r[k][i] = r[k][i + 1];
      else
        r[k][i] = i;
  }
  for (int S = 0; S < (1 << d); S++) {
    exl[S] = 0;
    exr[S] = n + 1;
    for (int k = 0; k < d; k++)
      if (S >> k & 1) {
        int T = S ^ (1 << k);
        exl[S] = std::max(exl[S], r[k][exl[T] + 1]);
        exr[S] = std::min(exr[S], l[k][exr[T] - 1]);
      }
  }
  int tot = 0;
  for (int i = 1; i <= n; i = r[0][i] + 1) {
    ++tot;
    if (tot >= maxk) {
      for (int j = i; j <= n; j++) puts("Impossible");
      return 0;
    }
    bool ok = 0;
    for (int S = 0; S < (1 << d); S += 2) {
      int T = ((1 << d) - 2) ^ S;
      if (exl[S] + 1 >= exr[T] or (exl[S] + 1 >= i and r[0][i] + 1 >= exr[T])) {
        ok = 1;
        break;
      }
    }
    for (int j = i; j <= r[0][i]; j++)
      if (ok)
        puts("Possible");
      else
        puts("Impossible");
  }
}
