int n, m, t; int a[kMaxN], b[kMaxN], l[kMaxN], r[kMaxN], sum[kMaxN][kMaxN], mxs[kMaxN][kMaxN], mxs1[kMaxN][kMaxN], lcp[kMaxN][kMaxN]; std::tuple<int, int, bool> pre[kMaxN][kMaxN][2]; bool f[kMaxN][kMaxN][2];
voidgetseg(int l, int r){ if (l > r) return; int ll = 0, rr = -1; for (int i = l; i <= r; ++i) for (int j = i; j <= r; ++j) if (sum[i][j] == mxs[l][r] && j - i > rr - ll) ll = i, rr = j; getseg(l, ll - 1); ::l[++t] = ll, ::r[t] = rr; getseg(rr + 1, r); }
voiddickdreamer(){ std::cin >> n >> m; t = 0; for (int i = 1; i <= n; ++i) std::cin >> a[i]; for (int i = 1; i <= m; ++i) std::cin >> b[i]; for (int i = 1; i <= n; ++i) { int now = a[i]; sum[i][i] = mxs[i][i] = a[i]; for (int j = i + 1; j <= n; ++j) { now = std::max(a[j], a[j] + now); sum[i][j] = sum[i][j - 1] + a[j]; mxs[i][j] = std::max(now, mxs[i][j - 1]); } } for (int i = 1; i <= m; ++i) { int now = b[i]; mxs1[i][i] = b[i]; for (int j = i + 1; j <= m; ++j) { now = std::max(b[j], b[j] + now); mxs1[i][j] = std::max(now, mxs1[i][j - 1]); } } for (int i = 1; i <= n + 1; ++i) for (int j = 1; j <= m + 1; ++j) lcp[i][j] = 0; for (int i = n; i; --i) { for (int j = m; j; --j) { if (a[i] == b[j]) lcp[i][j] = lcp[i + 1][j + 1] + 1; else lcp[i][j] = 0; } } getseg(1, n); std::vector<int> vec; for (int i = 1; i <= t; ++i) vec.emplace_back(sum[l[i]][r[i]]); std::sort(vec.begin(), vec.end()); vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); for (auto x : vec) { for (int i = 1; i <= t; ++i) for (int j = 1; j <= m; ++j) f[i][j][0] = f[i][j][1] = 0; f[0][0][0] = 1; for (int i = 1; i <= t; ++i) { if (sum[l[i]][r[i]] < x) { for (int j = 0; j < m; ++j) { for (int o = 0; o < 2; ++o) { if (!f[i - 1][j][o]) continue; if (lcp[l[i]][j + 1] >= r[i] - l[i] + 1) { f[i][j + r[i] - l[i] + 1][o] |= f[i - 1][j][o]; pre[i][j + r[i] - l[i] + 1][o] = {i - 1, j, o}; } } } } else { int mij = m + 1; for (int j = m; ~j; --j) if (f[i - 1][j][0]) mij = j; for (int j = mij + 1; j <= m; ++j) { f[i][j][1] = 1; pre[i][j][1] = {i - 1, mij, 0}; } int r[2] = {0}; for (int j = 0; j < m; ++j) { for (int o = 0; o < 2; ++o) { if (!f[i - 1][j][o]) continue; for (int k = std::max(j + 1, r[o] + 1); k <= m; ++k) { if (mxs1[j + 1][k] <= x) { f[i][k][o] |= f[i - 1][j][o]; pre[i][k][o] = {i - 1, j, o}; r[o] = k; } else { break; } } } } } } if (!f[t][m][0] && !f[t][m][1]) continue; int posa = t, posb = m, op = f[t][m][1]; std::vector<std::tuple<int, int, int>> vec1, vec2; std::vector<int> vec3; for (; posa && posb;) { auto [prea, preb, preop] = pre[posa][posb][op]; // std::cerr << l[posa] << ' ' << r[posa] << ' ' << preb + 1 << ' ' << posb << '\n'; if (sum[l[posa]][r[posa]] >= x) { vec3.emplace_back(posa); if (op ^ preop) { vec1.emplace_back(posa, preb + 1, posb); } else { vec2.emplace_back(posa, preb + 1, posb); } } posa = prea, posb = preb, op = preop; } staticint len[kMaxN]; for (int i = 1; i <= t; ++i) len[i] = r[i] - l[i] + 1; std::vector<std::tuple<int, int, std::vector<int>>> vv; std::sort(vec3.begin(), vec3.end(), [&] (auto a, auto b) { return sum[l[a]][r[a]] > sum[l[b]][r[b]]; }); for (auto i : vec3) { int posl = 0, posr = 0; std::vector<int> vec = {x}; for (int j = 1; j < i; ++j) posl += len[j]; ++posl, posr = posl + len[i] - 1, len[i] = 1; vv.emplace_back(posl, posr, vec); } for (auto [i, l, r] : vec2) { int posl = 0, posr = 0; std::vector<int> vec; for (int j = 1; j < i; ++j) posl += len[j]; ++posl, posr = posl + len[i] - 1, len[i] = r - l + 1; for (int j = l; j <= r; ++j) vec.emplace_back(b[j]); vv.emplace_back(posl, posr, vec); } for (auto [i, l, r] : vec1) { int posl = 0, posr = 0; std::vector<int> vec; for (int j = 1; j < i; ++j) posl += len[j]; ++posl, posr = posl + len[i] - 1, len[i] = r - l + 1; for (int j = l; j <= r; ++j) vec.emplace_back(b[j]); vv.emplace_back(posl, posr, vec); } std::cout << vv.size() << '\n'; for (auto &[l, r, vec] : vv) { std::cout << l << ' ' << r << ' ' << vec.size() << '\n'; for (auto x : vec) std::cout << x << ' '; std::cout << '\n'; } return; } std::cout << "-1\n"; }