Time Limit: 2 second(s) | Memory Limit: 32 MB |
Given a sequence of integers S = {a1, a2, a3 ... an} and an integer m, you have to find a subsequence of S containing m elements, P = {b1, b2, b3 ... bm} such that (b1 < b2 < ... < bm). If there are several subsequences possible then you should find the one where b1 is leftmost. If there is still a tie, then check for the one where b2 is leftmost and so on.
For example, let the sequence be, 8 7 5 6 5 1 2 7 and m = 2. Then (1, 2), (5, 6), (5, 7), (1, 7) ... etc can be solutions. But we are looking for (5, 6).
Input
Input starts with an integer T (≤ 12), denoting the number of test cases.
Each case starts with a line containing two integers n (1 ≤ n ≤ 105) and q (1 ≤ q ≤ 10) where q denotes the total number of queries. The next line contains n space separated integers denoting a1, a2 ... anrespectively. Each of the next q lines contains an integer m (1 ≤ m ≤ n). You can assume that -108 ≤ ai ≤ 108.
Output
For each case, print the case number in a line. Then for each query print a single line containing the desired subsequence or 'Impossible' if there is no such subsequence. Insert a single space between two integers of a subsequence.
Sample Input | Output for Sample Input |
3 6 3 3 4 1 2 3 6 6 4 2 6 2 2 4 6 1 3 5 3 4 8 5 8 7 5 6 5 1 2 7 1 2 3 4 5 | Case 1: Impossible 1 2 3 6 3 4 Case 2: 2 4 6 Impossible Case 3: 8 5 6 5 6 7 Impossible Impossible |
Note
Dataset is huge, use faster I/O methods.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define bug printf("hihi\n")
#define eps 1e-12
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
#define N 100005
int n,m;
int len;
int dp[N],a[N];
int vis[N];
vector<int>ans;
int seach(int x)
{
int le,ri;
le=0;
ri=len;
int ans=0;
while(le<=ri)
{
int mid=MID(le,ri);
if(dp[mid]>x)
{
ans=mid;
le=mid+1;
}
else
ri=mid-1;
}
return ans+1;
}
void solve(int x)
{
int i,j;
ans.clear();
for(i=1;i<=n;i++)
if(vis[i]>=x) break;
int len=x;
int pre=-1000000000;
while(1)
{
if(vis[i]>=len&&a[i]>pre)
{
ans.push_back(a[i]);
pre=a[i];
len--;
}
i++;
if(ans.size()>=x) break;
}
for(int i=0;i<ans.size();i++)
{
if(i) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
int main()
{
int i,j,t,ca=0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[0]=1000000000;
len=0;
for(int i=n;i>=1;i--)
{
int tt=seach(a[i]);
dp[tt]=a[i];
if(tt>len) len=tt;
vis[i]=tt;
}
printf("Case %d:\n",++ca);
int x;
while(m--)
{
scanf("%d",&x);
if(x>len)
printf("Impossible\n");
else
solve(x);
}
}
return 0;
}