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: Accepted)

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef unsigned long long ll;
typedef double ld;
typedef pair<ll,ll> pp;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> super_set;

#define x1 dfds
#define y1 dsfdsfe
#define pb push_back
#define forn(i,n) for(ll i = 1;i<=n;++i)
#define fi first
#define sc second
#define endl '\n'
#define po(x) ((unsigned long long)(1)<<x)
const ll DIM = 500+7;
const ll INF = 10E17;
const ll MOD = 2019;
const ll LOG = 64;
const unsigned long long masksz = po(64)-1;
ll S[DIM],T[DIM],U[DIM],V[DIM],A[DIM][DIM];
ll cntro[DIM][LOG+7],cntcol[DIM][LOG+7];
int main()
{

    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ll n;
    cin>>n;
    forn(i,n)cin>>S[i];
    forn(i,n)cin>>T[i];
    forn(i,n)cin>>U[i];
    forn(i,n)cin>>V[i];
    forn(pos,n){
        ll x = U[pos];
        vector<ll> bit;
        forn(i,LOG){
            bit.pb(x%2);
            x/=2;
        }
        if (S[pos]==0){

            forn(i,n){
                ll mult = 1;
                forn(j,LOG){
                    if (bit[j-1]==0){
                        mult*=2;
                        continue;
                    }
                    if (!(A[pos][i]&mult)){
                        cntro[pos][j]++;
                        cntcol[i][j]++;
                        A[pos][i]|=mult;
                    }
                    mult*=2;
                }

            }
        }
        x = V[pos];
        bit.clear();
        forn(i,LOG){
            bit.pb(x%2);
            x/=2;
        }
        if (T[pos]==0){

            forn(i,n){
                ll mult = 1;
                forn(j,LOG){
                    if (bit[j-1]==0){
                        mult*=2;
                        continue;
                    }
                    if (!(A[i][pos]&mult)){
                        cntcol[pos][j]++;
                        cntro[i][j]++;
                        A[i][pos]|=mult;
                    }
                    mult*=2;
                }

            }
        }


    }
    forn(pos,n){
        ll x = U[pos];
        vector<ll> bit;
        forn(i,LOG){
            bit.pb(x%2);
            x/=2;
        }

        if (S[pos]==1){
            ll mult = 1;
            forn(j,LOG){
                if (bit[j-1]==0){
                    mult*=2;
                    continue;
                }
                ll flag = 0;
                forn(i,n){
                    if (A[pos][i]&mult){
                        flag = 1;
                        break;
                    }
                }
                if (flag==0){
                    forn(i,n){
                        if(T[i]==1 && (V[i]&mult)){
                            if (!(A[pos][i]&mult)){
                                cntcol[i][j]++;
                                cntro[pos][j]++;
                            }
                            A[pos][i]|=mult;
                            flag =1;
                            break;
                        }
                    }
                    if (flag==0)
                    forn(i,n){
                        if (T[i]==0 && cntcol[i][j]<n-1 ){
                            if (!(A[pos][i]&mult)){
                                cntcol[i][j]++;
                                cntro[pos][j]++;
                            }
                            A[pos][i]|=mult;
                            break;
                        }

                    }
                }
                mult*=2;
            }

        }
        x = V[pos];
        bit.clear();
        forn(i,LOG){
            bit.pb(x%2);
            x/=2;
        }
        if (T[pos]==1){
            ll mult = 1;
            forn(j,LOG){
                if (bit[j-1]==0){
                    mult*=2;
                    continue;
                }
                ll flag = 0;
                forn(i,n){
                    if (A[i][pos]&mult){
                        flag = 1;
                        break;
                    }
                }
                if (flag==0){
                    forn(i,n){
                        if(S[i]==1 && (U[i]&mult)){
                            if (!(A[i][pos]&mult)){
                                cntro[i][j]++;
                                cntcol[pos][j]++;
                            }
                            A[i][pos]|=mult;
                            flag = 1;
                            break;
                        }
                    }
                    if (flag==0)
                    forn(i,n){
                        if (S[i]==0 && cntro[i][j]<n-1 ){
                            if (!(A[i][pos]&mult)){
                                cntro[i][j]++;
                                cntcol[pos][j]++;
                            }
                            A[i][pos]|=mult;
                            break;
                        }

                    }
                }
                mult*=2;
            }

        }
    }
    forn(i,n){
        ll r[2];
        r[0] = A[i][1];r[1] = A[i][1];
        forn(j,n){
            r[0]&=A[i][j];
            r[1]|=A[i][j];
        }
        if (r[S[i]]!=U[i]){
            cout<<"-1\n";
            return 0;
        }
    }
    forn(j,n){
        ll r[2];
        r[0] = A[1][j];
        r[1] = A[1][j];
        forn(i,n){
            r[0]&=A[i][j];
            r[1]|=A[i][j];
        }
        if (r[T[j]]!=V[j]){
            cout<<"-1\n";
            return 0;
        }
    }
    forn(i,n){
        forn(j,n){
            cout<<A[i][j]<<' ';
        }
        cout<<endl;
    }
    return 0;
}