StalinSort

Time limit: 0.22s Memory limit: 222MB Input: stalinsort.in Output: stalinsort.out

Algoritmul StalinSort este un algoritm de sortare care este definit astfel in pseudocod:

def stalin_sort(A)
    dacă A este vid
        return A

    rezultat ← listă goală
    ultim ← A[1]
    adaugă ultim în rezultat

    pentru i ← 2 până la lungime(A)
        dacă A[i] ≥ ultim
            adaugă A[i] în rezultat
            ultim ← A[i]
        altfel
            continuă

    return rezultat

Cu alte cuvinte, algoritmul sterge de la stanga la dreapta toate valorile care sunt mai mici decat cea din stanga sa.

De exemplu, pentru A={1,4,2,3,5}A = \{1, 4, 2, 3, 5\}, algoritmul va returna {1,4,5}\{1, 4, 5\}, fiindca sterge valorile 22 si 33 care nu sunt in ordine.

Cerință

Se da un sir de NN numere intregi, indexat de la 11. Definim F(i)=F(i) = suma lungimilor tuturor sirurilor rezultate din aplicarea Stalin Sort asupra subsecventelor care incep in pozitia ii. Sa se determine F(1),F(2),,F(N)F(1), F(2), \dots, F(N).

Date de intrare

Pe prima linie a fișierului de intrare stalinsort.in se gaseste numarul natural nenul NN.

Pe a doua linie a fisierului de intrare stalinsort.in se vor gasi NN numere intregi, separate prin spații, reprezentând lista AA.

Date de ieșire

Pe prima linie a fișierului de ieșire stalinsort.out se vor gasi NN numere naturale separate prin spații, al ii-lea reprezentând F(i)F(i).

Restricții și precizări

  • 1N1 000 0001 \leq N \leq 1\ 000\ 000
  • 1 000 000 000Ai1 000 000 000-1\ 000\ 000\ 000 \leq A_i \leq 1\ 000\ 000\ 000
  • Se garanteaza ca raspunsurile pot fi reprezentate pe 6464 de biti cu semn.
  • O subsecventa delimitata de capetele [l, r] a sirului AA este sirul AA', cu Ai=Al+i1{A'}_i = A_{l+i-1}, cu lungime(A)=rl+1lungime(A') = r-l+1. De exemplu, pentru A={6,5,4,7,5}A = \{6, 5, 4, 7, 5\}, subsecventa [2,4][2, 4] a sirului AA este A=5,4,7A' = {5, 4, 7}.
  • Pentru teste in valoare de 1010 puncte: AiAi+1A_i \leq A_{i+1}
  • Pentru alte teste in valoare de 1010 puncte: Ai>Ai+1A_i > A_{i+1}
  • Pentru alte teste in valoare de 1515 puncte: N100N \leq 100
  • Pentru alte teste in valoare de 1515 puncte: N1000N \leq 1000
  • Pentru alte teste in valoare de 1515 puncte: N100 000N \leq 100\ 000, exista maximum 1010 pozitii pentru care AiAi+1A_i \geq A_{i+1}
  • Pentru alte teste in valoare de 1515 puncte: N100 000N \leq 100\ 000

Exemplul 1

stalinsort.in

5
1 2 3 4 5

stalinsort.out

15 10 6 3 1

Explicație

stalin_sort([1, 1]) = {1}
stalin_sort([1, 2]) = {1, 2}
stalin_sort([1, 3]) = {1, 2, 3}
stalin_sort([1, 4]) = {1, 2, 3, 4}
stalin_sort([1, 5]) = {1, 2, 3, 4, 5}
Deci, F(1)=1+2+3+4+5=15F(1) = 1 + 2 + 3 + 4 + 5 = 15

stalin_sort([2, 2]) = {2}
stalin_sort([2, 3]) = {2, 3}
stalin_sort([2, 4]) = {2, 3, 4}
stalin_sort([2, 5]) = {2, 3, 4, 5}
Deci, F(2)=1+2+3+4=10F(2) = 1 + 2 + 3 + 4 = 10

stalin_sort([3, 3]) = {3}
stalin_sort([3, 4]) = {3, 4}
stalin_sort([3, 5]) = {3, 4, 5}
Deci, F(3)=1+2+3=6F(3) = 1 + 2 + 3 = 6

stalin_sort([4, 4]) = {4}
stalin_sort([4, 5]) = {4, 5}
Deci, F(4)=1+2=3F(4) = 1 + 2 = 3

stalin_sort([5, 5]) = {5}
Deci, F(5)=1F(5) = 1

Exemplul 2

stalinsort.in

5
4 6 1 3 5

stalinsort.out

9 4 6 3 1

Explicație

stalin_sort([1, 1]) = {4}
stalin_sort([1, 2]) = {4, 6}
stalin_sort([1, 3]) = {4, 6}
stalin_sort([1, 4]) = {4, 6}
stalin_sort([1, 5]) = {4, 6}
Deci, F(1)=1+2+2+2+2=9F(1) = 1 + 2 + 2 + 2 + 2 = 9

stalin_sort([2, 2]) = {6}
stalin_sort([2, 3]) = {6}
stalin_sort([2, 4]) = {6}
stalin_sort([2, 5]) = {6}
Deci, F(2)=1+1+1+1=4F(2) = 1 + 1 + 1 + 1 = 4

stalin_sort([3, 3]) = {1}
stalin_sort([3, 4]) = {1, 3}
stalin_sort([3, 5]) = {1, 3, 5}
Deci, F(3)=1+2+3=6F(3) = 1 + 2 + 3 = 6

stalin_sort([4, 4]) = {3}
stalin_sort([4, 5]) = {3, 5}
Deci, F(4)=1+2=3F(4) = 1 + 2 = 3

stalin_sort([5, 5]) = {5}
Deci, F(5)=1F(5) = 1

Log in or sign up to be able to send submissions!