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: Runtime Error)

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
 
#define sz(x) (int)((x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define endl '\n'
#define x first
#define y second
#define int unsigned long long
#define double long double
#define pii pair<int, int>
#define pb push_back
#define vec vector
#define beg begin
#define dbg(x) cout << #x << " = " << x << endl;
 
template<class T> ostream& operator<<(ostream &str, vector<T> &a) {
    for (auto &i : a) {
        str << i << " ";
    }
    return str;
}
 
template<class T> istream& operator>>(istream &str, vector<T> &a) {
    for (auto &i : a) {
        str >> i;
    }
    return str;
}
 
template<class T> ostream& operator<<(ostream &str, pair<T, T> &a) {
    str << a.first << " " << a.second;
    return str;
}
 
template<class T> istream& operator>>(istream &str, pair<T, T> &a) {
    str >> a.first >> a.second;
    return str;
}
 
void solve(); signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
#endif
    srand(time(0));
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cout.setf(ios::fixed); cout.precision(9);
    solve();
    return 0;
}
 
const int MOD = 998244353, MAXN = 1e6 + 10, INF = 1e18 + 10, BASE = 37;

void solve() {
	int n;
	cin >> n;
	vec<int> s(n), t(n), u(n), v(n);
	cin >> s >> t >> u >> v;

	int cnts = 0, cntt = 0;
	for (int i = 0; i < n; ++i) {
	 	if (s[i] == 0) cnts++;
	 	if (t[i] == 0) cntt++;
	}

	if (cnts == n || cntt == n) assert(0);

	// ����������� ������ ���� ��� 0

	vec<vec<int>> ans(n, vec<int>(n)); 
	for (int i = 0; i < n; ++i) {
	 	if (s[i] == 0) {
	 	 	for (int j = 0; j < n; ++j) {
	 	 		if (t[j] == 0) {
	 	 			ans[i][j] |= u[i];
	 	 		}
				else {
				 	for (int k = 0; k < 64; ++k) {
				 	    if (((v[j] >> k) & 1ull) && ((u[i] >> k) & 1ull)) {
				 	     	ans[i][j] |= (1ull << k);
				 	    }
				 	}	
	 	 	 	}
	 	 	}
	 	}
	}
	for (int j = 0; j < n; ++j) {
	 	if (t[j] == 0) {
	 	 	for (int i = 0; i < n; ++i) {
	 	 		if (s[i] == 0) {
	 	 			ans[i][j] |= v[j];
	 	 		}
				else {
				 	for (int k = 0; k < 64; ++k) {
				 	 	if (((v[j] >> k) & 1ull) && ((u[i] >> k) & 1ull)) {
				 	     	ans[i][j] |= (1ull << k);
				 	    }
				 	}
	 	 	 	}
	 	 	}
	 	}
	}

	for (int i = 0; i < n; ++i) {
	 	if (s[i] == 1) {
	 	    for (int j = 0; j < n; ++j) {
	 	     	if (t[j] == 1) {
	 	     	    for (int k = 0; k < 64; ++k) {
	 	     	     	if (((v[j] >> k) & 1ull) && ((u[i] >> k) & 1ull)) {
	 	     	     	 	ans[i][j] |= (1ull << k);
	 	     	     	}
	 	     	    }
	 	     	}	
	 	    }
	 	}	
	}
	for (int j = 0; j < n; ++j) {
	 	if (t[j] == 1) {
	 	 	for (int i = 0; i < n; ++i) {
	 	 	    if (s[i] == 1) {
	 	 	     	for (int k = 0; k < 64; ++k) {
	 	 	     	 	if (((v[j] >> k) & 1ull) && ((u[i] >> k) & 1ull)) {
	 	 	     	 	 	ans[i][j] |= (1ull << k);
	 	 	     	 	}
	 	 	     	}
	 	 	    }
	 	 	}	
	 	}
	}

	bool ok = true;
	for (int i = 0; i < n; ++i) {
		int num = ans[i][0];
	 	if (s[i] == 0) {
	 	 	for (int j = 1; j < n; ++j) {
	 	 	 	num &= ans[i][j];
	 	 	}
	 	}
	 	else {
	 	 	for (int j = 1; j < n; ++j) {
	 	 		num |= ans[i][j];
	 	 	}
	 	}
	 	if (num != u[i]) ok = false;
	}

	for (int j = 0; j < n; ++j) {
	    int num = ans[0][j];
	    if (t[j] == 0) {
	     	for (int i = 1; i < n; ++i) {
	     	 	num &= ans[i][j];
	     	}
	    }
	    else {
	     	for (int i = 1; i < n; ++i) {
	     	    num |= ans[i][j];
	     	}	
	    }
		if (num != v[j]) ok = false;
	}	

	if (!ok) {
	 	cout << -1 << endl;
	 	return;
	}  

	for (int i = 0; i < n; ++i) {
	 	for (int j = 0; j < n; ++j) {
	 	 	cout << ans[i][j] << " ";
	 	}
	 	cout << endl;
	}
}