2733 - nrapp
De la Universitas MediaWiki
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")