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;

typedef unsigned long long ULL;
const int M=505;
const ULL INF=0xffffffffffffffff;
int s[M],t[M];
ULL u[M],v[M];
int n;
ULL a[M][M];
vector<int> r,c;

int vis[M];

void solve(int p)
{
	if(!r.size()||!c.size()) return;
	//cout<<"here"<<endl;
	if(r.size()>=2&&c.size()>=2)
	{
		if(r.size()>=c.size())
		{
			int j=0;
			for(int i:r)
			{
				a[i][c[j]]|=p;
				j=(j+1)%c.size();
			}
		}
		else
		{
			int j=0;
			for(int i:c)
			{
				a[r[j]][i]|=p;
				j=(j+1)%r.size();
			}
		}
		return;
	}
	//cout<<"here"<<endl;
	if(r.size()==1)
	{
		//cout<<"here"<<endl;
		int i=r[0];
		int cnt0=0,cnt1=0;
		memset(vis,0,sizeof(vis));
		for(int j:c)
			vis[j]=1;
		for(int j=0;j<n;j++)
		{
			if(vis[j]) continue;
			if(a[i][j]&p) cnt1=1;
			else cnt0=1;
		}
		int cntr0=cnt0,cntr1=cnt1;
		
		for(int j:c)
		{
			//cout<<"!!!!! j"<<endl;
			cnt0=cnt1=0;
			for(int k=0;k<n;k++)
			{
				if(k==i) continue;
				if(a[k][j]&p) cnt1=1;
				else cnt0=1;
			}
			//cout<<"!! "<<cnt0<<" "<<cnt1<<endl;
			if(t[j] && (v[j]&p))
			{
				if(!cnt1) a[i][j]|=p,cntr1=1,vis[j]=0;
			}
			if(!t[j] && !(v[j]&p))
			{
				if(!cnt0) cntr0=1,vis[j]=0;
			}
		}

		for(int j:c)
		{
			if(!vis[j]) continue;
			//cout<<"!! j "<<endl;
			if(cntr0&&cntr1) break;
			if(s[i] && (u[i]&p))
			{
				a[i][j]|=p;
				cntr1=1;
			}
			else if(!s[i] && !(u[i]&p))
			{
				cntr0=1;
			}
		}
	}
	else // c.size()==1
	{
		int i=c[0];
		int cnt0=0,cnt1=0;
		memset(vis,0,sizeof(vis));
		for(int j:r)
			vis[j]=1;
		for(int j=0;j<n;j++)
		{
			if(vis[j]) continue;
			if(a[j][i]&p) cnt1=1;
			else cnt0=1;
		}
		int cntr0=cnt0,cntr1=cnt1;
		
		for(int j:r)
		{
			//cout<<"!!!!! j"<<endl;
			cnt0=cnt1=0;
			for(int k=0;k<n;k++)
			{
				if(k==i) continue;
				if(a[j][k]&p) cnt1=1;
				else cnt0=1;
			}
			//cout<<"!! "<<cnt0<<" "<<cnt1<<endl;
			if(s[j] && (u[j]&p))
			{
				if(!cnt1) a[j][i]|=p,cntr1=1,vis[j]=0;
			}
			if(!s[j] && !(u[j]&p))
			{
				if(!cnt0) cntr0=1,vis[j]=0;
			}
		}

		for(int j:r)
		{
			if(!vis[j]) continue;
			//cout<<"!! j "<<endl;
			if(cntr0&&cntr1) break;
			if(t[i] && (v[i]&p))
			{
				a[j][i]|=p;
				cntr1=1;
			}
			else if(!t[i] && !(v[i]&p))
			{
				cntr0=1;
			}
		}
	}
}

bool check()
{
	for(int i=0;i<n;i++)
	{
		ULL cur=s[i]?0:INF;
		for(int j=0;j<n;j++)
		{
			if(s[i]) cur|=a[i][j];
			else cur&=a[i][j];
		}
		if(cur!=u[i]) return false;
	}
	for(int i=0;i<n;i++)
	{
		ULL cur=t[i]?0:INF;
		for(int j=0;j<n;j++)
		{
			if(t[i]) cur|=a[j][i];
			else cur&=a[j][i];
		}
		if(cur!=v[i]) return false;
	}
	return true;
}

int main()
{
	//freopen("F.in","r",stdin);
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&s[i]);
	for(int i=0;i<n;i++)
		scanf("%d",&t[i]);
	for(int i=0;i<n;i++)
		scanf("%llu",&u[i]);
	for(int i=0;i<n;i++)
		scanf("%llu",&v[i]);

	//cout<<"input ok"<<endl;
	ULL p=1;
	for(int ii=0;ii<64;ii++,p<<=1)
	{
		//cout<<ii<<endl;
		r.clear();
		c.clear();
		for(int i=0;i<n;i++)
		{
			// or 0
			// and 1
			ULL val=u[i]&p;
			if((s[i]&&!val) || (!s[i]&&val))
			{
				for(int j=0;j<n;j++)
					a[i][j]|=val;
			}
			else
				r.push_back(i);
		}
		for(int i=0;i<n;i++)
		{
			// or 0
			// and 1
			ULL val=v[i]&p;
			if((t[i]&&!val) || (!t[i]&&val))
			{
				for(int j=0;j<n;j++)
					a[j][i]|=val;
			}
			else
				c.push_back(i);
		}
		
		// cout<<"r : ";
		// for(int i:r) cout<<i<<" ";
		// cout<<endl<<"c : ";
		// for(int i:c) cout<<i<<" ";
		// cout<<endl;

		// for(int i=0;i<n;i++)
		// 	for(int j=0;j<n;j++)
		// 		printf("%llu%c",a[i][j],j==n-1?'\n':' ');
		// cout<<"here! before solve"<<endl;
		solve(p);
		//cout<<"here! after solve"<<endl;
		// for(int i=0;i<n;i++)
		// 	for(int j=0;j<n;j++)
		// 		printf("%llu%c",a[i][j],j==n-1?'\n':' ');
	}
	if(check())
	{
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				printf("%llu%c",a[i][j],j==n-1?'\n':' ');
	}
	else
		puts("-1");
	return 0;
}