#include <bits/stdc++.h>
#define mset(a, b) memset(a, b, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN = 200005;
const int MAXS = (1 << 18) + 5;
const int INF = 0x3f3f3f3f;

template <typename T> inline void read(T &AKNOI) {
	T x = 0, flag = 1;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') flag = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	AKNOI = flag * x;
}

template <typename T> inline void cmax(T &x, T y) {
	if (x < y) x = y;
}

int n, V, x[MAXN], ok[MAXN];
int v[20], m, S;

struct Work {
	int lbd[MAXN], rbd[20][MAXN], cnt[20];
	int dp[MAXS];
	
	void work() {
		for (int i = 0; i <= m; ++i) {
			for(int j = 1, lst = 0; j <= n; ++j){
		        if (j < n && abs(x[j + 1] - x[j]) <= v[i]) continue;
		        for (int k = lst + 1; k <= j; ++k) {
		        	rbd[i][k] = j;
		        	if (i == m) lbd[k] = lst + 1;
		        }
		        lst = j;
		    }
		}
		for (int s = 0; s < S; ++s) {
			for (int i = 0; i < m; ++i) {
				if ((s >> i) & 1) continue;
				cmax(dp[s | (1 << i)], rbd[i][dp[s] + 1]);
			}
		}
	}
} L, R;

void init() {
	read(n); read(V);
	for (int i = n; i >= 1; --i) {
		read(x[i]);
	}
	for (; V; V /= 2) {
		v[m++] = V;
	}
	v[m] = 0;
	reverse(v, v + m + 1);
	S = (1 << m);
}

void solve() {
	R.work();
	reverse(x + 1, x + n + 1);
	L.work();
	for (int s = 0; s < S; ++s) {
		int l = min(n, L.dp[s] + 1), r = max(1, n - R.dp[(S - 1) ^ s]);
		if (l > r) {
			mset(ok, -1); break;
		} else if (L.rbd[m][l] == L.rbd[m][r]) {
			ok[L.rbd[m][r]] = 1;
		}
	}
	for (int i = 1; i <= n; ++i) {
		puts(ok[L.rbd[m][i]]? "Possible" :"Impossible");
	}
}

int main() {
	init();
	solve();
	return 0;
}

