#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
inline void pre()
{
#ifdef LOCAL
freopen("./in.in", "rb", stdin);
freopen("./out.out", "wb", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
vector<int> arr[25];
int p[25];
inline void move_onto(int a, int b)
{
int pa = p[a], pb = p[b];
if (pa == pb)
return;
while (arr[pa][arr[pa].size() - 1] != a)
{
int x = arr[pa][arr[pa].size() - 1];
arr[x].push_back(x);
arr[pa].pop_back();
p[x] = x;
}
while (arr[pb][arr[pb].size() - 1] != b)
{
int x = arr[pb][arr[pb].size() - 1];
arr[x].push_back(x);
arr[pb].pop_back();
p[x] = x;
}
arr[pb].push_back(a);
arr[pa].pop_back();
p[a] = pb;
}
inline void move_over(int a, int b)
{
int pa = p[a], pb = p[b];
if (pa == pb)
return;
while (arr[pa][arr[pa].size() - 1] != a)
{
int x = arr[pa][arr[pa].size() - 1];
arr[x].push_back(x);
arr[pa].pop_back();
p[x] = x;
}
arr[pb].push_back(a);
arr[pa].pop_back();
p[a] = pb;
}
inline void pile_onto(int a, int b)
{
int pa = p[a], pb = p[b],
Stack[25]{0}, cnt = 0;
if (pa == pb)
return;
while (arr[pb][arr[pb].size() - 1] != b)
{
int x = arr[pb][arr[pb].size() - 1];
arr[x].push_back(x);
arr[pb].pop_back();
p[x] = x;
}
while (arr[pa][arr[pa].size() - 1] != a)
{
int x = arr[pa][arr[pa].size() - 1];
Stack[cnt++] = x;
arr[pa].pop_back();
}
arr[pb].push_back(a);
arr[pa].pop_back();
p[a] = pb;
while (cnt)
{
int x = Stack[--cnt];
p[x] = pb;
arr[pb].push_back(x);
}
}
inline void pile_over(int a, int b)
{
int pa = p[a], pb = p[b],
Stack[25]{0}, cnt = 0;
if (pa == pb)
return;
while (arr[pa][arr[pa].size() - 1] != a)
{
int x = arr[pa][arr[pa].size() - 1];
Stack[cnt++] = x;
arr[pa].pop_back();
}
arr[pb].push_back(a);
arr[pa].pop_back();
p[a] = pb;
while (cnt)
{
int x = Stack[--cnt];
p[x] = pb;
arr[pb].push_back(x);
}
}
int main()
{
pre();
int n, a, b;
string s;
stringstream ss;
cin >> n;
getline(cin, s);
for (int i = 0; i < n; ++i)
arr[i].push_back(i), p[i] = i;
for (int i = 0; i < n; ++i)
{
getline(cin, s);
ss.clear();
ss << s;
ss >> s;
if (s == "quit")
break;
if (s == "move")
{
ss >> a >> s >> b;
if (s == "over")
move_over(a, b);
else
move_onto(a, b);
}
else
{
ss >> a >> s >> b;
if (s == "over")
pile_over(a, b);
else
pile_onto(a, b);
}
}
for (int i = 0; i < n; ++i)
{
cout << i << ':';
for (auto j = arr[i].begin(); j != arr[i].end(); ++j)
cout << ' ' << *j;
cout << endl;
}
return 0;
}
https://www.luogu.com.cn/record/80045855