#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
void reset(vector<int> blocks[],int blocksPos[],int a)
{
while(blocks[blocksPos[a]].back()!=a)
{
blocks[blocks[blocksPos[a]].back()].push_back(blocks[blocksPos[a]].back());
blocksPos[blocks[blocksPos[a]].back()]=blocks[blocksPos[a]].back();
blocks[blocksPos[a]].pop_back();
}
}
int main()
{
vector<int> blocks[25];
char command[5],option[5];
int a,b,n,blocksPos[25];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
blocks[i].push_back(i);
blocksPos[i]=i;
}
while(scanf("%s",command))
{
if(command[0]=='q') break;
scanf("%d%s%d",&a,option,&b);
if(blocksPos[a]== blocksPos[b])
continue;
if(strcmp(command,"move")==0 && strcmp(option,"onto")==0)
{
reset(blocks,blocksPos,a);
reset(blocks,blocksPos,b);
blocks[blocksPos[b]].push_back(a);
blocks[blocksPos[a]].pop_back();
blocksPos[a]=blocksPos[b];
}
if(strcmp(command,"move")==0 && strcmp(option,"over")==0)
{
reset(blocks,blocksPos,a);
blocks[blocksPos[b]].push_back(a);
blocks[blocksPos[a]].pop_back();
blocksPos[a]=blocksPos[b];
}
if(strcmp(command,"pile")==0 && strcmp(option,"onto")==0)
{
reset(blocks,blocksPos,b);
vector<int>::iterator iter=blocks[blocksPos[a]].begin();
for(;*iter!=a;iter++);
blocks[blocksPos[b]].insert(blocks[blocksPos[b]].end(),iter,blocks[blocksPos[a]].end());
blocks[blocksPos[a]].erase(iter,blocks[blocksPos[a]].end());
vector<int>::reverse_iterator iter2=blocks[blocksPos[b]].rbegin();
for(;*iter2!=a;iter2++)
blocksPos[*iter2]=blocksPos[b];
blocksPos[*iter2]=blocksPos[b];
}
if(strcmp(command,"pile")==0 && strcmp(option,"over")==0)
{
vector<int>::iterator iter=blocks[blocksPos[a]].begin();
for(;*iter!=a;iter++);
blocks[blocksPos[b]].insert(blocks[blocksPos[b]].end(),iter,blocks[blocksPos[a]].end());
blocks[blocksPos[a]].erase(iter,blocks[blocksPos[a]].end());
vector<int>::reverse_iterator iter2=blocks[blocksPos[b]].rbegin();
for(;*iter2!=a;iter2++)
blocksPos[*iter2]=blocksPos[b];
blocksPos[*iter2]=blocksPos[b];
}
}
for(int i=0;i<n;i++)
{
printf("%d:",i);
for(int j=0;j<blocks[i].size();j++)
{
printf(" %d",blocks[i][j]);
}
printf("\n");
}
return 0;
}
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=37