#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int ac[101][101]={};
int bc[101][101]={};
void make(int r, int c) {
int cnt=0;
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
ac[i][j]=++cnt;
bc[i][j]=ac[i][j];
}
}
}
void copy(int r, int c) {
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) ac[i][j]=bc[i][j];
}
}
int what(int x, int y) {
return ac[x][y];
}
void go(int **queries, int x, int y, int a) {
if(x==queries[a][0]-1 && y>=queries[a][1]-1 && y<queries[a][3]-1) bc[x][y+1]=ac[x][y];
else if(x>=queries[a][0]-1 && y==queries[a][3]-1 && x<queries[a][2]-1) bc[x+1][y]=ac[x][y];
else if(x>queries[a][2]-1 && y==queries[a][3]-1 && x<=queries[a][2]-1) bc[x][y-1]=ac[x][y];
else bc[x-1][y]=ac[x][y];
}
// queries_row_len은 2차원 배열 queries의 행(세로) 길이입니다.
// queries_col_len은 2차원 배열 queries의 열(가로) 길이입니다.
// queries[i][j]는 queries의 i번째 행의 j번째 열에 저장된 값을 의미합니다.
int* solution(int rows, int columns, int **queries, size_t queries_row_len, size_t queries_col_len) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
int* answer = (int*)malloc(sizeof(int)*queries_row_len);
make(rows,columns);
int c = rows*columns;
int cnt=0;
int st=0;
for(int a=0;a<queries_row_len;a++) {
for(int j=queries[a][1]-1;j<queries[a][3]-1;j++) {
int b=what(queries[a][0]-1,j);
if(b<=c) c=b;
go(queries,queries[a][0]-1,j,a);
}
for(int i=queries[a][0]-1;i<queries[a][2]-1;i++) {
int b=what(i,queries[a][3]-1);
if(b<=c) c=b;
go(queries,i,queries[a][3]-1,a);
}
for(int j=queries[a][3]-1;j>queries[a][1]-1;j--) {
int b=what(queries[a][2]-1,j);
if(b<=c) c=b;
go(queries,queries[a][2]-1,j,a);
}
for(int i=queries[a][2]-1;i>queries[a][0]-1;i--) {
int b=what(i,queries[a][1]-1);
if(b<=c) c=b;
go(queries,i,queries[a][1]-1,a);
}
copy(rows,columns);
answer[a]=c;
c=rows*columns;
}
return answer;
}