#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 200050;

int n, v, x[N];
int dp1[(1 << 19) + 3], dp2[(1 << 19) + 3];
int tor[20][N], tol[20][N], len[20], dep, mxr[N];
inline void gi(int &x){
	int f = 1; x = 0; char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-')f = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x * 10 + c - '0';
		c = getchar();
	}
	x *= f;
}
int main()
{

int i, j, d;
    gi(n), gi(v), x[0] = -2e9, x[n+1] = 2e9;
    for(len[0] = v; len[dep] != 0; dep ++)
		len[dep + 1] = len[dep] >> 1;
    for(dep ++, i = 1; i <= n; i ++)gi(x[i]);
    for(d = 0; d < dep; d ++){
        tol[d][0] = n, tor[d][n + 1] = n;
        for(i = 1; i <= n; i ++)tol[d][i] = (x[i] - x[i - 1] <= len[d]) ? tol[d][i - 1] : n + 1 - i;
        for(i = n; i >= 1; i --)tor[d][i] = (x[i + 1] - x[i] <= len[d]) ? tor[d][i + 1] : i;
    }
    for(i = 0; i < (1 << dep); i += 2){
        for(j = 1; j < dep; j ++){
            if((i & (1 << j)) == 0){
                dp1[i | (1 << j)] = max(dp1[i | (1 << j)], tor[j][dp1[i] + 1]);
                dp2[i | (1 << j)] = max(dp2[i | (1 << j)], tol[j][n - dp2[i]]);
            }
        }
    }
    memset(mxr, 0xc0, sizeof(mxr));
    for(i = 0, j = ((1 << dep) - 1) ^ 1; j >= 0; i += 2, j -= 2)
        mxr[dp1[i]] = max(mxr[dp1[i]], dp2[j]);
    for(i = 1; i <= n; i ++){
        if(mxr[n - tol[0][i]] + tor[0][i] >= n)puts("Possible");
        else puts("Impossible");
    }
	    
    return 0;
}