#include <iostream>
#include <vector>
#include <unordered_set>
using
namespace
std;
void
Check_Possibility(
int
N,
int
M, vector<vector<
long
long
>>& mat1,
vector<vector<
long
long
>>& mat2);
int
main()
{
int
N = 2;
int
M = 3;
vector<vector<
long
long
>> mat1 = { { 1, 2, 3 }, { 4, 5, 6 } };
vector<vector<
long
long
>> mat2 = { { 1, 4, 3 }, { 6, 5, 2 } };
Check_Possibility(N, M, mat1, mat2);
return
0;
}
void
Check_Possibility(
int
N,
int
M, vector<vector<
long
long
>>& mat1,
vector<vector<
long
long
>>& mat2)
{
if
(N == 1 || M == 1) {
bool
flag =
true
;
if
(N == 1) {
for
(
int
i = 0; i < M; i++) {
if
(mat1[0][i] != mat2[0][i]) {
flag =
false
;
break
;
}
}
}
else
{
for
(
int
i = 0; i < N; i++) {
if
(mat1[i][0] != mat2[i][0]) {
flag =
false
;
break
;
}
}
}
cout << (flag ?
"YES"
:
"NO"
) << endl;
return
;
}
unordered_set<
long
long
> black1, black2, white1, white2;
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j < M; j++) {
if
((i + j) % 2 == 0) {
black1.insert(mat1[i][j]);
black2.insert(mat2[i][j]);
}
else
{
white1.insert(mat1[i][j]);
white2.insert(mat2[i][j]);
}
}
}
if
(black1 == black2 && white1 == white2) {
cout <<
"YES"
<< endl;
}
else
{
cout <<
"NO"
<< endl;
}
}