Problem:
Score : 600 points

Problem Statement

Given are an integer N and arrays S, T, U, and V, each of length N.
Construct an N×N matrix a that satisfy the following conditions:

a_{i,j} is an integer.

0 \leq a_{i,j} \lt 2^{64}.

If S_{i} = 0, the bitwise AND of the elements in the i-th row is U_{i}.

If S_{i} = 1, the bitwise OR of the elements in the i-th row is U_{i}.

If T_{i} = 0, the bitwise AND of the elements in the i-th column is V_{i}.

If T_{i} = 1, the bitwise OR of the elements in the i-th column is V_{i}.

However, there may be cases where no matrix satisfies the conditions.

Constraints

All values in input are integers.

1 \leq N \leq 500

0 \leq S_{i} \leq 1

0 \leq T_{i} \leq 1

0 \leq U_{i} \lt 2^{64}

0 \leq V_{i} \lt 2^{64}

Input

Input is given from Standard Input in the following format:

N
S_{1} S_{2} ... S_{N}
T_{1} T_{2} ... T_{N}
U_{1} U_{2} ... U_{N}
V_{1} V_{2} ... V_{N}

Output

If there exists a matrix that satisfies the conditions, print one such matrix in the following format:

a_{1,1} ... a_{1,N}
:
a_{N,1} ... a_{N,N}

Note that any matrix satisfying the conditions is accepted.

If no matrix satisfies the conditions, print -1.

Sample Input 1

2
0 1
1 0
1 1
1 0

Sample Output 1

1 1
1 0

In Sample Input 1, we need to find a matrix such that:

the bitwise AND of the elements in the 1-st row is 1;

the bitwise OR of the elements in the 2-nd row is 1;

the bitwise OR of the elements in the 1-st column is 1;

the bitwise AND of the elements in the 2-nd column is 0.

Sample Input 2

2
1 1
1 0
15 15
15 11

Sample Output 2

