1695 - Oglinda
Enunț[edit | edit source]
Pentru un număr natural N se consideră șirul a=(1,2,3...,N), deci a[i]=i pentru orice i, 1≤i≤N.
Asupra acestui șir se pot aplica operații de două tipuri:
a) la operația de tipul 1 se specifică două valori i și j, cu 1≤i≤j≤N. Efectul acestei operații asupra șirului este de oglindire a secvenței din șir care începe cu elementul de pe poziția i și se termină cu cel de pe poziția j. De exemplu, dacă în șirul a=(1,2,3,4,5,6,7) se aplică operația 3 6, atunci șirul devine a=(1,2,6,5,4,3,7). Iar în șirul a=(1,4,3,2,5,6,7), dacă se aplică operația 4 6, atunci a=(1,4,3,6,5,2,7).
b) Operația de tipul 2 conține un indice i, 1≤i≤N, și cere să afișăm valoarea elementului care se află în acel moment pe poziția i în șir.
Se consideră M astfel de operații într-o ordine dată.
Cerința[edit | edit source]
Scrieți un program care să determine și să afișeze rezultatul pentru fiecare operație de tipul 2.
Date de intrare[edit | edit source]
Fișierul de intrare oglindain.txt conține pe prima linie două numere naturale N și M, separate printr-un spațiu. Pe fiecare dintre următoarele M linii este specificată câte o operație de tipul 1 sau 2. O linie poate să conțină două sau trei numere, astfel: 1 i j (indicând o operație de tipul 1) respectiv 2 i (indicând o operație de tip 2). Valorile de pe aceeași linie sunt separate prin câte un spațiu.
Date de ieșire[edit | edit source]
Fișierul de ieșire oglindaout.txt va conține un număr de linii egal cu numărul de operații de tipul 2 care sunt definite în fișierul de intrare. Pe fiecare linie este afișat câte un număr natural reprezintând rezultatul pentru o operație de tip 2 prezentă în fișierul de intrare, în ordinea în care acestea sunt definite.
Restricții și precizări[edit | edit source]
- 1 ⩽ N ⩽ 1.000.000
- 1 ⩽ M ⩽ 2.000
- Se garantează că 1 ≤ i ≤ j ≤ N la operațiile de tipul 1 și că 1 ≤ i ≤ N la operațiile de tip 2.
- Se garantează că există cel puțin o operație de tipul 2.
Exemplul 1[edit | edit source]
- Intrare
- oglindain.txt
- 10 4
- 2 3
- 1 2 7
- 2 3
- 2 1
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- oglindaout.txt
- 3
- 6
- 1
Explicație[edit | edit source]
Șirul inițial este: 1 2 3 4 5 6 7 8 9 10
Rezultatul operației 2 3 are ca efect afișarea elementului de pe poziția 3 (care este chiar 3).
Rezultatul operației 1 2 7 are ca efect transformarea șirului în:
1 7 6 5 4 3 2 8 9 10.
Rezultatul operației 2 3 are ca efect afișarea elementului de pe poziția 3 (care acum este 6).
Rezultatul operației 2 1 are ca efect afișarea elementului de pe poziția 1 (care acum are valoarea 1).
Exemplul 2[edit | edit source]
- Intrare
- oglindain.txt
- 10 2023
- 2 3
- 1 2 7
- 2 3
- 2 1
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 1695 - Oglinda
def oglinda(n, operatii):
sir = list(range(1, n + 1)) rezultate = [] for operatie in operatii: tip = operatie[0] if tip == 1: i, j = operatie[1], operatie[2] sir[i - 1:j] = reversed(sir[i - 1:j]) elif tip == 2: i = operatie[1] rezultate.append(sir[i - 1]) with open("oglindaout.txt", "w") as output_file: for rezultat in rezultate: output_file.write(str(rezultat) + "\n")
def validare_date(n, m, operatii):
if not (1 <= n <= 1000000): return False if not (1 <= m <= 2000): return False for operatie in operatii: tip = operatie[0] if tip == 1: i, j = operatie[1], operatie[2] if not (1 <= i <= j <= n): return False elif tip == 2: i = operatie[1] if not (1 <= i <= n): return False return True
if __name__ == "__main__":
with open("oglindain.txt", "r") as f: n, m = map(int, f.readline().split()) operatii = [list(map(int, line.split())) for line in f] if validare_date(n, m, operatii): print("Datele de intrare corespund restricțiilor impuse") oglinda(n, operatii) else: print("Datele de intrare NU corespund restricțiilor impuse") exit(0)
</syntaxhighlight>