#include #include #include #include using namespace std; // 1000L // N <= 2e5 // sqrt(N) で区切る? // ブロック間移動: L / sqrt(N) * N // ブロック内移動: L / sqrt(N) * N void solve() { int N, L; cin >> N >> L; const int BS = ceil(sqrt(N)); const int W = (L + 1 + BS - 1) / BS; vector is(BS, vector>(BS)); vector X(N), Y(N); for (int i = 0; i < N; ++i) { cin >> X.at(i) >> Y.at(i); is.at(X.at(i) / W).at(Y.at(i) / W).push_back(i); } cout << N << '\n'; for (int i = 0; i < BS; ++i) { if (i % 2) reverse(is.at(i).begin(), is.at(i).end()); for (auto v : is.at(i)) { for (auto j : v) cout << X.at(j) << ' ' << Y.at(j) << '\n'; } } } int main() { cin.tie(nullptr)->sync_with_stdio(false); int T; cin >> T; while (T--) solve(); }