#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define fill( x, y ) memset( x, y, sizeof x )
#define copy( x, y ) memset( x, y, sizeof x )
using namespace std;

typedef long long LL;
typedef pair < int, int > pa;

const int MAXN = 200020;
const int INF = 0x3f3f3f3f;

int n, m, v[22], tot, a[MAXN], d[MAXN];
int f[MAXN][22], g[MAXN][22];
int dpl[MAXN << 2], dpr[MAXN << 2], ans[MAXN];

int main()
{
#ifdef wxh010910
	freopen( "data.in", "r", stdin );
#endif
	scanf( "%d%d", &n, &m );
	for( int i = 1 ; i <= n ; i++ ) scanf( "%d", &a[ i ] );
	while( m ) v[ tot++ ] = m, m >>= 1;
	v[ tot++ ] = 0;
	d[ 1 ] = d[ n + 1 ] = INF;
	for( int i = 2 ; i <= n ; i++ ) d[ i ] = a[ i ] - a[ i - 1 ];
	for( int j = 0 ; j < tot ; j++ )
	{
		for( int i = 1 ; i <= n ; i++ )
			if( d[ i ] > v[ j ] ) f[ i ][ j ] = i;
			else f[ i ][ j ] = f[ i - 1 ][ j ];
		for( int i = n ; i ; i-- )
			if( d[ i + 1 ] > v[ j ] ) g[ i ][ j ] = i;
			else g[ i ][ j ] = g[ i + 1 ][ j ];
	}
	fill( dpr, 0x3f );
	dpr[ 0 ] = n + 1;
	for( int i = 0 ; i < ( 1 << tot ) ; i++ )
		for( int j = 0 ; j < tot ; j++ ) if( !( i >> j & 1 ) )
		{
			if( dpl[ i ] >= n ) dpl[ i | ( 1 << j ) ] = n;
			else dpl[ i | ( 1 << j ) ] = max( dpl[ i | ( 1 << j ) ], g[ dpl[ i ] + 1 ][ j ] );
			if( dpr[ i ] <= 1 ) dpr[ i | ( 1 << j ) ] = 1;
			else dpr[ i | ( 1 << j ) ] = min( dpr[ i | ( 1 << j ) ], f[ dpr[ i ] - 1 ][ j ] );
		}
	for( int i = 0 ; i < ( 1 << tot ) ; i++ )
	{
		if( i & 1 ) continue;
		int l = dpl[ i ], r = dpr[ ( 1 << tot ) - 1 - i - 1 ];
		if( l + 1 >= r ) ans[ 1 ]++;
		else
		{
			int L = f[ l + 1 ][ 0 ], R = g[ l + 1 ][ 0 ];
			if( R + 1 >= r && L <= R ) ans[ L ]++, ans[ R + 1 ]--;
		}
	}
	for( int i = 1, cur = 0 ; i <= n ; i++ )
	{
		cur += ans[ i ];
		if( cur ) puts( "Possible" );
		else puts( "Impossible" );
	}
}
