Reverse (Codeforces 1638A)
Tags: Greedy, constructive algorithms

You are given a permutation $$$p_1, p_2, \ldots, p_n$$$ of length $$$n$$$. You have to choose two integers $$$l,r$$$ ($$$1 \le l \le r \le n$$$) and reverse the subsegment $$$[l,r]$$$ of the permutation. The permutation will become $$$p_1,p_2, \dots, p_{l-1},p_r,p_{r-1}, \dots, p_l,p_{r+1},p_{r+2}, \dots ,p_n$$$.Find the lexicographically smallest permutation that can be obtained by performing exactly one reverse operation on the initial permutation.Note that for two distinct permutations of equal length $$$a$$$ and $$$b$$$, $$$a$$$ is lexicographically smaller than $$$b$$$ if at the first position they differ, $$$a$$$ has the smaller element.A permutation is an array consisting of $$$n$$$ distinct integers from $$$1$$$ to $$$n$$$ in arbitrary order. For example, $$$[2,3,1,5,4]$$$ is a permutation, but $$$[1,2,2]$$$ is not a permutation ($$$2$$$ appears twice in the array) and $$$[1,3,4]$$$ is also not a permutation ($$$n=3$$$ but there is $$$4$$$ in the array).

Input: Each test contains multiple test cases. The first line contains a single integer $$$t$$$ ($$$1 \le t \le 500$$$) — the number of test cases. Description of the test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 500$$$) — the length of the permutation.The second line of each test case contains $$$n$$$ integers $$$p_1, p_2, \dots, p_n$$$ ($$$1 \le p_i \le n$$$) — the elements of the permutation.

Output: For each test case print the lexicographically smallest permutation you can obtain.

Note: In the first test case, the permutation has length $$$1$$$, so the only possible segment is $$$[1,1]$$$. The resulting permutation is $$$[1]$$$.In the second test case, we can obtain the identity permutation by reversing the segment $$$[1,2]$$$. The resulting permutation is $$$[1,2,3]$$$.In the third test case, the best possible segment is $$$[2,3]$$$. The resulting permutation is $$$[1,2,4,3]$$$.In the fourth test case, there is no lexicographically smaller permutation, so we can leave it unchanged by choosing the segment $$$[1,1]$$$. The resulting permutation is $$$[1,2,3,4,5]$$$.

Sample Inputs:
4
1
1
3
2 1 3
4
1 4 2 3
5
1 2 3 4 5

Sample Outputs:
1 
1 2 3 
1 2 4 3 
1 2 3 4 5

Solution (Python):
def i():
    n = int(input())
    s = input().split()
    tp = n
    for x in range(n):
        if str(x + 1) != s[x]:
            tp = s.index(str(x + 1))
            break
    return ' '.join(s[:x] + s[x:tp + 1][::-1] + s[tp + 1:])
t = int(input())
a = []
for _ in range(t):
    a.append(i())
print('\n'.join(a))

Solution (Python):
import sys
t = int(sys.stdin.readline())
for i in range(t):
    n = int(sys.stdin.readline())
    input = sys.stdin.readline()
    myList = input.split()
    left = 0
    for i in range(n):
        if int(myList[i]) == i + 1:
            continue
        else:
            left = i
            break
    right = myList.index(str(left + 1))
    newList = myList[left:right + 1]
    newList.reverse()
    myList[left:right + 1] = newList
    print(' '.join(myList))

Solution (Python):
t = int(input())
for _ in range(t):
    n = int(input())
    p = input().split()
    i = 0
    virus_start = None
    virus_end = None
    for i in range(n):
        if int(p[i]) != i + 1:
            virus_start = i
            virus_end = p.index(str(i + 1))
            break
    if virus_start is None:
        print(' '.join(p))
    else:
        print(' '.join(p[:virus_start]), ' '.join(p[virus_end:virus_start:-1]), p[virus_start], ' '.join(p[virus_end + 1:]))