using vi = std::vector<int>; using vvi = std::vector<std::vector<int>>;
constint kMaxN = 2e4 + 5;
int n, m; int a[kMaxN], len[kMaxN]; bool b[kMaxN], op[kMaxN];
voidprework(int l, int r){ int lst = l - 1; m = 0; for (int i = l; i <= r; ++i) { if (i == r || b[i] != b[i + 1]) { op[++m] = b[i], len[m] = i - lst; lst = i; } } }
vvi getvec(int l, int r){ vvi vec; for (;;) { prework(l, r); if (m == 2 && op[1] == 0 && op[2] == 1) break; std::vector<int> v; for (int i = 1, now = 1; i <= m; now = 3 - now) { now = std::min(now, m - i + 1); int s = 0; for (int j = i; j <= i + now - 1; ++j) s += len[j]; v.emplace_back(s); i += now; } vec.emplace_back(v); int now = l; std::reverse(a + l, a + 1 + r); std::reverse(b + l, b + 1 + r); std::reverse(v.begin(), v.end()); for (auto x : v) { std::reverse(a + now, a + now + x); std::reverse(b + now, b + now + x); now += x; } } return vec; }
vi merge(vi a, vi b){ vi c; for (auto x : a) c.emplace_back(x); for (auto x : b) c.emplace_back(x); return c; }
vvi solve(int l, int r){ if (l == r) return {}; int mid = (l + r) >> 1; if (r - l + 1 > 3 && (~(l + r) & 1)) ++mid; for (int i = l; i <= r; ++i) b[i] = (a[i] > mid); auto vec = getvec(l, r), L = solve(l, mid), R = solve(mid + 1, r); int sz = std::max(L.size(), R.size()); if (sz & 1) ++sz; L.resize(sz, vi{mid - l + 1}); R.resize(sz, vi{r - mid}); for (int i = 0; i < sz; ++i) { if (~i & 1) vec.emplace_back(merge(L[i], R[i])); else vec.emplace_back(merge(R[i], L[i])); } return vec; }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i]; auto res = solve(1, n); std::cout << res.size() << '\n'; for (auto &vec : res) { std::cout << vec.size() << ' '; for (auto x : vec) std::cout << x << ' '; std::cout << '\n'; } }