#include <bits/stdc++.h>
using namespace std;
int N;
int V;
int xs[214514];
int vs[20];
int dp1[1145141];
int dp2[1145141];
int dp3[1145141];
int dp4[1145141];
vector<int> segs[20];
int main() {
  scanf("%d%d", &N, &V);
  for (int i = 0; i < N; i++) {
    scanf("%d", &xs[i]);
  }
  int v = V;
  int cnt = 0;
  while (v >= 0) {
    vs[cnt++] = v;
    if (v == 0) break;
    v /= 2;
  }
  for (int i = 0; i < cnt; i++) {
    int v = vs[i];
    segs[i].emplace_back(0);
    for (int idx = 1; idx < N; idx++) {
      if (xs[idx] - xs[idx - 1] > v) segs[i].emplace_back(idx);
    }
    segs[i].emplace_back(N);
  }
  int lim = 1 << cnt;
  fill(dp1, dp1 + lim, -1);
  dp1[0] = 0;
  for (int st = 0; st < lim; st++) {
    for (int i = 0; i < cnt; i++) {
      if (st >> i & 1) continue;
      int nst = st | (1 << i);
      int g = *upper_bound(segs[i].begin(), segs[i].end(), dp1[st]);
      dp1[nst] = max(dp1[nst], g);
    }
  }
  fill(dp2, dp2 + lim, N);
  dp2[0] = N - 1;
  for (int st = 0; st < lim; st++) {
    for (int i = 0; i < cnt; i++) {
      if (st >> i & 1) continue;
      int nst = st | (1 << i);
      auto itr = upper_bound(segs[i].begin(), segs[i].end(), dp2[st]);
      itr--;
      dp2[nst] = min(dp2[nst], *itr - 1);
    }
  }
  for (int i = 0; i < N; i++) {
    auto itr = upper_bound(segs[0].begin(), segs[0].end(), i);
    int b = *itr;
    itr--;
    int a = *itr - 1;
    bool ok = false;
    for (int st = 0; st < lim; st++) {
      if (st & 1) continue;
      int cst = (lim - 1) & (~st) & ~1;
      if (dp1[st] > a && dp2[cst] < b) ok = true;
      if (ok) break;
    }
    if (ok)
      puts("Possible");
    else
      puts("Impossible");
  }
}
