#include <iostream>
#include <vector>
#include <set>

using namespace std;

struct UnionFind{
	int size;
	vector<int> parent;
	
	UnionFind(){}
	UnionFind(int size){
		this->size = size;
		parent.resize(size+1);
		init();
	}
	void init(){
		for(int i = 1; i <= size; i++) parent[i] = i;
	}
	int root(int i){
		if(parent[i] == i) return i;
		return parent[i] = root(parent[i]);
	}
	bool same(int i, int j){
		return root(i) == root(j);
	}
	void unite(int i, int j){
		int root_i = root(i), root_j = root(j);
		if(root_i == root_j) return;
		if(root_i > root_j) root_i ^= root_j, root_j ^= root_i, root_i ^= root_j;
		parent[root_i] = root_j;
	}
};

int N, V;
int x[200005];
int v[20], vnum;
UnionFind uf[20];
int dp[1<<18];

int main(void)
{
	cin >> N >> V;
	for(int i = 1; i <= N; i++) cin >> x[i];
	
	int tmp = V;
	for(int i = 0; ; i++){
		v[i] = tmp;
		if(tmp == 0){
			vnum = i+1;
			break;
		}
		tmp /= 2;
	}
	
	for(int i = 0; i < vnum; i++) uf[i] = UnionFind(N);
	for(int i = 0; i < vnum; i++){
		for(int j = 1; j < N; j++){
			if(x[j+1] - x[j] <= v[i]) uf[i].unite(j, j+1);
		}
	}
	
	set<int> S;
	for(int i = 1; i <= N; i++) S.insert(uf[0].root(i));
	if(S.size() > vnum){
		for(int i = 1; i <= N; i++) cout << "Impossible" << endl;
		return 0;
	}
	
	for(int p = 1; p <= N; p++){
		int l = p, r = uf[0].root(p), n = 1<<(vnum-1);
		for(int i = 0; i < n; i++) dp[i] = 0;
		for(int i = 0; i < n; i++){
			if(dp[i] == l-1) dp[i] = r;
			if(dp[i] >= N) continue;
			for(int j = 0; j < vnum-1; j++){
				if(i & (1<<j)) continue;
				dp[i|(1<<j)] = max(dp[i|(1<<j)], uf[j+1].root(dp[i]+1));
			}
		}
		bool ans = false;
		for(int i = 0; i < n; i++){
			if(dp[i] >= N){
				ans = true;
				break;
			}
		}
		for(int i = l; i <= r; i++){
			if(ans) cout << "Possible" << endl;
			else cout << "Impossible" << endl;
		}
		p = r;
	}
	
	return 0;
}