# include <bits/stdc++.h>

using namespace std;

# define REP(i, a, b) for(int i = a; i <= b; ++ i)
# define REPD(i, a, b) for(int i = a; i >= b; -- i)
# define CLR(i, a) memset(i, a, sizeof(i))
# define REPG(i, h, x) for(int i = h[x]; ~i; i = edge[i].next)

const int N = 2e5 + 5, N_ = 19, S_ = (1 << 19) - 1;

int r[N_ + 3][N], cnt[N_ + 3];
int f1[S_ + 5], f2[S_ + 5];
int n, v, len = -1;
int d[N], S;

int main() {
	scanf("%d%d", &n, &v);
	REP(i, 1, n) scanf("%d", &d[i]);
	int x = v << 1;
    while(x) {
        x >>= 1, ++ len;
        REP(i, 1, n - 1) {
            if(d[i + 1] - d[i] <= x) continue;
            r[len][++ cnt[len]] = i;
        } r[len][++ cnt[len]] = n;
    }
	S = (1 << len) - 1;
	if(cnt[0] > len + 1){
        REP(i, 1, n) puts("Impossible"), exit(0);
    }
	REP(i, 0, S) f2[i] = n + 1;
	REP(i, 0, S) {
		REP(j, 1, len) if(i & (1 << j - 1)) {		
			f1[i] = max(f1[i], *upper_bound(r[j] + 1, r[j] + cnt[j] + 1, f1[i ^ (1 << j - 1)]));
			f2[i] = min(f2[i], r[j][lower_bound(r[j] + 1, r[j] + cnt[j] + 1, f2[i ^ (1 << j - 1)] - 1) - r[j] - 1] + 1);
		}
	}
	REP(i, 1, cnt[0]) {
		bool okay = 0;
		REP(s, 0, S) {
			if(f1[s] >= r[0][i - 1] && f2[S - s] <= r[0][i] + 1) { okay = 1; break; }
		}
		REP(j, r[0][i - 1] + 1, r[0][i]) puts(okay ? "Possible" : "Impossible");
	} 

	return 0;
}