【解题思路】 先倒着求一遍[LIS](http://baike.baidu.com/link?url=4kt5xAPmWOYTEdhIzB0eTu4pVy698690P3bBODUptMCHcGQDbbygSELHs82ROy-rCVG3dS3vQzqFlTMRbwXPfq),然后对于每个询问L从左到右找到第一个大于等于L的上升序列即可。复杂度O(N(log2N+M))。 【参考代码】 ```C++ #pragma GCC optimize(2) #include #include #include #include #define REP(i,low,high) for(register int i=(low);i<=(high);++i) #define PER(i,high,low) for(register int i=(high);i>=(low);--i) using namespace std;

//ex_cmp {
template<typename T,class Compare> inline bool getcmp(T &target,const T &pattern,Compare comp)
{
return comp(pattern,target)?target=pattern,1:0;
}
//} ex_cmp

static int n,m; int a[10010],f[10010]={0},r[10010]={0x7fffffff};
int main()
{
scanf("%d",&n); REP(i,1,n) scanf("%d",a+i); int top=0; PER(i,n,1)
{
int pos=lower_bound(r+1,r+top+1,a[i],greater())-r;
getcmp(top,pos,greater()),r[f[i]=pos]=a[i];
}
for(scanf("%d",&m);m--😉
{
int l,s=1; scanf("%d",&l); for(;s<=n&&f[s]<l;++s); if(s>n||l<1) puts("Impossible"); else
{
printf("%d",a[s]); for(int i=l;--i;)
{
REP(j,s+1,n) if(f[j]>=i&&a[s]<a[j]) {printf(" %d",a[s=j]); break;}
}
putchar('\n');
}
}
return 0;
}