。。这么水的一道最长下降子序列我为什么会狂
wa
呢。。
呜啊。。我真是蒟蒻一枚。。。
要把这列数全倒过来做,然后跑最长下降子序列
然后再倒回来输出方案就好了。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define g getchar()
#define ll long long
#define inf 0x3f3f3f3f
#define Orz std
using namespace Orz;
inline ll read(){
ll x=0,f=1;char ch=g;
for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0';
return x*f;
}
inline int out(ll x){
int a[25],wei=0;
if(x<0)putchar('-'),x=-x;
for(;x;x/=10)a[++wei]=x%10;
if(wei==0){puts("0");return 0;}
for(int j=wei;j>=1;--j)putchar('0'+a[j]);
putchar('\n');return 0;
}
int Q,n,a[100005],f[100005],t[100005],q[100005],ans=1,now,b[100005],top;
int find(int x){
int l=1,r=n,ans=0;
for(;l<=r;){
int mid=(l+r)>>1;
if(a[q[mid]]>x)ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main(){
// freopen("","r",stdin);
// freopen("","w",stdout);
n=read();
for(int i=1;i<=n;++i)a[n-i+1]=read();
f[1]=1;a[0]=-inf;q[1]=1;
for(int i=2;i<=n;++i){
int x=find(a[i]);
q[x+1]=i;
f[i]=x+1;
ans=max(x+1,ans);
}
for(int i=n;i;--i){for(int j=f[i];j;--j)if(!t[j])t[j]=i;else break;}
// for(int i=1;i<=n;++i)out(f[i]);
Q=read();
for(;Q--;){
int x=read();
top=0;
if(ans<x){puts("Impossible");continue;}
now=-inf;
for(int i=n,j=x;(i)&&j;--i)
if(f[i]>=j&&now<a[i]){
now=a[i];
b[++top]=a[i];
--j;
}
for(int i=1;i<x;++i)printf("%d ",b[i]);out(b[x]);
}
return 0;
}