#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <assert.h>
#include <algorithm>
using namespace std;
struct P{
	int S,w;
	P(){}
	P(int a,int b){S=a;w=b;}
}G[1000005];
int n,v,m,a[200005],len[25],L[200005][25],R[200005][25],f[1000005],g[1000005];
priority_queue<P> q;
bool cmp(P a,P b){
	return a.w<b.w;
}
bool operator <(P a,P b){
	return a.w<b.w;
}
int main(){
	scanf("%d%d",&n,&v);
	while(v) len[m++]=v,v>>=1;len[m++]=0;
	for(int i=0;i<m/2;i++) swap(len[i],len[m-i-1]);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++){
		for(int p=0;p<m;p++){
			L[i][p]=L[i-1][p];
			if(i==1||a[i]-a[i-1]>len[p]) L[i][p]=i;
		}
	}
	for(int i=n;i;i--){
		for(int p=0;p<m;p++){
			R[i][p]=R[i+1][p];
			if(i==n||a[i+1]-a[i]>len[p]) R[i][p]=i;
		}
	}
	f[0]=0;g[0]=n+1;
	for(int i=1;i<(1<<m);i++){
		g[i]=n+1;
		for(int p=0;p<m;p++) if(i&(1<<p)){
			f[i]=max(f[i],f[i^(1<<p)]);
			f[i]=max(f[i],R[f[i^(1<<p)]+1][p]);
			g[i]=min(g[i],L[g[i^(1<<p)]-1][p]);
		}
	}
	int S=(1<<m-1)-1;
	for(int i=0;i<=S;i++) G[i]=P(i,g[i]);
	sort(G,G+S+1,cmp);
	for(int i=1,pos=0;i<=n;i++){
		while(G[pos].w<=R[i][m-1]+1&&pos<=S) q.push(P(S^G[pos].S,f[S^G[pos].S])),pos++;
		if(q.empty()||q.top().w<L[i][m-1]-1) puts("Impossible");
		else puts("Possible");
	}
	return 0;
}