2733 - nrapp

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

Se dă un număr natural N si un șir v de N numere naturale. Sa se răspundă la Q întrebări de tipul:

D y: Care este cea mai mică poziție x, unde x > y, pentru care v[x] < v[y]? Dacă nu există o astfel de poziție, răspunsul acestei întrebări va fi N + 1. S y: Care este cea mai mare poziție x, unde x < y, pentru care v[x] < v[y]? Dacă nu există o astfel de poziție, răspunsul acestei întrebări va fi 0.

Date de intrare

Fișierul de intrare nrappin.txt conține pe prima linie numărul natural N, iar pe a doua linie N numere naturale separate prin spații. A treia linie va conține numărul natural nenul Q și apoi Q întrebări precum cele descrise anterior.

Date de ieșire

Fișierul de ieșire nrappout.txt va conține Q linii, anume răspunsul pentru fiecare întrebare în parte.

Restricții și precizări

  • 1 ≤ N ≤ 100.000
  • 1 ≤ v[i] ≤ 1.000.000

Exemplul 1:

nrappin.txt
8
1 3 6 5 2 1 9 6
8
S 1
D 2
D 3
S 4
S 5
D 6
D 7
D 8
nrappout.txt
Datele de intrare corespund restrictiilor impuse
0
5
4
2
1
9
8
9

Exemplul 2:

nrappin.txt
nrapp
nrappout.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare

def validare(n, sir_v, q, intrebari, file_output):           # functia de validare a datelor de intrare
    if not 1 <= n <= 100000:
        raise ValueError
    for val in sir_v:
        if not 1 <= val <= 1000000:    # fiecare element trebuie sa fie numar intreg intre 1 si 1.000.000
            raise ValueError
    if q < 1:
        raise ValueError
    for intrebare in intrebari:
        if len(intrebare) != 2 or not isinstance(intrebare[1], int):
            raise ValueError
    file_output.write("Datele de intrare corespund restrictiilor impuse\n")


def solve(n, sir_v, intrebari):                     # functia de rezolvare
    raspunsuri = []
    for intrebare in intrebari:
        if intrebare[0] == 'D':
            y = intrebare[1]
            raspuns = n + 1
            for x in range(y + 1, n + 1):
                if sir_v[x - 1] < sir_v[y - 1]:
                    raspuns = x
                    break
            raspunsuri.append(raspuns)
        elif intrebare[0] == 'S':
            y = intrebare[1]
            raspuns = 0
            for x in range(y - 1, 0, -1):
                if sir_v[x - 1] < sir_v[y - 1]:
                    raspuns = x
                    break
            raspunsuri.append(raspuns)
    return raspunsuri


if __name__ == '__main__':
    file_in = open('nrappin.txt', 'r')
    file_out = open('nrappout.txt', 'w')

    try:
        N = int(file_in.readline())
        v = list(map(int, file_in.readline().split()))
        Q = int(file_in.readline())
        queries = []
        for _ in range(Q):
            query = file_in.readline().split()
            queries.append((query[0], int(query[1])))

        validare(N, v, Q, queries, file_out)
        answers = solve(N, v, queries)

        for answer in answers:
            file_out.write(str(answer) + '\n')

    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")