int n, m, t; int cur[kMaxN]; bool vis[kMaxS], vs[kMaxN]; std::vector<int> a[kMaxN], vec; std::vector<std::pair<int, int>> G[kMaxN];
voiddfs(int u){ vs[u] = 1; for (int i = cur[u]; i < (int)G[u].size(); i = cur[u]) { cur[u] = i + 1; int v = G[u][i].first, id = G[u][i].second; if (vis[id]) continue; vis[id] = 1, dfs(v); } vec.emplace_back(u); }
voidsolve(int l, int r){ if (l == r) return; for (int i = 0; i <= t; ++i) G[i].clear(), cur[i] = vs[i] = 0; int mid = (l + r) >> 1, len = r - l + 1, id = 0; for (int i = 1; i <= n; ++i) { for (int j = l; j <= mid; ++j) { vis[++id] = 0; G[a[i][j]].emplace_back(a[i][j + len / 2], id); G[a[i][j + len / 2]].emplace_back(a[i][j], id); } } int rt = 1; for (int i = 1; i <= t; ++i) { if (G[i].size() & 1) { rt = 0, vis[++id] = 0; G[rt].emplace_back(i, id), G[i].emplace_back(rt, id); } } cur[rt] = 0; std::unordered_map<std::pair<int, int>, int, my_hash> mp; for (int i = rt; i <= t; ++i) { if (!vs[i]) { vec.clear(); dfs(i); for (int j = 0; j + 1 < (int)vec.size(); ++j) ++mp[{vec[j], vec[j + 1]}]; } } for (int i = 1; i <= n; ++i) { for (int j = l; j <= mid; ++j) { if (!mp[{a[i][j], a[i][j + len / 2]}]) { std::swap(a[i][j], a[i][j + len / 2]); } --mp[{a[i][j], a[i][j + len / 2]}]; } } solve(l, mid), solve(mid + 1, r); }
voiddickdreamer(){ std::cin >> n >> m >> t; for (int i = 1; i <= n; ++i) { a[i].resize(m); for (auto &x : a[i]) std::cin >> x; } solve(0, m - 1); for (int i = 1; i <= n; ++i) { for (auto x : a[i]) std::cout << x << ' '; std::cout << '\n'; } }