#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=200200,D=20;
int i,j,k,n,m,nm,mm,ch,ff;
int x[N],pre[1<<D],suf[1<<D],ans[N];
vector<int> X[D];
void R(int &x) {
	ff=x=0;ch=getchar();
	while (ch<'0' || '9'<ch) { if (ch=='-') ff=1;ch=getchar();}
	while ('0'<=ch && ch<='9') x=x*10+ch-'0',ch=getchar();
	if (ff) x=-x;
}
int find1(int i,int x) {
	int l=0,r=X[i].size()-1,mid;
	while (l<r) {
		mid=(l+r+1)>>1;
		if (X[i][mid]>x) r=mid-1;
		else l=mid;
	}
	return l;
}
int find2(int i,int x) {
	int l=0,r=X[i].size()-1,mid;
	while (l<r) {
		mid=(l+r-1)>>1;
		if (X[i][mid]<x) l=mid+1;
		else r=mid;
	}
	return l;
}
void Max(int &x,int y) {
	if (y>x) x=y;
}
void Min(int &x,int y) {
	if (y<x) x=y;
}
int main() {
	R(n);R(m);
	for (i=1;i<=n;i++) R(x[i]);
	k=m;
	while (1) {
		X[nm].push_back(1);
		for (i=1;i<n;i++) if (x[i]+k<x[i+1]) X[nm].push_back(i+1);
		X[nm].push_back(n+1);
		nm++;
		if (!k) break;
		k>>=1;
	}
	mm=1<<nm;
	for (i=0;i<mm;i++) suf[i]=n+1;
	for (i=0;i<mm;i+=2)
		for (j=1;j<nm;j++) if (!(i&1<<j)) {
			Max(pre[i|1<<j],X[j][find1(j,pre[i]+1)+1]-1);
			Min(suf[i|1<<j],X[j][find2(j,suf[i])-1]);
		}
	if (X[0].size()>mm+1) {
		for (i=0;i<n;i++) puts("Impossible");
		return 0;
	}
	for (i=1;i<X[0].size();i++) {
		int l=X[0][i-1],r=X[0][i]-1,fg=0;
		for (j=0;j<mm;j+=2) if (pre[j]+1>=l && suf[(mm-2)^j]-1<=r) {
			fg=1;
			break;
		}
		for (j=l;j<=r;j++) ans[j]=fg;
	}
	for (i=1;i<=n;i++) {
		if (ans[i]) puts("Possible");
		else puts("Impossible");
	}
}