#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif

#include <bits/stdc++.h>

using namespace std;

mt19937 mrand(random_device{} ()); 

int rnd(int x) {
  return mrand() % x;
}

typedef long double ld;
typedef long long ll;

#ifdef DEBUG
#define eprintf(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
#else
#define eprintf(...) ;
#endif

#define pb push_back
#define mp make_pair
#define sz(x) ((int) (x).size())
#define TASK "text"

const int inf = (int) 1.01e9;
const ld eps = 1e-9;
const ld pi = acos((ld) -1.0);

const int mod = (int) 1e9 + 7;

void add(int &x, int y) {
  if ((x += y) >= mod) {
    x -= mod;
  }
}

int mult(int x, int y) {
  return (long long) x * y % mod;
}

int power(int x, int pw) {
  int res = 1;
  for (; pw; pw >>= 1) {
    if (pw & 1) {
      res = mult(res, x);
    }
    x = mult(x, x);
  }
  return res;
}

void precalc() {
}


const int maxn = (int) 2e5 + 10;
int a[maxn];
int n, V;

int read() {
  if (scanf("%d%d", &n, &V) < 2) {
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    scanf("%d", a + i);
  }
  return 1;
}

const int maxl = 19;
int vals[maxl + 1];
int precs[maxl + 1][maxn];

int dp[2][1 << maxl];

int go[2][maxn];

int froml[maxn];

void solve() {
  sort(a, a + n);


  int lg = 0;
  for (int x = V / 2; x; x /= 2) {
    vals[lg++] = x;
  }
  vals[lg++] = 0;
  assert(lg <= maxl);
  vals[lg] = V;


  for (int iter = 0; iter < 2; ++iter) {
    for (int it = 0; it <= lg; ++it) {
      auto &prec = precs[it];

      int r = n - 1;
      for (int i = n - 1; i >= 0; --i) {
        auto &cur = prec[i];
        cur = r;
        if (i && a[i] - a[i - 1] > vals[it]) {
          r = i - 1;
        }
      }
    }

    for (int i = 0; i < n; ++i) {
      int s = i;
      int t = precs[lg][s];
      if (iter) {
        s = n - 1 - s, t = n - 1 - t;
      }
      go[iter][s] = t;
    }

    auto &d = dp[iter];
    for (int i = 0; i < (1 << lg); ++i) {
      d[i] = 0;
    }

    for (int mask = 0; mask < (1 << lg); ++mask) {
      int cur = d[mask];
      //eprintf("d[mask = %d] = %d\n", mask, cur);
      for (int it = 0; it < lg; ++it) {
        if (mask & (1 << it)) {
          continue;
        }

        int nval = cur;
        if (nval < n) {
          nval = precs[it][nval] + 1;
        }
        auto &toup = d[mask ^ (1 << it)];
        toup = max(toup, nval);
      }
    }


    reverse(a, a + n);
    for (int i = 0; i < n; ++i) {
      a[i] = -a[i];
    }
  }

  for (int i = 0; i <= n; ++i) {
    froml[i] = -1;
  }

  for (int mask = 0; mask < (1 << lg); ++mask) {
    int cntl = dp[0][mask];
    int cntr = dp[1][((1 << lg) - 1) ^ mask];

    froml[cntl] = max(froml[cntl], cntr);
  }

  for (int i = n - 1; i >= 0; --i) {
    froml[i] = max(froml[i], froml[i + 1]);
  }

  for (int i = 0; i < n; ++i) {
    int r = go[0][i], l = go[1][i];
    //eprintf("l = %d, r = %d\n", l, r);
    if (froml[l] >= n - r - 1) {
      printf("Possible\n");
    } else {
      printf("Impossible\n");
    }
  }
  //exit(0);
}

int main() {
  precalc();
#ifdef LOCAL
  freopen(TASK ".out", "w", stdout);
  assert(freopen(TASK ".in", "r", stdin));
#endif

  while (1) {
    if (!read()) {
      break;
    }
    solve();
#ifdef DEBUG
    eprintf("Time %.2f\n", (double) clock() / CLOCKS_PER_SEC);
#endif
  }
  return 0;
}


Measured memory_bytes: 25216