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>
#define fo(i,a,b) for(int i=(a);i<(b);i++)
#define qi queue<int>
#define vi vector<int>
#define ll unsigned long long
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define pii pair<int,int>
#define mp make_pair
#define all(a) (a).begin(),(a).end()
#define fi first
#define se second 
#define prq priority_queue
#define foreach(it,c) for(__typeof((c).begin()) it=c.begin();it!=c.end();it++)
//#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
inline ll read(){
	ll x=0;
	int f=1;
	char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-')f=-f;
	for(;isdigit(c);c=getchar())x=x*10+(c-'0');
	return x*f;
}
inline void out(int x){
	if(x>=10)out(x/10);
	putchar(x%10+'0');
}
int n;
ll a[555],b[555],c[555],d[555],an[505][505];
bool ans[505][505][66];
int main(){
	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	cin>>n;
	fo(i,0,n)cin>>a[i];
	fo(i,0,n)cin>>b[i];
	fo(i,0,n)cin>>c[i];
	fo(i,0,n)cin>>d[i];
	fo(i,0,n){
		vi v;
		v.clear();
		ll x=c[i];
		while(x>0){
			v.pb(x%2);
			x/=2;
		}
		while(v.size()<64)v.pb(0);
		fo(j,0,n) fo(k,0,64)ans[i][j][k]=v[k];
	}
	fo(i,0,n){
		vi v;
		v.clear();
		ll x=d[i];
		while(x>0){
			v.pb(x%2);
			x/=2;
		}
		while(v.size()<64)v.pb(0);
		fo(j,0,n) fo(k,0,64){
			if(a[j]==0)ans[j][i][k]|=v[k];
			else ans[j][i][k]&=v[k];
		}
	}
	fo(i,0,n){
		vi v;
		v.clear();
		ll x=c[i];
		while(x>0){
			v.pb(x%2);
			x/=2;
		}
		while(v.size()<64)v.pb(0);
		fo(j,0,n) fo(k,0,64){
			if(a[j]==0)ans[i][j][k]|=v[k];
			else ans[i][j][k]&=v[k];
		}
	}
	fo(i,0,n) fo(j,0,n){
		ll x=0;
		for(int k=63;k>=0;k--)x=x*2+ans[i][j][k];
		an[i][j]=x;
	}
	fo(i,0,n){
		if(a[i]==0){
			ll x=((ll)1<<63)-1+((ll)1<<63);
			fo(j,0,n)x&=an[i][j];
			if(x!=c[i]){
				cout<<"-1\n";
				return 0;
			}
		}else{
			ll x=0;
			fo(j,0,n)x|=an[i][j];
			if(x!=c[i]){
				cout<<"-1\n";
				return 0;
			}
		}
	}
	fo(i,0,n){
		if(b[i]==0){
			ll x=(ll)((1<<63)-1+(1<<63));
			fo(j,0,n)x&=an[j][i];
			if(x!=d[i]){
				cout<<"-1\n";
				return 0;
			}
		}else{
			ll x=0;
			fo(j,0,n)x|=an[j][i];
			if(x!=d[i]){
				cout<<"-1\n";
				return 0;
			}
		}
	}
	fo(i,0,n){
		fo(j,0,n-1)cout<<an[i][j]<<' ';
		cout<<an[i][n-1]<<endl;
	}
	return 0;
}