Minimizzare la Sequenza

Data una sequenza di n numeri , l’obiettivo è minimizzarla. È possibile rendere la sequenza lessicograficamente minima scambiando due elementi ammessi della sequenza. Sei autorizzato a effettuare tutti gli scambi necessari. Tuttavia, non tutte le coppie di indici possono essere scambiate: soltanto alcuni accoppiamenti specificati sono permessi.

Confronto lessicografico di due sequenze

Una sequenza è considerata lessicograficamente più piccola di un’altra sequenza se e solo se esiste un intero k (1 ≤ k ≤ n) tale che , , …, e . In altre parole, esiste un indice k per cui , mentre tutti i numeri precedenti all’indice k sono uguali.

Sulla base della matrice che specifica quali scambi sono ammessi, devi determinare la sequenza lessicograficamente più piccola che si può ottenere a partire da quella iniziale.

Input

La prima riga dell’input contiene un singolo intero n (1 ≤ n ≤ 300).

La riga successiva contiene n interi separati da spazi (1 ≤ ≤ n) che rappresentano la sequenza iniziale, in cui tutti i numeri sono diversi.

Le successive n righe contengono n zeri e uno che indicano se lo scambio tra due indici è ammesso. Se il valore nella riga i e nella colonna j è 1, significa che lo scambio tra gli elementi all’indice i e j è ammesso. Se il valore è 0, lo scambio non è consentito.

Output

Il programma deve stampare la sequenza lessicograficamente più piccola che si può ottenere da quella data.

Esempi

Input

Output

5
4 2 1 5 3
00100
00011
10010
01101
01010

1 2 3 4 5

7
5 2 4 3 6 7 1
0001001
0000000
0000010
1000001
0000000
0010000
1001000

1 2 4 3 6 7 5

Spiegazione

  1. Possiamo effettuare i seguenti scambi:

    1. ↔  ⇒ 1 2 4 5 3

    2. ↔  ⇒ 1 2 4 3 5

    3. ↔  ⇒ 1 2 3 4 5

  2. ⇒ 1 2 4 5 3

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue