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 <iostream>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <fstream>
#include <sstream>
#include <iomanip>
#define ll long long

using namespace std;

long long MOD = 1000000007;

template<typename T>
void cout_vec(vector<T> &vec){
    for(int i=0; i<vec.size(); i++){
        if (i!=0){
            cout << ' ';
        }
        cout << vec[i];
    }
    cout << endl;
}

template<typename T>
void cout_mat(vector<vector<T>  > &mat){
    for(int i=0; i<mat.size(); i++){
        vector<T> vec = mat[i];
        cout_vec(mat[i]);
    }
}

int main(){
    int N;
    cin >> N;
    vector<vector<ll>> ans(N,vector<ll>(N,0));
    vector<vector<ll>> STUV(4,vector<ll>(N,0));
    for(auto &line:STUV){
        for(auto &x:line){
            cin >> x;
        }
    }

    int S0;
    int S1;
    for(int i=0; i<N; i++){
        int x=STUV[0][i];
        if(x==0){
            S0++;
        }else{
            S1++;
        }
        for(int j=0; j<N; j++){
            ans[i][j]=STUV[2][j];
        }
    }

    int tmp1,tmp2;
    tmp1=tmp2=-1;
    for(int j=0; j<N; j++){
        int flag=0;
        if(STUV[1][j]==0){
            for(int i=0; i<N; i++){
                if(STUV[0][i]==0){
                    ans[i][j]=ans[i][j]|STUV[3][j];
                }else{
                    //cout << tmp1 << ' '  << flag << ' ' << S1 << ' '<< (int)(STUV[3][j]) <<endl;
                    if((tmp1!=i && flag==0)||S1==1){
                        ans[i][j]=ans[i][j]-(ans[i][j]&~STUV[3][j]);
                        tmp1=i;
                        flag=1;
                    }
                }
            }
        }else{
            for(int i=0; i<N; i++){
                if(STUV[0][i]==0){
                    if((tmp2!=i && flag==0)||S0==1){
                        ans[i][j]=ans[i][j]|STUV[3][j];
                        tmp2=i;
                        flag=1;
                    }
                }else{
                    ans[i][j]=ans[i][j]-(ans[i][j]&(~STUV[3][j]));
                }
            }
        }
    }
    cout_mat(ans);
    return 0;

    for(int i=0; i<N; i++){
        if(STUV[0][i]==0){
            ll tmp=(1<<64)-1;
            for(int j=0; j<N; j++){
                tmp&=ans[i][j];
            }
            if(tmp!=STUV[2][i]){
                cout<<-1<<endl;
                return 0;
            }
        }else{
            ll tmp=0;
            for(int j=0; j<N; j++){
                tmp|=ans[i][j];
            }
            if(tmp!=STUV[2][i]){
                cout<<-1<<endl;
                return 0;
            }
        }
    }
    //cout_mat(ans);

    for(int j=0; j<N; j++){
        if(STUV[1][j]==0){
            ll tmp=(1<<64)-1;
            for(int i=0; i<N; i++){
                tmp&=ans[i][j];
            }
            if(tmp!=STUV[3][j]){
                cout<<-1<<endl;
                return 0;
            }
        }else{
            ll tmp=0;
            for(int i=0; i<N; i++){
                tmp|=ans[i][j];
            }
            if(tmp!=STUV[3][j]){
                cout<<-1<<endl;
                return 0;
            }
        }
    }
    cout_mat(ans);
}