#include <bits/stdc++.h>
using namespace std;
int n, v, x[200005];
int go[200005][20], go2[200005][20];
int dp[(1 << 20)], dp2[(1 << 20)];
int used[200005];
pair<int, int> p[200005];
int seg[(1 << 20)] = {};
void update(int k, int a) {
  k += (1 << 20) / 2 - 1;
  seg[k] = a;
  while (k > 0) {
    k = (k - 1) / 2;
    seg[k] = max(seg[k * 2 + 1], seg[k * 2 + 2]);
  }
}
int query(int a, int b, int k, int l, int r) {
  if (r < a || b < l || a > b) return 0;
  if (a <= l && r <= b)
    return seg[k];
  else {
    int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
    int vr = query(a, b, k * 2 + 2, (l + r) / 2 + 1, r);
    return max(vl, vr);
  }
}
int main() {
  cin >> n >> v;
  for (int i = 1; i <= n; i++) cin >> x[i];
  vector<int> vi;
  while (1) {
    vi.push_back(v);
    if (v == 0) break;
    v /= 2;
  }
  for (int j = 0; j < vi.size(); j++) {
    vector<int> vec;
    for (int i = 1; i <= n - 1; i++) {
      if (x[i + 1] - x[i] > vi[j]) {
        vec.push_back(i);
      }
    }
    vec.push_back(n);
    for (int i = 1; i <= n; i++) {
      int e = vec[(lower_bound(vec.begin(), vec.end(), i) - vec.begin())];
      go[i][j] = e;
      if (j == 0) p[i].second = e;
    }
  }
  for (int j = 0; j < vi.size(); j++) {
    vector<int> vec;
    vec.push_back(1);
    for (int i = 1; i <= n - 1; i++) {
      if (x[i + 1] - x[i] > vi[j]) {
        vec.push_back(i + 1);
      }
    }
    for (int i = 1; i <= n; i++) {
      int e = vec[(upper_bound(vec.begin(), vec.end(), i) - vec.begin()) - 1];
      go2[i][j] = e;
      if (j == 0) p[i].first = e;
    }
  }
  for (int i = 0; i < (1 << 20); i++) dp[i] = -1000000000;
  dp[0] = 1;
  int z = vi.size();
  for (int mask = 0; mask < (1 << z); mask++) {
    if (dp[mask] <= 0) continue;
    for (int i = 0; i < z; i++) {
      if (((mask >> i) & 1)) continue;
      int NXT = go[dp[mask] + 1][i];
      if (dp[mask] == n) NXT = n;
      dp[mask + (1 << i)] = max(dp[mask + (1 << i)], NXT);
    }
  }
  for (int i = 0; i < (1 << 20); i++) dp2[i] = 1000000000;
  dp2[0] = n;
  for (int mask = 0; mask < (1 << z); mask++) {
    if (dp2[mask] > n) continue;
    for (int i = 0; i < z; i++) {
      if (((mask >> i) & 1)) continue;
      int NXT = go2[dp2[mask] - 1][i];
      if (dp2[mask] == 1) NXT = 1;
      dp2[mask + (1 << i)] = min(dp2[mask + (1 << i)], NXT);
    }
  }
  for (int i = 1; i <= n - 1; i++) {
    update(i, x[i + 1] - x[i]);
  }
  vector<pair<int, int> > L;
  for (int mask = 0; mask < (1 << z); mask++) {
    if (mask % 2 == 1) continue;
    int mask2 = (1 << z) - 2 - mask;
    int x = dp[mask];
    int y = dp2[mask2];
    if (x + 1 > y - 1)
      used[1] += 1;
    else {
      int L = p[x + 1].first;
      int R = p[x + 1].second;
      if (L <= x + 1 && y - 1 <= R) {
        used[L]++;
        used[R + 1]--;
      }
    }
  }
  for (int i = 2; i <= n; i++) used[i] += used[i - 1];
  for (int i = 1; i <= n; i++) {
    puts(used[i] ? "Possible" : "Impossible");
  }
}
