#双向循环链表模拟
#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
int val;
struct Node* pre;
struct Node* next;
Node(int v):val(v),next(NULL),pre(NULL){}
Node():val(-1),next(NULL),pre(NULL){}
}de_list;
int main()
{
/**
* @brief
* n:推送器上的数量
* m:盒子能存放的的数量
* k:每个树枝上面的最大数量
*/
int n , m , k;
cin>>n>>m>>k;
stack<int> sta;
vector<int> sonzi;
de_list* vHead = new Node();
de_list* p = vHead;
for(int i = 0 ; i < n ; i++)
{
int x;
cin>>x;
de_list* cur = new Node(x);
p->next = cur;
cur->pre = p;
p = cur;
}
de_list* pre = vHead->next;
p->next=pre;
pre->pre=p;
delete vHead;
int count = n; //推送器上面的数量
p = p->next;
while(n>0)
{
//从盒子里面拿
while(!sta.empty()&&sonzi.size()<k)
{
if((sonzi.size()!=0&&sonzi.back()>=sta.top())||(sonzi.size()==0))
{
sonzi.push_back(sta.top());
sta.pop();
}
else
break;
}
int i = 0;
int len = count;
while(sonzi.size()<k&&count>0&&i<len)
{
if(sonzi.size()==0||(sonzi.size()!=0&&sonzi.back()>=p->val))
{
count--;
sonzi.push_back(p->val);
p->pre->next = p->next;
p->next->pre = p->pre;
pre = p;
p=p->next;
delete pre;
}
else
{
if(sta.size()<m)
{
count--;
sta.push(p->val);
p->pre->next = p->next;
p->next->pre = p->pre;
pre = p;
p=p->next;
delete pre;
}
else
break;
}
i++;
}
n -= sonzi.size();
for(int j = 0 ; j < sonzi.size(); j++)
{
if(j==0)
cout<<sonzi[j];
else
cout<<" "<<sonzi[j];
}
cout<<endl;
sonzi.clear();
}
return 0;
}