#include <bits/stdc++.h>

inline int read() {
	int ret, cc, sign = 1;
	while (!isdigit(cc = getchar()))
		sign = cc == '-' ? -1 : sign;
	ret = cc - 48;
	while ( isdigit(cc = getchar()))
		ret = cc - 48 + ret * 10;
	return ret * sign;
}

const int MAXN = 300010;
int val[MAXN];
int pos[MAXN];
int left[30][MAXN];
int right[30][MAXN];
int dp[2][MAXN];
int tot, n, V;

int main() {
#ifdef ARK
	freopen("test.in", "r", stdin);
#endif
	n = read(), V = read();
	for (int i = 1; i <= n; ++i)
		pos[i] = read();

	val[0] = V / 2;
	while (val[tot]) 
		val[tot + 1] = val[tot] / 2, ++tot;

	for (int i = 0; i <= tot; ++i) {
		right[i][n + 1] = n + 1, right[i][n] = n;
		for (int j = n - 1; j >= 1; --j) 
			if (pos[j + 1] - pos[j] <= val[i])
				right[i][j] = right[i][j + 1];
			else
				right[i][j] = j;

		left[i][1] = 1;
		for (int j = 2; j <= n; ++j)
			if (pos[j] - pos[j - 1] <= val[i])
				left[i][j] = left[i][j - 1];
			else
				left[i][j] = j;
	}

	int U = (1 << (tot + 1)) - 1;
	dp[0][0] = 0, dp[1][0] = n + 1;
	for (int S = 1; S <= U; ++S) {
		dp[1][S] = n + 1;
		for (int j = 0; j <= tot; ++j) 
			if (S >> j & 1) {
				dp[0][S] = std::max(right[j][dp[0][S ^ (1 << j)] + 1], dp[0][S]);
				dp[1][S] = std::min(left[j][dp[1][S ^ (1 << j)] - 1], dp[1][S]);
			}
	}

	for (int i = 1; i <= n; ++i) {
		int r = i;
		while (r < n && pos[r + 1] - pos[r] <= V) r++;
		bool flag = 0;
		for (int S = 0; S <= U; ++S) 
			if (dp[0][S] >= i - 1 && dp[1][U ^ S] <= r + 1) {
				flag = 1;
				break;
			}
		for (int j = i; j <= r; ++j) 
			puts(flag ? "Possible" : "Impossible");
		i = r;
	}
}