15 11
15 11

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 500;
unsigned long long sol[MAXN][MAXN];
int32_t main()
{
	int N;
	cin >> N;
	int lignes[N];
	int colonnes[N];
	int nbLignes = N;
	int nbColonnes = N;
	for (int i = 0 ; i < N ; i++)
	{
		cin >> lignes[i];
	}
	for (int i = 0 ; i < N ; i++)
	{
		cin >> colonnes[i];
	}

	int valLignes[N];
	int valColonnes[N];
	for (int i = 0 ; i < N ; i++)
	{
		cin >> valLignes[i];
	}
	for (int i = 0 ; i < N ; i++)
	{
		cin >> valColonnes[i];
	}

	for (int iBit = 0 ; iBit < 64 ; iBit++)
	{
		int actu[N][N];
		for (int i = 0 ; i < N ; i++)
		{
			for (int j = 0 ; j < N ; j++) actu[i][j] = 2;
		}
		vector <int> libreL;
		vector <int> libreC;
		for (int i = 0 ; i < nbLignes ; i++)
		{
			if (lignes[i] == 0) //and
			{
				if (valLignes[i] & (1ll<<iBit))
				{
					for (int j = 0 ; j < nbColonnes ; j++)
					{
						if (actu[i][j] == 0)
						{
							cout<<-1<<endl;
							exit(0);
						}
						actu[i][j] = 1;
					}
				}
				else
				{
					libreL.push_back(i);
				}
			}
			else
			{
				if ((valLignes[i] & (1ll<<iBit))==0)
				{
					for (int j = 0 ; j < nbColonnes  ; j++)
					{
						if (actu[i][j] == 1)
						{
							cout<<-1<<endl;
							exit(0);
						}
						actu[i][j] = 0;
					}
				}
				else
				{
					libreL.push_back(i);
				}
			}
		}

		for (int i = 0 ; i < nbColonnes ; i++)
		{
			if (colonnes[i] == 0) //and
			{
				if (valColonnes[i] & (1ll<<iBit))
				{
					for (int j = 0 ; j < nbLignes ; j++)
					{
						if (actu[j][i] == 0)
						{
							cout<<-1<<endl;
							exit(0);
						}
						actu[j][i] = 1;
					}
				}
				else
				{
					libreC.push_back(i);
				}
			}
			else
			{
				if ((valColonnes[i] & (1ll<<iBit))==0)
				{
					for (int j = 0 ; j < nbLignes  ; j++)
					{
						if (actu[j][i] == 1)
						{
							cout<<-1<<endl;
							exit(0);
						}
						actu[j][i] = 0;
					}
				}
				else
				{
					libreC.push_back(i);
				}
			}
		}
		if (libreC.size() > 1 && libreL.size() > 1)
		{
			int in = 0;
			for (auto lig : libreL)
			{
				int ij = 0;
				for (auto col : libreC)
				{
					if (in % 2 == ij % 2) actu[lig][col] = 0;
					else actu[lig][col] = 1;
					ij++;
				}
				in++;
			}
		}
		else
		{
			if (libreC.size() <= 1 && libreL.size() > 0)
			{
				for (auto lig : libreL)
				{
					bool estBon = false;
					for (int j = 0 ; j < nbColonnes ; j++)
					{
						if (lignes[lig] == 0 && actu[lig][j] == 0)
						{
							estBon = true;
						}
						else if (lignes[lig] == 1  && actu[lig][j] == 1)
						{
							estBon = true;
						}
					}
					if (estBon) continue;
					for (int j = 0 ; j < nbColonnes ; j++)
					{
						if (actu[lig][j] == 2)
						{
							if (lignes[lig] == 0)
							{
								actu[lig][j] = 0;
							}
							else actu[lig][j] = 1;
							estBon = true;
							break;
						}
					}
					if (!estBon) 
					{
						cout<<-1<<endl;
						exit(0);
					}
				}
				for (auto col : libreC)
				{
					bool estBon = false;
					for (int j = 0 ; j < nbLignes ; j++)
					{
						if (colonnes[col] == 0 && actu[j][col] == 0) estBon = true;
						else if (colonnes[col] == 1 && actu[j][col] == 1) estBon = true;
					}
					if (estBon) continue;
					for (int j = 0 ; j < nbColonnes ; j++)
					{
						if (actu[j][col] == 2)
						{
							if (colonnes[col] == 0)
							{
								actu[j][col] = 0;
							}
							else actu[j][col] = 1;
							estBon = true;
							break;
						}
					}
					if (!estBon)
					{ 
					cout<<-1<<endl;
					exit(0);
				}
				}
			}
			else if (libreL.size() <= 1 && libreC.size() > 0)
			{
				for (auto col : libreC)
				{
					bool estBon = false;
					for (int j = 0 ; j < nbLignes ; j++)
					{
						if (colonnes[col] == 0 && actu[j][col] == 0) estBon = true;
						else if (colonnes[col] == 1 && actu[j][col] == 1) estBon = true;
					}
					if (estBon) continue;
					for (int j = 0 ; j < nbLignes ; j++)
					{
						if (actu[j][col] == 2)
						{
							if (colonnes[col] == 0)
							{
								actu[j][col] = 0;
							}
							else actu[j][col] = 1;
							estBon = true;
							break;
						}
					}
					if (!estBon) 
					{
						cout<<-1<<endl;
						exit(0);
					}
				}

				for (auto lig : libreL)
				{
					bool estBon = false;
					for (int j = 0 ; j < nbColonnes ; j++)
					{
						if (lignes[lig] == 0 && actu[lig][j] == 0)
						{
							estBon = true;
						}
						else if (lignes[lig] == 1  && actu[lig][j] == 1)
						{
							estBon = true;
						}
					}
					if (estBon) continue;
					for (int j = 0 ; j < nbColonnes ; j++)
					{
						if (actu[lig][j] == 2)
						{
							if (lignes[lig] == 0)
							{
								actu[lig][j] = 0;
							}
							else actu[lig][j] = 1;
							estBon = true;
							break;
						}
					}
					if (!estBon) 
					{
						cout<<-1<<endl;
						exit(0);
					}
					
				}

				
			}
		}
		for (int i = 0 ; i < nbLignes ; i++)
		{
			for (int j = 0 ; j < nbColonnes ; j++)
			{
				if (actu[i][j] == 2) actu[i][j] = 0;
				sol[i][j] |= (actu[i][j] * (1ll<<iBit));
			}
		}
	}
	for (int i = 0 ; i < nbLignes ; i++)
	{
		for (int j = 0 ; j < nbColonnes ; j++)
		{
			cout<<sol[i][j]<<" ";
		}
		cout<<endl;
	}
}