#include <bits/stdc++.h>

#define ctz __builtin_ctz

const int N = 200005, inf = 0x3f3f3f3f;

void up(int &x, int y) { x = std::max(x, y); }
void down(int &x, int y) { x = std::min(x, y); }

int f[N], g[N], x[N], L[19][N], R[19][N], sum[N];

int main() {
	std::ios::sync_with_stdio(0), std::cin.tie(0);
	int n, v; std::cin >> n >> v;
	int lg = std::__lg(v) + 1, mask = ~(-1 << lg);
	x[0] = -inf, x[n + 1] = inf;
	for (int i = 1; i <= n; ++i) std::cin >> x[i];
	for (int t = 0; t <= lg; ++t) {
		int _v = v >> t;
		for (int i = 1; i <= n; ++i)
			L[t][i] = x[i] - x[i - 1] <= _v ? L[t][i - 1] : i;
		for (int i = n; i >= 1; --i)
			R[t][i] = x[i + 1] - x[i] <= _v ? R[t][i + 1] : i;
	}
	std::fill(g, g + mask + 1, n + 1);
	for (int i = 0; i < mask; ++i) {
		for (int _j = mask ^ i, j = ctz(_j); _j; j = ctz(_j &= _j - 1)) {
			up(f[i | 1 << j], f[i]);
			if (f[i] < n) up(f[i | 1 << j], R[j + 1][f[i] + 1]);
			down(g[i | 1 << j], g[i]);
			if (g[i] > 1) down(g[i | 1 << j], L[j + 1][g[i] - 1]);
		}
	}
	for (int i = 0; i <= mask; ++i)
		if (f[i] + 1 >= g[mask - i]) {
			while (n--) std::cout << "Possible\n"; return 0;
		}
	for (int i = 0; i <= mask; ++i)
		if (R[0][f[i] + 1] + 1 >= g[mask - i])
			++sum[f[i] + 1], --sum[R[0][f[i] + 1] + 1];
	for (int i = 1; i <= n; ++i) sum[i] += sum[i - 1];
	for (int i = 1; i <= n; ++i) std::cout << (sum[i] ? "Possible" : "Impossible") << '\n';
	
	return 0;
}