This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/**
 _  _   __  _ _ _  _  _ _
 |a  ||t  ||o    d | |o  |
| __    _| | _ | __|  _ |
| __ |/_  | __  /__\ / _\|
**/
#include <bits/stdc++.h>
#include "dango3.h"
using namespace std;
typedef long long ll;
int Query (const vector <int> &x);
void Answer (const vector <int> &a);
void Solve (int N, int M) {
    int A[N * M + 2];
    fill(A + 1, A + N * M + 1, 0);
    int l = 1, r = N * M;
    while (l < r) {
        int mid = (l + r) / 2;
        vector <int> x;
        for (int i = 1; i <= mid; i++) {
            x.push_back(i);
        }
        if (Query(x) > 0) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    bool in[N * M + 2];
    fill(in + 1, in + N * M + 1, false);
    for (int i = 1; i <= l; i++) {
        in[i] = true;
    }
    vector <int> group;
    for (int i = N * M; i >= 1; i--) {
        if (in[i] == true) {
            in[i] = false;
            vector <int> x;
            for (int j = 1; j <= N * M; j++) {
                if (in[j] == true) {
                    x.push_back(j);
                }
            }
            if (Query(x) == 0) {
                in[i] = true;
            }
        }
    }
    for (int i = 1; i <= N * M; i++) {
        if (in[i] == true) {
            group.push_back(i);
            A[i] = (int) group.size();
        }
    }
    for (int i = 1; i <= N * M; i++) {
        if (A[i] == 0) {
            int l = 1, r = N;
            while (l < r) {
                int mid = (l + r) / 2;
                vector <int> x;
                for (int j = 1; j <= N * M; j++) {
                    if ((in[j] == false || A[j] <= mid) && j != i) {
                        x.push_back(j);
                    }
                }
                if (Query(x) == M - 1) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            A[i] = l;
        }
    }
    vector <int> of_color[N + 2];
    for (int i = 1; i <= N * M; i++) {
        of_color[A[i]].push_back(i);
    }
    for (int t = 1; t <= M; t++) {
        vector <int> a;
        for (int c = 1; c <= N; c++) {
            a.push_back(of_color[c].back());
            of_color[c].pop_back();
        }
        Answer(a);
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |