#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; class UnionFind { public: vector parent; vector _size; UnionFind(int n) { for (int i = 0; i < n; ++i) { parent.push_back(i); _size.push_back(1); } } int find(int x) { if (parent[x] == x) { return x; } else { return parent[x] = find(parent[x]); } } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (x > y) { parent[x] = y; _size[y] += _size[x]; } else { parent[y] = x; _size[x] += _size[y]; } } bool same(int x, int y) { return find(x) == find(y); } int size(int x) { return _size[find(x)]; } }; int T, R; struct Command { int u; int v; Command(int u = -1, int v = -1) { this->u = u; this->v = v; } string to_str() { return to_string(u) + " " + to_string(v); } }; class Adv2021 { public: void run() { int N; int id = 1; int counter[101]; memset(counter, 0, sizeof(counter)); vector started_at(5555, 9999); vector skills[101]; UnionFind uf(5555); vector power(5555, 0); for (int t = 0; t < T; ++t) { cin >> N; vector S(N); vector commands; for (int i = 0; i < N; ++i) { int s; cin >> s; S[i] = s; power[id] = s; skills[s].push_back(id); started_at[id] = t; int u = skills[s].back(); int diff = 2; if (abs(s - 50) >= 25) diff = 3; if (abs(s - 50) >= 40) diff = 5; int max_time = -1; int min_time = 9999; int best_v = -1; for (int ns = max(0, s - diff); ns <= min(100, s + diff); ++ns) { if (skills[ns].empty()) continue; for (int v : skills[ns]) { int size = uf.size(u) + uf.size(v); int time = t - started_at[v]; if (not uf.same(u, v) && size <= R && max_time < time) { max_time = time; best_v = v; } } } if (best_v != -1) { uf.unite(u, best_v); started_at[uf.find(u)] = min(started_at[u], started_at[best_v]); started_at[uf.find(best_v)] = min(started_at[u], started_at[best_v]); commands.push_back(Command(u, best_v)); } counter[s]++; id++; } cout << commands.size() << endl; for (Command &cmd : commands) { cout << cmd.to_str() << endl; } cout << flush; } vector checked(5555, false); for (int i = 1; i < id; ++i) { int p = uf.find(i); if (checked[p]) continue; if (uf.size(p) == R) continue; checked[p] = true; fprintf(stderr, "x: %d, size: %d, st: %d\n", power[p], uf.size(p), started_at[p]); } for (int x = 0; x <= 100; ++x) { // fprintf(stderr, "x: %d, cnt: %d\n", x, counter[x]); } } }; int main() { cin >> T >> R; Adv2021 solver; solver.run(); return 0; }