Alcuni algoritmi di ordinamento mantengono l’ordine relativo degli elementi che hanno la stessa chiave di ordinamento. In questi casi, diciamo che l’algoritmo esegue un ordinamento stabile.
Immaginiamo di scrivere i numeri nell’array insieme ai loro indici iniziali, così da poter vedere come ogni elemento si sposta dopo l’ordinamento.
Initial array
(10, 0)
(12, 1)
(10, 2)
(7, 3)
(-3, 4)
(-3, 5)
(7, 6)
Stable sorting
(-3, 4)
(-3, 5)
(7, 3)
(7, 6)
(10, 0)
(10, 2)
(12, 1)
Unstable sorting
(-3, 5)
(-3, 4)
(7, 3)
(7, 6)
(10, 2)
(10, 0)
(12, 1)
Quando si esegue un ordinamento stabile, un algoritmo mantiene l’ordine iniziale se gli elementi sono uguali. Al contrario, in un ordinamento instabile, tale ordine può cambiare.
Challenge
Dato un array iniziale di n interi e n indici , occorre ottenere un nuovo array prendendo gli elementi nell’ordine indicato dagli indici forniti. Il primo elemento del nuovo array deve essere , il secondo deve essere , e così via.
Bisogna verificare se l’array ottenuto corrisponde alla versione stabilmente ordinata dell’array iniziale.
Input
La prima riga dell’input contiene un unico intero n (1 ≤ n ≤ ).
La riga successiva contiene n interi separati da spazio ( ≤ ≤ ).
La riga seguente contiene n interi separati da spazio (0 ≤ < n).
Output
Il programma deve stampare Yes se l’ordine degli indici corrisponde al risultato di un ordinamento stabile di , altrimenti deve stampare No.