#include "dango3.h"
#include <bits/stdc++.h>
using namespace std;
using ll = int; using pii = pair<ll,ll>;
void Solve(int N, int M) {
vector<ll> vleft;
for (ll i=1;i<=(N*M);i++) {
vleft.push_back(i);
}
ll ngrp = N; //number of groups left
vector<vector<ll>> vgf; //final groups (by index)
while (vleft.size()!=0) {
if (vleft.size()==M) {
vgf.push_back(vleft);
vleft.clear();
break;
}
vector<ll> vqdef;
for (ll T=0;T<vgf.size();T++) {
vqdef.push_back(vgf[T][0]);
}
ll dmin = 0; ll dmax = vleft.size();
while (dmin<dmax) {
ll dq = (dmin+dmax)/2;
vector<ll> vq1 = vqdef;
for (ll i=0;i<dq;i++) {
vq1.push_back(vleft[i]);
}
if (Query(vq1)>=1) {
dmax = dq;
} else {
dmin = dq+1;
}
}
for (ll i=0;i<(dmin-1);i++) {
vqdef.push_back(vleft[i]);
}
vector<ll> vg0;
vg0.push_back(vleft[dmin-1]);
ll xc = dmin;
while (vg0.size()<M) {
ll qmin = xc; ll qmax = vleft.size()-1;
while (qmin<qmax) {
ll qq = (qmin+qmax)/2;
vector<ll> vq1 = vqdef;
for (ll t=xc;t<=qq;t++) {
vq1.push_back(vleft[t]);
}
if (Query(vq1)>=1) {
qmax = qq;
} else {
qmin = qq-1;
}
}
vg0.push_back(vleft[qmin]);
xc = qmin+1;
}
set<ll> vlset;
for (ll x: vleft) {
vlset.insert(x);
}
for (ll x: vg0) {
vlset.erase(vlset.find(x));
}
vleft.clear();
for (ll x: vlset) {
vleft.push_back(x);
}
vgf.push_back(vg0);
}
for (ll m=0;m<M;m++) {
vector<ll> A;
for (ll n=0;n<N;n++) {
A.push_back(vgf[n][m]);
}
Answer(A);
}
}