#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
template<typename T> inline void chkmin(T &a, const T &b) { a = a < b ? a : b; }
template<typename T> inline void chkmax(T &a, const T &b) { a = a > b ? a : b; }

const int MAXN = 200005;
int f[1 << 18], g[1 << 18], pla[MAXN], nxt[18][MAXN], n, V, tn;
vector<int> seg[18];

int main() {
	scanf("%d%d", &n, &V);
	for (int i = 1; i <= n; i++) scanf("%d", pla + i);
	for (int i = V; i; i >>= 1) ++tn;
	for (int i = 0; i < tn; i++) {
		for (int j = 1; j < n; j++)
			if (pla[j] + (V >> i >> 1) < pla[j + 1]) seg[i].push_back(j);
		seg[i].push_back(n);
	}
	int m = 1;
	for (int i = 1; i < n; i++)
		if (pla[i] + V < pla[i + 1]) ++m;
	if (m > tn + 2) {
		for (int i = 1; i <= n; i++) puts("Impossible");
		return 0;
	}
	
	fill(f, f + (1 << tn), 0);
	for (int i = 0; i < tn; i++) {
		int lst = 1;
		for (int j : seg[i]) {
			for (int k = lst; k <= j; k++) nxt[i][k] = j;
			lst = j + 1;
		}
	}
	for (int i = 0; i + 1 < 1 << tn; i++) {
		for (int j = 0; j < tn; j++) if (~i >> j & 1)
			chkmax(f[i | 1 << j], nxt[j][f[i] + 1]);
	}
	
	for (int i = 0; i < tn; i++) {
		int lst = 1;
		for (int j : seg[i]) {
			for (int k = lst; k <= j; k++) nxt[i][k] = lst;
			lst = j + 1;
		}
	}
	fill(g, g + (1 << tn), n + 1);
	for (int i = 0; i + 1 < 1 << tn; i++) {
		for (int j = 0; j < tn; j++) if (~i >> j & 1)
			chkmin(g[i | 1 << j], nxt[j][g[i] - 1]);
	}
	
	int lst = 1;
	for (int i = 1; i <= n; i++) {
		if (i < n && pla[i] + V >= pla[i + 1]) continue;
		bool flag = false;
		for (int j = 0; j < 1 << tn; j++)
			if (f[j] >= lst - 1 && g[j ^ ((1 << tn) - 1)] <= i + 1) { flag = true; break; }
		for (int j = lst; j <= i; j++) puts(flag ? "Possible" : "Impossible");
		lst = i + 1;
	}
	return 0;
}