#include<stdio.h>
#include<unordered_map>
#include<vector>
using namespace std;
int offset[109];
int increaseRange[109];
inline int nmtoid(int n, int m){
if(n*m<=6){
if(n==1)return m-2;
if(n==2)return m+4;
if(n==3)return m+7;
return m+9+n-4;
}
else{
if(n==1)return m+6;
if(n==2)return 16;
if(n==3)return 17;
if(n==4)return 18;
return n+12;
}
}
inline int encode(int nmid, int di, int dj){
return (nmid * 9 + di) * 9 + dj;
}
inline void decode(int id, int& nmid, int& di, int& dj)
{
dj = id%9; id/=9;
di = id%9; id/=9;
nmid = id;
}
struct QType{
int id;
int of;
};
int n, m;
vector<QType> qlist[500][500];
void inil(){
int i, j, k, l;
offset[1] = 1;
increaseRange[1] = 1;
for(i=2;i<=9;i++){
offset[i] = offset[i-1] * 6;
increaseRange[i] = increaseRange[i-1] * 6 + 1;
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
for(k=1;k<=9;k++){
if(i+k<=n){
for(l=1;l<=9/k;l++){
if(k*l >= 2 && j+l<=m){
for(int di = 0; di < k; di++){
for(int dj = 0; dj < l; dj++){
QType q;
q.id = encode(nmtoid(k, l), di, dj);
q.of = offset[di * l + dj + 1];
qlist[i+di][j+dj].push_back(q);
}
}
}
}
}
}
}
}
}
int main()
{
int i, j, k;
for(i=1;i<=9;i++)
for(j=1;j<=9/i;j++)
printf("%d %d -> %d\n",i,j,nmtoid(i,j));
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGU8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgb2Zmc2V0WzEwOV07CmludCBpbmNyZWFzZVJhbmdlWzEwOV07CmlubGluZSBpbnQgbm10b2lkKGludCBuLCBpbnQgbSl7CiAgICBpZihuKm08PTYpewogICAgaWYobj09MSlyZXR1cm4gbS0yOwogICAgaWYobj09MilyZXR1cm4gbSs0OwogICAgaWYobj09MylyZXR1cm4gbSs3OwogICAgcmV0dXJuIG0rOStuLTQ7CiAgICB9CiAgICBlbHNlewogICAgICAgIGlmKG49PTEpcmV0dXJuIG0rNjsKICAgICAgICBpZihuPT0yKXJldHVybiAxNjsKICAgICAgICBpZihuPT0zKXJldHVybiAxNzsKICAgICAgICBpZihuPT00KXJldHVybiAxODsKICAgICAgICByZXR1cm4gbisxMjsKICAgIH0KfQppbmxpbmUgaW50IGVuY29kZShpbnQgbm1pZCwgaW50IGRpLCBpbnQgZGopewogICAgcmV0dXJuIChubWlkICogOSArIGRpKSAqIDkgKyBkajsKfQppbmxpbmUgdm9pZCBkZWNvZGUoaW50IGlkLCBpbnQmIG5taWQsIGludCYgZGksIGludCYgZGopCnsKICAgIGRqID0gaWQlOTsgaWQvPTk7CiAgICBkaSA9IGlkJTk7IGlkLz05OwogICAgbm1pZCA9IGlkOwp9CnN0cnVjdCBRVHlwZXsKICAgIGludCBpZDsKICAgIGludCBvZjsKfTsKaW50IG4sIG07CnZlY3RvcjxRVHlwZT4gcWxpc3RbNTAwXVs1MDBdOwp2b2lkIGluaWwoKXsKICAgIGludCBpLCBqLCBrLCBsOwogICAgb2Zmc2V0WzFdID0gMTsKICAgIGluY3JlYXNlUmFuZ2VbMV0gPSAxOwogICAgZm9yKGk9MjtpPD05O2krKyl7CiAgICAgICAgb2Zmc2V0W2ldID0gb2Zmc2V0W2ktMV0gKiA2OwogICAgICAgIGluY3JlYXNlUmFuZ2VbaV0gPSBpbmNyZWFzZVJhbmdlW2ktMV0gKiA2ICsgMTsKICAgIH0KICAgIGZvcihpPTA7aTxuO2krKyl7CiAgICAgICAgZm9yKGo9MDtqPG07aisrKXsKICAgICAgICAgICAgZm9yKGs9MTtrPD05O2srKyl7CiAgICAgICAgICAgICAgICBpZihpK2s8PW4pewogICAgICAgICAgICAgICAgZm9yKGw9MTtsPD05L2s7bCsrKXsKICAgICAgICAgICAgICAgICAgICBpZihrKmwgPj0gMiAmJiBqK2w8PW0pewogICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGRpID0gMDsgZGkgPCBrOyBkaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgZGogPSAwOyBkaiA8IGw7IGRqKyspewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFUeXBlIHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5pZCA9IGVuY29kZShubXRvaWQoaywgbCksIGRpLCBkaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5vZiA9IG9mZnNldFtkaSAqIGwgKyBkaiArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0W2krZGldW2orZGpdLnB1c2hfYmFjayhxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBpbnQgaSwgaiwgazsKZm9yKGk9MTtpPD05O2krKykKZm9yKGo9MTtqPD05L2k7aisrKQpwcmludGYoIiVkICVkIC0+ICVkXG4iLGksaixubXRvaWQoaSxqKSk7CiAgICAKfQ==