#include <bits/stdc++.h>
using namespace std;
int n, V, x[100000 + 5];
int cnt[25];
int l[25][100000 + 5], r[25][100000 + 5];
int f1[100000 * 5 + 5], f2[100000 * 5 + 5];
bool ans[100000 + 5];
void Init() {
  for (int i = 0; i <= 100000 * 2 + 3; i++) f1[i] = 0, f2[i] = 2000000000;
}
int UpFind(int id, int pos) {
  pos++;
  int p = upper_bound(l[id] + 1, l[id] + cnt[id] + 1, pos) - l[id];
  p--;
  if (p <= 0) return pos;
  return max(r[id][p], pos - 1);
}
int LowFind(int id, int pos) {
  pos--;
  int p = lower_bound(r[id] + 1, r[id] + cnt[id] + 1, pos) - r[id];
  if (p >= cnt[id] + 1) return pos;
  return min(l[id][p], pos + 1);
}
int main() {
  Init();
  scanf("%d %d", &n, &V);
  int logV = 0;
  for (logV = 0; (1 << logV) <= n; logV++)
    ;
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  x[n + 1] = 2000000000;
  x[0] = -2000000000;
  for (int LG = 0; LG <= logV; LG++) {
    int d = V / (1 << LG);
    cnt[LG] = 1;
    l[LG][1] = 1;
    for (int i = 1; i <= n; i++) {
      r[LG][cnt[LG]] = i;
      if (x[i + 1] - x[i] > d) {
        cnt[LG]++;
        l[LG][cnt[LG]] = i + 1;
      }
    }
    cnt[LG]--;
  }
  if (cnt[0] > logV) {
    for (int i = 1; i <= n; i++) printf("Impossible\n");
    return 0;
  }
  int all = (1 << (logV + 1));
  f1[0] = 0, f2[0] = n + 1;
  for (int s = 0; s < all; s += 2)
    for (int i = 0; i <= logV; i++) {
      if (!(s & (1 << i))) continue;
      f1[s] = max(f1[s], UpFind(i, f1[s - (1 << i)]));
      f2[s] = min(f2[s], LowFind(i, f2[s - (1 << i)]));
    }
  for (int i = 1; i <= cnt[0]; i++) {
    int ln = l[0][i], rn = r[0][i];
    for (int s1 = 0; s1 < all; s1 += 2) {
      int s2 = all - 1 - s1 - 1;
      int lpos = f1[s1];
      int rpos = f2[s2];
      if (lpos >= ln - 1 && rpos <= rn + 1) {
        ans[i] = true;
        break;
      }
    }
  }
  int pos = 1;
  for (int i = 1; i <= n; i++) {
    if (ans[pos] == true)
      printf("Possible\n");
    else
      printf("Impossible\n");
    if (x[i + 1] - x[i] > V) pos++;
  }
  return 0;
}
