#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

static const int NMAX = 200000;
static const int MMAX = 18;

static int N, M, X[NMAX];
static int A[1 << (1 + MMAX)];
static int B[1 << (1 + MMAX)];
static int Y[NMAX + 1][1 + MMAX];

static void solve(int *C) {
	for(int m = 0; m <= M; m++) Y[N][m] = N;
	for(int i = N; --i > 0; ) {
		for(int m = 0; m <= M; m++) Y[i][m] = (m < X[i] ? i : Y[i + 1][m]);
	}
	for(int mask = 1; mask < (1 << (1 + M)); mask++) {
		int ret = 0;
		for(int i = 0; i <= M; i++) {
			if((mask & (1 << i)) == 0) continue;
			auto tmp = C[mask ^ (1 << i)];
			if(tmp == N) {
				ret = N;
				break;
			}
			tmp = Y[tmp + 1][i];
			if(tmp > ret) {
				ret = tmp;
				if(ret == N) break;
			}
		}
		C[mask] = ret;
	}
}

int main() {
	scanf("%d%d", &N, &M);
	for(int i = 0; i < N; i++) scanf("%d", X + i);

	{
		vector<int> v;
		for(; ; M >>= 1) {
			v.push_back(M);
			if(M == 0) break;
		}
		M = v.size() - 1;
		reverse(begin(v), end(v));
		for(int i = N; --i > 0; ) {
			X[i] = lower_bound(begin(v), end(v), X[i] - X[i - 1]) - begin(v);
		}
	}

	solve(A);
	if(A[(1 << (1 + M)) - 1] != N) {
		for(int i = 0; i < N; i++) puts("Impossible");
	} else {
		vector<int> v;
		for(int i = 0; i < N; ) {
			auto j = Y[i + 1][M];
			v.push_back(j - i);
			i = j;
		}
		reverse(X + 1, X + N);
		solve(B);
		int l = 0;
		for(auto s : v) {
			auto z = false;
			for(int i = 0; i < (1 << M); i++) {
				if(A[i] < l) continue;
				auto j = ((1 << M) - 1) ^ i;
				if(B[j] >= N - (l + s)) {
					z = true;
					break;
				}
			}
			for(int i = 0; i < s; i++) puts(z ? "Possible" : "Impossible");
			l += s;
		}
	}

	return 0;
}