<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AjM</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AjM"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/AjM"/>
	<updated>2026-05-01T02:39:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1962_-_Vecini_Buni&amp;diff=10053</id>
		<title>1962 - Vecini Buni</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1962_-_Vecini_Buni&amp;diff=10053"/>
		<updated>2024-06-03T17:41:01Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se consideră matricea A ale cărei elemente pot avea doar valorile 0 sau 1 și în care numerotarea liniilor și numerotarea coloanelor începe de la 1. Pentru un element oarecare al matricei, definim noţiunea de vecin ca fiind acele elementele din matrice aflate în imediata sa apropiere, pe una dintre direcțiile orizontală, verticală sau pe cele două diagonale. Un vecin bun al elementului A[i][j] este un vecin care are aceeaşi valoare cu A[i][j]. == Cerin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se consideră matricea A ale cărei elemente pot avea doar valorile 0 sau 1 și în care numerotarea liniilor și numerotarea coloanelor începe de la 1. Pentru un element oarecare al matricei, definim noţiunea de vecin ca fiind acele elementele din matrice aflate în imediata sa apropiere, pe una dintre direcțiile orizontală, verticală sau pe cele două diagonale. Un vecin bun al elementului A[i][j] este un vecin care are aceeaşi valoare cu A[i][j].&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se matricea A, să se determine numărul maxim de vecini buni pe care îi are unul dintre elementele matricei precum și numărul de elemente care au acest număr maxim de vecini buni.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare vecini_buni.in conține pe prima linie trei valori naturale m, n și k reprezentând numărul de linii, numărul de coloane și numărul de valori egale cu 1 din matricea A. Pe fiecare dintre următoarele k linii ale fișierului se află două valori i și j cu semnificaţia A[i][j] este egal cu 1. Aceste valori sunt date în ordinea parcurgerii matricei pe linii de la linia 1 la linia m.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire vecini_buni.out va conține pe prima linie două numere naturale x și y separate printr-un singur spaţiu: x va reprezenta numărul maxim de vecini buni pe care îi are unul dintre elementele matricei date iar y va reprezenta numărul de elemente din matricea dată care au acest număr maxim de vecini buni.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ m,n ≤ 1000&lt;br /&gt;
* 0 ≤ k ≤ n*m&lt;br /&gt;
* pentru 30% dintre teste, 2 ≤ m,n ≤ 200&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; vecini_buni.in&lt;br /&gt;
 3 4 7&lt;br /&gt;
 1 3&lt;br /&gt;
 2 1&lt;br /&gt;
 2 4&lt;br /&gt;
 3 1&lt;br /&gt;
 3 4&lt;br /&gt;
 3 3&lt;br /&gt;
 3 2&lt;br /&gt;
; vecini_buni.out&lt;br /&gt;
 3 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Matricea A este următoarea:&lt;br /&gt;
&lt;br /&gt;
  0 0 1 0&lt;br /&gt;
  1 0 0 1&lt;br /&gt;
  1 1 1 1&lt;br /&gt;
Numărul maxim de vecini buni pe care îl întâlnim pentru elementele matricei este 3. Sunt 6 elemente care au acest număr maxim de vecini buni, cele situate în poziţiile: 1,2; 2,2; 2,3; 2,4; 3,2; 3,3 (cele care sunt subliniate în reprezentarea de mai sus a matricei).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def count_good_neighbors(matrix):&lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    max_good_neighbors = 0&lt;br /&gt;
    max_good_neighbors_count = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if matrix[i][j] == 1:&lt;br /&gt;
                good_neighbors = 0&lt;br /&gt;
                for di in [-1, 0, 1]:&lt;br /&gt;
                    for dj in [-1, 0, 1]:&lt;br /&gt;
                        if 0 &amp;lt;= i + di &amp;lt; m and 0 &amp;lt;= j + dj &amp;lt; n and matrix[i + di][j + dj] == 1:&lt;br /&gt;
                            good_neighbors += 1&lt;br /&gt;
                good_neighbors -= 1  # Exclude the element itself&lt;br /&gt;
                if good_neighbors &amp;gt; max_good_neighbors:&lt;br /&gt;
                    max_good_neighbors = good_neighbors&lt;br /&gt;
                    max_good_neighbors_count = 1&lt;br /&gt;
                elif good_neighbors == max_good_neighbors:&lt;br /&gt;
                    max_good_neighbors_count += 1&lt;br /&gt;
&lt;br /&gt;
    return max_good_neighbors, max_good_neighbors_count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Read input&lt;br /&gt;
    with open(&amp;quot;vecini_buni.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        m, n, k = map(int, fin.readline().split())&lt;br /&gt;
        matrix = [[0] * n for _ in range(m)]&lt;br /&gt;
        for _ in range(k):&lt;br /&gt;
            i, j = map(int, fin.readline().split())&lt;br /&gt;
            matrix[i - 1][j - 1] = 1&lt;br /&gt;
&lt;br /&gt;
    # Count good neighbors&lt;br /&gt;
    max_good_neighbors, max_good_neighbors_count = count_good_neighbors(matrix)&lt;br /&gt;
&lt;br /&gt;
    # Write output&lt;br /&gt;
    with open(&amp;quot;vecini_buni.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{max_good_neighbors} {max_good_neighbors_count}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2170_-_Dreptc&amp;diff=10051</id>
		<title>2170 - Dreptc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2170_-_Dreptc&amp;diff=10051"/>
		<updated>2024-06-03T17:39:19Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se consideră n puncte colorate dispuse în plan. Ele sunt identificate prin coordonatele lor întregi, pe axele OX și OY. Fiecare punct are asociat un număr natural între 1 și C reprezentând codul culorii lui. Un dreptunghi se numește corect dacă îndeplinește simultan următoare condiții: * toate cele patru vârfuri se regăsesc printre cele n puncte date; * are laturile paralele cu axele OX, OY; * are vârfurile colorate în aceeași culoare. == Cerin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se consideră n puncte colorate dispuse în plan. Ele sunt identificate prin coordonatele lor întregi, pe axele OX și OY. Fiecare punct are asociat un număr natural între 1 și C reprezentând codul culorii lui. Un dreptunghi se numește corect dacă îndeplinește simultan următoare condiții:&lt;br /&gt;
* toate cele patru vârfuri se regăsesc printre cele n puncte date;&lt;br /&gt;
* are laturile paralele cu axele OX, OY;&lt;br /&gt;
* are vârfurile colorate în aceeași culoare.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine numărul maxim de dreptunghiuri corecte care se pot forma cu cele n puncte din plan.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului text dreptc.in se găsesc două numere n maxc reprezentând numărul de puncte din plan și numărul de culori asociate punctelor. Pe următoarele n linii se citesc câte trei numere x y c reprezentând în ordine coordonata pe axa OX (abscisa), coordonata pe axa OY (ordonata) și codul culorii asociate punctului. Nu există două puncte cu aceleași coordonate.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire dreptc.out va conține un singur număr reprezentând numărul maxim de dreptunghiuri corecte.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 1000&lt;br /&gt;
* 1 ≤ C ≤ 5&lt;br /&gt;
* -1000 ≤ x , y ≤ 1000&lt;br /&gt;
* 40% din teste vor avea N ≤ 100&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; dreptc.in&lt;br /&gt;
 9 2&lt;br /&gt;
 3 10 1&lt;br /&gt;
 3 8 2&lt;br /&gt;
 3 6 1&lt;br /&gt;
 3 4 1&lt;br /&gt;
 3 0 1&lt;br /&gt;
 6 0 1&lt;br /&gt;
 6 4 1&lt;br /&gt;
 6 8 2&lt;br /&gt;
 6 10 1&lt;br /&gt;
; dreptc.out&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Vârfurile celor trei dreptunghiuri corecte sunt:&lt;br /&gt;
(3,0) (3,4) (6,4) (6,0)&lt;br /&gt;
(3,0) (3,10) (6,10) (6,0)&lt;br /&gt;
(3,6) (3,10) (6,10) (6,4).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def count_rectangles(points):&lt;br /&gt;
    n = len(points)&lt;br /&gt;
    rectangles = 0&lt;br /&gt;
&lt;br /&gt;
    # Generate all possible rectangles&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i + 1, n):&lt;br /&gt;
            # Check if the other two points of the potential rectangle exist and have the same color&lt;br /&gt;
            x1, y1, c1 = points[i]&lt;br /&gt;
            x2, y2, c2 = points[j]&lt;br /&gt;
            if (x1, y2, c1) in points and (x2, y1, c1) in points and c1 == c2:&lt;br /&gt;
                rectangles += 1&lt;br /&gt;
&lt;br /&gt;
    return rectangles // 2  # Each rectangle is counted twice, so we divide by 2&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Read input&lt;br /&gt;
    with open(&amp;quot;dreptc.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, maxc = map(int, fin.readline().split())&lt;br /&gt;
        points = [tuple(map(int, fin.readline().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # Count rectangles&lt;br /&gt;
    result = count_rectangles(points)&lt;br /&gt;
&lt;br /&gt;
    # Write output&lt;br /&gt;
    with open(&amp;quot;dreptc.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1228_-_SSK&amp;diff=10048</id>
		<title>1228 - SSK</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1228_-_SSK&amp;diff=10048"/>
		<updated>2024-06-03T17:35:50Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Manole a învățat de la profesorul de informatică cum să calculeze suma elementelor oricărei matrice A cu N linii și M coloane. El numerotează liniile de la 1 la N și coloanele de la 1 la M. Mai mult, Manole fiind extrem de pasionat de numere, va calcula sumele tuturor subtablourilor din cadrul matricei A. Șirul acestor sume îl scrie pe o hârtie, după ce l-a ordonat crescător.  Prin subtablou el înțelege o zonă dreptunghiulară din matricea A, iden...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Manole a învățat de la profesorul de informatică cum să calculeze suma elementelor oricărei matrice A cu N linii și M coloane. El numerotează liniile de la 1 la N și coloanele de la 1 la M. Mai mult, Manole fiind extrem de pasionat de numere, va calcula sumele tuturor subtablourilor din cadrul matricei A. Șirul acestor sume îl scrie pe o hârtie, după ce l-a ordonat crescător.&lt;br /&gt;
&lt;br /&gt;
Prin subtablou el înțelege o zonă dreptunghiulară din matricea A, identificată prin colțul stânga-sus (x1,y1) şi colţul dreapta-jos (x2,y2), elementele subtabloului fiind toate elementele A[i][j] pentru care x1≤i≤x2 şi y1≤j≤y2. Suma unui subtablou este suma tuturor elementelor sale.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieţi un program care, cunoscând valorile elementelor matricei A, determină al K-lea termen din șirul ordonat al sumelor tuturor subtablourilor matricei A.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ssk.in conţine pe prima linie numerele naturale N M K separate prin câte un spațiu, având semnificația din enunț. Pe următoarele N linii se află câte M numere naturale separate prin spaţii, reprezentând elementele matricei A.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire ssk.out va conține o singură linie pe care va fi scris un număr natural reprezentând răspunsul la cerinţă.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 150&lt;br /&gt;
* 1 ≤ M ≤ 150&lt;br /&gt;
* 1 ≤ K ≤ numărul de termeni din şirul ordonat&lt;br /&gt;
* 0 ≤ A[i][j] ≤ 1000 unde 1 ≤ i ≤ N și 1 ≤ j ≤ M&lt;br /&gt;
Numerotarea termenilor din şirul ordonat al sumelor tuturor subtablourilor se va face începând de la 1.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; ssk.in&lt;br /&gt;
 2 3 14&lt;br /&gt;
 3 2 7 &lt;br /&gt;
 4 1 0 &lt;br /&gt;
; ssk.out&lt;br /&gt;
 9&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Șirul ordonat al tuturor sumelor subtablourilor matricei este&lt;br /&gt;
&lt;br /&gt;
0 1 1 2 3 3 4 5 5 5 7 7 7 9 10 10 12 17&lt;br /&gt;
&lt;br /&gt;
A patrusprezecea sumă este 9.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def calculate_subtable_sums(matrix):&lt;br /&gt;
    n = len(matrix)&lt;br /&gt;
    m = len(matrix[0])&lt;br /&gt;
&lt;br /&gt;
    # Initialize the cumulative sum matrix&lt;br /&gt;
    cumulative_sum = [[0] * (m + 1) for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    # Calculate cumulative sum matrix&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            cumulative_sum[i][j] = matrix[i - 1][j - 1] + cumulative_sum[i - 1][j] + cumulative_sum[i][j - 1] - cumulative_sum[i - 1][j - 1]&lt;br /&gt;
&lt;br /&gt;
    # Calculate the sum of each subtable and store it in a list&lt;br /&gt;
    subtable_sums = []&lt;br /&gt;
    for i1 in range(1, n + 1):&lt;br /&gt;
        for j1 in range(1, m + 1):&lt;br /&gt;
            for i2 in range(i1, n + 1):&lt;br /&gt;
                for j2 in range(j1, m + 1):&lt;br /&gt;
                    subtable_sum = cumulative_sum[i2][j2] - cumulative_sum[i2][j1 - 1] - cumulative_sum[i1 - 1][j2] + cumulative_sum[i1 - 1][j1 - 1]&lt;br /&gt;
                    subtable_sums.append(subtable_sum)&lt;br /&gt;
&lt;br /&gt;
    # Sort the list of subtable sums&lt;br /&gt;
    subtable_sums.sort()&lt;br /&gt;
    &lt;br /&gt;
    return subtable_sums&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;ssk.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M, K = map(int, fin.readline().split())&lt;br /&gt;
        matrix = [list(map(int, fin.readline().split())) for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    # Calculate subtable sums&lt;br /&gt;
    subtable_sums = calculate_subtable_sums(matrix)&lt;br /&gt;
&lt;br /&gt;
    # Retrieve the K-th term&lt;br /&gt;
    kth_term = subtable_sums[K - 1]&lt;br /&gt;
&lt;br /&gt;
    # Write the result to the output file&lt;br /&gt;
    with open(&amp;quot;ssk.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(kth_term) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1190_-_Sipet&amp;diff=10046</id>
		<title>1190 - Sipet</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1190_-_Sipet&amp;diff=10046"/>
		<updated>2024-06-03T17:33:57Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Un arheolog a găsit un sipet interesant. După ce l-a deschis cu grijă, a constatat cu surprindere că sipetul conține bănuți de aur. Uitându-se mai atent a mai găsit ceva: un pergament ascuns într-un compartiment secret al sipetului, cu un text scris într-o limbă antică, pe care, din fericire, arheologul o cunoștea. Din text a reieșit că un grup de negustori foarte bogați a vrut să ascundă în mare secret averea breslei lor, formată din monede d...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Un arheolog a găsit un sipet interesant. După ce l-a deschis cu grijă, a constatat cu surprindere că sipetul conține bănuți de aur. Uitându-se mai atent a mai găsit ceva: un pergament ascuns într-un compartiment secret al sipetului, cu un text scris într-o limbă antică, pe care, din fericire, arheologul o cunoștea. Din text a reieșit că un grup de negustori foarte bogați a vrut să ascundă în mare secret averea breslei lor, formată din monede de aur, deoarece se prevestea un război cumplit. Negustorii știau că există șanse ca această comoară să fie găsită și confiscată de dușmani, deci s-au sfătuit cum e mai bine să procedeze, cum să ascundă comoara. Arheologul a reușit să deducă din text următoarele:&lt;br /&gt;
&lt;br /&gt;
a) Cele N monede, care formau averea breslei, au fost împărțite în maximum trei feluri de grămezi, formate din p1, p2 și p3 bănuți, p1, p2 și p3 fiind numere prime consecutive, p1&amp;lt;p2&amp;lt;p3. Fiecare grămadă a fost pusă în întregime într-un sipet.&lt;br /&gt;
b) Este posibil să existe 0 (zero) grămezi formate din p1 sau p2 sau p3 monede, scopul fiind să se obțină o împărțire în care numărul monedelor rămase nedistribuite să fie minim, iar dacă există mai multe posibilități, se alege aceea pentru care numărul de grămezi este mai mare. Dacă există mai multe astfel de soluții, se consideră corectă oricare dintre ele.&lt;br /&gt;
c) Monedele care nu au putut fi distribuite conform regulilor stabilite, au fost donate bisericii.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieți un program care determină numărul maxim S de sipete și numărul sipetelor cu p1, p2 respectiv p3 monede, precum și suma donată bisericii.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare sipet.in conține pe prima linie numărul natural T, iar pe următoarele T linii câte două numerele naturale N și p1, despărțite printr-un singur spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire sipet.out va conține pe prima linie pe primele T linii câte 5 numere naturale, separate prin câte un spațiu: S, x, y, z și r, reprezentând numărul maxim S de sipete, numărul x de sipete cu p1 monede, numărul y de sipete cu p2 monede, respectiv numărul z de sipete cu p3 monede și numărul r de monede donate bisericii, corespunzătoare datelor de intrare de pe linia T+1 a fișierului sipet.in. Dacă există mai multe soluții corecte, este acceptată oricare dintre ele.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 10.000.000&lt;br /&gt;
* 2 ≤ p1 &amp;lt; p2 &amp;lt; p3 ≤ N&lt;br /&gt;
* 1 ≤ T ≤ 10 – în fișierul de intrare nu vor fi mai mult de 10 perechi de numere N p1&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; sipet.in&lt;br /&gt;
 3&lt;br /&gt;
 15 5&lt;br /&gt;
 10 3&lt;br /&gt;
 41 11&lt;br /&gt;
; sipet.out&lt;br /&gt;
 3 3 0 0 0&lt;br /&gt;
 2 1 0 1 0 &lt;br /&gt;
 3 1 1 1 0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
* numărul maxim de sipete este 3, toate cu câte 3 monede;&lt;br /&gt;
* sau: 2 0 2 0 0 (1*3+1*7=2*5=10); (ambele soluții sunt corecte!)&lt;br /&gt;
* numărul maxim de sipete este 3; 1 sipet cu 11, unul cu 13 și unul cu 17 monede.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_prime(num):&lt;br /&gt;
    if num &amp;lt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(2, int(num ** 0.5) + 1):&lt;br /&gt;
        if num % i == 0:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def next_prime(num):&lt;br /&gt;
    while True:&lt;br /&gt;
        num += 1&lt;br /&gt;
        if is_prime(num):&lt;br /&gt;
            return num&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sipet.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        T = int(fin.readline())&lt;br /&gt;
        queries = [tuple(map(int, line.split())) for line in fin]&lt;br /&gt;
&lt;br /&gt;
    primes = [2, 3, 5]&lt;br /&gt;
    results = []&lt;br /&gt;
&lt;br /&gt;
    for N, p1 in queries:&lt;br /&gt;
        p2 = next_prime(p1)&lt;br /&gt;
        p3 = next_prime(p2)&lt;br /&gt;
&lt;br /&gt;
        remaining_coins = N - p1 - p2 - p3&lt;br /&gt;
&lt;br /&gt;
        # Calculate the number of coins for each pile&lt;br /&gt;
        x = (remaining_coins // p1) + 1&lt;br /&gt;
        y = (remaining_coins // p2) + 1&lt;br /&gt;
        z = (remaining_coins // p3) + 1&lt;br /&gt;
&lt;br /&gt;
        # Calculate the number of satchels&lt;br /&gt;
        S = min(x, y, z)&lt;br /&gt;
        &lt;br /&gt;
        # Calculate the remaining coins after distributing them into piles&lt;br /&gt;
        remaining_coins -= (S - 1) * min(p1, p2, p3)&lt;br /&gt;
&lt;br /&gt;
        # Calculate the number of coins donated to the church&lt;br /&gt;
        r = max(remaining_coins, 0)&lt;br /&gt;
&lt;br /&gt;
        results.append((S, x, y, z, r))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sipet.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, result)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1206_-_Placa&amp;diff=10044</id>
		<title>1206 - Placa</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1206_-_Placa&amp;diff=10044"/>
		<updated>2024-06-03T17:30:27Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Un gard este format din mai multe plăci dreptunghiulare. Fiecare placă este, la rândul ei, construită din NxM cărămizi. Una dintre plăci ridică o problemă, deoarece este deteriorată. Placa este reprezentată pe hârtie cu ajutorul unei matrice cu N linii și M coloane, numerotate de la 1 la N, respectiv de la 1 la M. Matricea conține doar valori 0 și 1, și respectă următoarele reguli:  * un element egal cu 1 indică prezența în aceea poziție a un...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Un gard este format din mai multe plăci dreptunghiulare. Fiecare placă este, la rândul ei, construită din NxM cărămizi. Una dintre plăci ridică o problemă, deoarece este deteriorată. Placa este reprezentată pe hârtie cu ajutorul unei matrice cu N linii și M coloane, numerotate de la 1 la N, respectiv de la 1 la M. Matricea conține doar valori 0 și 1, și respectă următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
* un element egal cu 1 indică prezența în aceea poziție a unei cărămizi, iar un element egal cu 0 indică absența ei;&lt;br /&gt;
* linia 1 și linia N conțin numai valori egale cu 1, pentru că marginea de sus și cea de jos a plăcii este intactă;&lt;br /&gt;
* din orice element egal cu 1, situat în interiorul matricei, se poate ajunge pe linia 1 sau pe linia N sau pe amândouă, mergând doar în sus sau doar în jos, parcurgând numai valorile egale cu 1;&lt;br /&gt;
* există cel puțin o coloană stabilă (formată numai din elemente egale cu 1).&lt;br /&gt;
Se dorește modificarea plăcii și pentru aceasta se pot șterge din matrice maximum K coloane alăturate. După ștergere se alipesc coloanele rămase și se deplasează pe verticală partea de sus a plăcii spre cea de jos, până când se va forma o coloană stabilă.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine înălțimea minimă Hmin pe care o poate avea placa ștergând cel mult K coloane alăturate. Identificați numărul minim de coloane alăturate care trebuie șterse pentru a obține înălțimea Hmin.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Din fișierul placa.in se citesc de pe prima linie 3 numere naturale N, M, K separate prin câte un spațiu, având semnificația din enunț. Pe fiecare dintre următoarele M linii ale fișierului se găsesc perechi de numere naturale N1, N2, separate printr-un spațiu. Astfel pe linia i+1 a fișierului de intrare numărul N1 reprezintă numărul de elemente de 1 situate pe coloana i, începând cu linia 1, deplasându-ne în „jos” până la întâlnirea unei valori egale cu 0, sau până se ajunge pe linia N; numărul N2 reprezintă numărul de elemente de 1 situate pe coloana i, începând cu linia N, deplasându-ne în „sus” până la întâlnirea unei valori egale cu 0, sau până se ajunge pe linia 1.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul placa.out se va scrie pe prima linie înălțimea minimă cerută Hmin, iar pe a doua linie numărul minim de coloane ce trebuie eliminate pentru a obține înălțimea Hmin.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100.000; 1 ≤ M ≤ 100.000; 1 ≤ K &amp;lt; M;&lt;br /&gt;
* se garantează că pe liniile ce conțin informații referitoare la cele M coloane ale matricei există cel puțin o linie pe care se află valoarea N de 2 ori, în rest suma celor două valori este strict mai mică decât N;&lt;br /&gt;
* toate valorile din fișier sunt strict pozitive;&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; placa.in&lt;br /&gt;
 5 6 3&lt;br /&gt;
 1 1&lt;br /&gt;
 2 1&lt;br /&gt;
 1 2&lt;br /&gt;
 5 5&lt;br /&gt;
 1 3&lt;br /&gt;
 1 1&lt;br /&gt;
; placa.out&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Matricea inițială:&lt;br /&gt;
&lt;br /&gt;
  1 1 1 1 1 1&lt;br /&gt;
  0 1 0 1 0 0&lt;br /&gt;
  0 0 0 1 1 0&lt;br /&gt;
  0 0 1 1 1 0&lt;br /&gt;
  1 1 1 1 1 1&lt;br /&gt;
Înălțimea minimă este 3 și se poate obține eliminând, de exemplu, coloanele 3, 4, 5 rezultând matricea:&lt;br /&gt;
&lt;br /&gt;
  1 1 1&lt;br /&gt;
  0 1 0&lt;br /&gt;
  1 1 1&lt;br /&gt;
O altă modalitate de a obține aceeași înălțime dar prin ștergerea unui număr minim de coloane (4 și 5) conduce la:&lt;br /&gt;
&lt;br /&gt;
  1 1 1 1&lt;br /&gt;
  0 1 1 0&lt;br /&gt;
  1 1 1 1&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def can_obtain_height(board, k, height):&lt;br /&gt;
    n, m = len(board), len(board[0])&lt;br /&gt;
    &lt;br /&gt;
    # Numărăm coloanele consecutive cu 0 de la început și sfârșit&lt;br /&gt;
    zeros_left = [0] * m&lt;br /&gt;
    zeros_right = [0] * m&lt;br /&gt;
    &lt;br /&gt;
    for j in range(m):&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if board[i][j] == 1:&lt;br /&gt;
                break&lt;br /&gt;
            zeros_left[j] += 1&lt;br /&gt;
        &lt;br /&gt;
        for i in range(n - 1, -1, -1):&lt;br /&gt;
            if board[i][j] == 1:&lt;br /&gt;
                break&lt;br /&gt;
            zeros_right[j] += 1&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm dacă putem elimina cel mult k coloane pentru a obține înălțimea height&lt;br /&gt;
    for j in range(1, m):&lt;br /&gt;
        if zeros_left[j] + zeros_right[j] &amp;gt;= height:&lt;br /&gt;
            continue&lt;br /&gt;
        removed = 0&lt;br /&gt;
        for jj in range(j, min(j + k, m)):&lt;br /&gt;
            removed += min(zeros_left[jj], height - zeros_right[jj])&lt;br /&gt;
            if removed &amp;gt; k:&lt;br /&gt;
                break&lt;br /&gt;
        if removed &amp;lt;= k:&lt;br /&gt;
            return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def min_height(board, k):&lt;br /&gt;
    low, high = 2, len(board)&lt;br /&gt;
    while low &amp;lt; high:&lt;br /&gt;
        mid = (low + high) // 2&lt;br /&gt;
        if can_obtain_height(board, k, mid):&lt;br /&gt;
            high = mid&lt;br /&gt;
        else:&lt;br /&gt;
            low = mid + 1&lt;br /&gt;
    return low&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;placa.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M, K = map(int, fin.readline().split())&lt;br /&gt;
        board = [list(map(int, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
&lt;br /&gt;
    min_h = min_height(board, K)&lt;br /&gt;
&lt;br /&gt;
    removed_cols = min(K, max(0, min_h - 2))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;placa.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{min_h}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{removed_cols}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1104_-_Qvect&amp;diff=10042</id>
		<title>1104 - Qvect</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1104_-_Qvect&amp;diff=10042"/>
		<updated>2024-06-03T17:27:38Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se consideră N vectori cu elemente întregi, numerotați de la 1 la N, sortați crescător, fiecare vector având un număr precizat de elemente. == Cerinţa == Să se răspundă la Q întrebări de tipul: a) 1 i j, cu semnificaţia: care este minimul dintre modulele diferențelor oricăror două elemente, primul element aparținând vectorului numerotat cu i, iar cel de al doilea element aparținând vectorului numerotat cu j ? b) 2 i j, cu semnificația: care e...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se consideră N vectori cu elemente întregi, numerotați de la 1 la N, sortați crescător, fiecare vector având un număr precizat de elemente.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se răspundă la Q întrebări de tipul:&lt;br /&gt;
a) 1 i j, cu semnificaţia: care este minimul dintre modulele diferențelor oricăror două elemente, primul element aparținând vectorului numerotat cu i, iar cel de al doilea element aparținând vectorului numerotat cu j ?&lt;br /&gt;
b) 2 i j, cu semnificația: care este valoarea ce se găsește pe poziția mediană în vectorul obținut prin interclasarea vectorilor având numerele de ordine i,i+1,…,j (i&amp;lt;j).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare qvect.in conţine pe prima linie două numerele naturale N Q, separate printr-un spațiu, ce reprezintă numărul de vectori, respectiv numărul de întrebări.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare dintre următoarele N linii se găsește descrierea unui vector sub forma: k a1 a2 … ak, unde k reprezintă numărul de elemente, iar a1 a2 … ak reprezintă elementele vectorului, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare dintre următoarele Q linii se găsește descrierea unei întrebări sub forma unui triplet de numere naturale: t i j, separate prin câte un spațiu, unde t reprezintă tipul întrebării şi poate lua numai valorile 1 sau 2, iar i și j au semnificația precizată în cerinţă.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire qvect.out va conţine Q numere întregi, câte unul pe linie, reprezentând în ordine, răspunsurile la cele Q întrebări.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N, i, j ≤ 100&lt;br /&gt;
* 1 ≤ Q ≤ 1000&lt;br /&gt;
* 1 ≤ t ≤ 2&lt;br /&gt;
* 1 ≤ k ≤ 5000&lt;br /&gt;
* -1 000 000 000 ≤ ap ≤ 1 000 000 000&lt;br /&gt;
* Prin valoarea aflată pe poziția mediană a unui vector a cu k elemente se înțelege valoarea elementului situat pe poziţia [k/2], adică partea întreagă a lui k / 2.&lt;br /&gt;
* 15% dintre teste vor conține numai întrebări de tipul 1&lt;br /&gt;
* 15% dintre teste vor conține numai întrebări de tipul 2&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; qvect.in&lt;br /&gt;
 3 3&lt;br /&gt;
 7 1 4 5 8 11 18 19&lt;br /&gt;
 6 2 4 5 10 21 29&lt;br /&gt;
 4 13 14 15 15&lt;br /&gt;
 2 2 3&lt;br /&gt;
 1 2 3&lt;br /&gt;
 2 1 3&lt;br /&gt;
; qvect.out&lt;br /&gt;
 13&lt;br /&gt;
 3&lt;br /&gt;
 10&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Prima întrebare este de tipul 2. Vectorul nou obținut prin interclasarea vectorilor numerotați cu 2 și cu 3 este următorul: 2,4,5,10,13,14,15,15,21,29 și conține 6+4=10 elemente, valoarea elementului median este 13&lt;br /&gt;
&lt;br /&gt;
A doua întrebare este de tipul 1. Diferența minimă se obține pentru perechea (10,13), unde valoarea 10 aparține vectorului numerotat cu 2, iar valoarea 13 aparține vectorului numerotat cu 3.&lt;br /&gt;
&lt;br /&gt;
A treia întrebare este de tipul 2. Poziția mediană în vectorul nou obținut prin interclasare este (7+6+4)/2 = 8, deci valoarea ce se găsește pe poziția mediană este 10.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def find_min_difference(vector1, vector2):&lt;br /&gt;
    min_diff = float(&#039;inf&#039;)&lt;br /&gt;
    i, j = 0, 0&lt;br /&gt;
    while i &amp;lt; len(vector1) and j &amp;lt; len(vector2):&lt;br /&gt;
        diff = abs(vector1[i] - vector2[j])&lt;br /&gt;
        min_diff = min(min_diff, diff)&lt;br /&gt;
        if vector1[i] &amp;lt; vector2[j]:&lt;br /&gt;
            i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            j += 1&lt;br /&gt;
    return min_diff&lt;br /&gt;
&lt;br /&gt;
def merge_and_find_median(vector1, vector2):&lt;br /&gt;
    merged_vector = []&lt;br /&gt;
    i, j = 0, 0&lt;br /&gt;
    while i &amp;lt; len(vector1) and j &amp;lt; len(vector2):&lt;br /&gt;
        if vector1[i] &amp;lt; vector2[j]:&lt;br /&gt;
            merged_vector.append(vector1[i])&lt;br /&gt;
            i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            merged_vector.append(vector2[j])&lt;br /&gt;
            j += 1&lt;br /&gt;
    merged_vector.extend(vector1[i:])&lt;br /&gt;
    merged_vector.extend(vector2[j:])&lt;br /&gt;
    median_index = len(merged_vector) // 2&lt;br /&gt;
    return merged_vector[median_index]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;qvect.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, Q = map(int, fin.readline().split())&lt;br /&gt;
        vectors = [list(map(int, fin.readline().split()))[1:] for _ in range(N)]&lt;br /&gt;
        queries = [tuple(map(int, fin.readline().split())) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;qvect.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for query in queries:&lt;br /&gt;
            t, i, j = query&lt;br /&gt;
            if t == 1:&lt;br /&gt;
                min_diff = find_min_difference(vectors[i-1], vectors[j-1])&lt;br /&gt;
                fout.write(f&amp;quot;{min_diff}\n&amp;quot;)&lt;br /&gt;
            elif t == 2:&lt;br /&gt;
                median = merge_and_find_median(vectors[i-1], vectors[j-1])&lt;br /&gt;
                fout.write(f&amp;quot;{median}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3562_-_Momente&amp;diff=10040</id>
		<title>3562 - Momente</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3562_-_Momente&amp;diff=10040"/>
		<updated>2024-06-03T17:23:07Z</updated>

		<summary type="html">&lt;p&gt;AjM: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
G are un ceas digital care afișează ora printr-o valoare între 0 și 23 sub forma unui număr de una sau două&lt;br /&gt;
cifre, minutul printr-o valoare între 0 și 59 sub forma unui număr de exact două cifre (prima cifră este 0 dacă numărul de minute care trebuie afișat este mai mic decât 10) și secunda printr-o valoare între 0 și 59 sub forma unui număr de exact două cifre (dacă numărul de secunde care trebuie afișat este mai mic decât 10, atunci prima cifră este 0). Aceste informaţii apar în ordinea: numărul de ore, numărul de minute, numărul de secunde şi sunt separate prin câte un spaţiu. Exemple: 23 39 17(pentru ora 23, 39 minute şi 17 secunde), 1 00 01(pentru ora 1, 0 minute şi o secundă) sau 0 02 02(pentru ora 0, 2 minute şi 2 secunde).&lt;br /&gt;
&lt;br /&gt;
G observă că dacă alătură aceste trei valori poate construi un număr natural. Asfel, pentru exemplele de mai&lt;br /&gt;
sus obține numerele 233917, 10001 și respectiv 202 (Atenție! Numărul rezultat nu începe cu 0 – eventualele cifre nule aflate la începutul lui sunt eliminate!). G mai observă că există momente de timp, când numărul astfel format este un palindrom, cum este cazul celui de-al doilea şi celui de-al treilea exemplu. G denumește aceste momente de timp momente palindromice și dorește să afle câte astfel de momente sunt într-un interval de timp dat.&lt;br /&gt;
&lt;br /&gt;
Un interval de timp este situat pe parcursul anului 2013 fiind precizat prin data și ora exactă când începe și&lt;br /&gt;
data și ora exactă când se termină. Data este precizată prin două numere care reprezintă luna și ziua, iar ora exactă sub forma afișată de ceasul digital al lui G.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Determinați câte momente palidromice au loc în k intervale de timp date.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare momente.in conține pe prima linie numărul natural k cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare dintre următoarele k linii se află câte 10 valori naturale separate prin câte un spațiu. Primele cinci numere reprezintă luna, ziua, ora, minutul și secunda când începe intervalul de timp dat. Următoarele cinci numere reprezintă luna, ziua, ora, minutul și secunda când se termină intervalul de timp dat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire momente.out va conține pe prima linie numărul S, reprezentând suma numerelor de pe a doua linie a fișierului de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* k ≤ 100.000&lt;br /&gt;
* data de început precede data de sfârşit pentru fiecare interval de timp;&lt;br /&gt;
* în anul 2013 luna februarie are 28 zile;&lt;br /&gt;
* pentru 50% dintre teste vom avea k = 1;&lt;br /&gt;
* se numeşte palindrom un număr care citit de la stânga la dreapta sau de la dreapta la stânga are aceeaşi valoare;&lt;br /&gt;
* dacă intervalul de timp considerat începe sau se termină cu un moment palindromic, acesta este numărat.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; momente.in&lt;br /&gt;
 1&lt;br /&gt;
 2 28 23 44 32 3 1 0 02 02&lt;br /&gt;
; momente.out&lt;br /&gt;
 24&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Fişierul de intrare conţine un singur interval de timp, între 28 februarie ora 23, 44 minute şi 32 secunde şi 1 martie ora 0, 2 minute şi 2 secunde. În acest interval de timp sunt 24 momente palindomice după cum urmeaza:&lt;br /&gt;
- în data de 28 februarie la orele 23 44 32 şi 23 55 32&lt;br /&gt;
- în data de 1 martie la orele 0 00 00, 0 00 01, 0 00 02, 0 00 03, 0 00 04, 0 00 05, 0 00 06, 0 00 07, 0 00 08, 0 00 09, 0 00 11, 0 00 22, 0 00 33, 0 00 44, 0 00 55, 0 01 01, 0 01 11, 0 01 21, 0 01 31, 0 01 41, 0 01 51 şi 0 02 02.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_palindrome(num):&lt;br /&gt;
    # Convertim numărul în șir de caractere&lt;br /&gt;
    num_str = str(num)&lt;br /&gt;
    # Verificăm dacă șirul de caractere este egal cu oglinditul său&lt;br /&gt;
    return num_str == num_str[::-1]&lt;br /&gt;
&lt;br /&gt;
def count_palindromic_moments(start_month, start_day, start_hour, start_minute, start_second,&lt;br /&gt;
                              end_month, end_day, end_hour, end_minute, end_second):&lt;br /&gt;
    # Inițializăm numărul de momente palindromice&lt;br /&gt;
    count = 0&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem intervalul de timp și numărăm momentele palindromice&lt;br /&gt;
    for hour in range(start_hour, end_hour + 1):&lt;br /&gt;
        for minute in range(start_minute, end_minute + 1):&lt;br /&gt;
            for second in range(start_second, end_second + 1):&lt;br /&gt;
                # Verificăm dacă momentul curent este palindromic&lt;br /&gt;
                if is_palindrome(int(str(hour) + str(minute).zfill(2) + str(second).zfill(2))):&lt;br /&gt;
                    count += 1&lt;br /&gt;
    &lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;momente.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        k = int(fin.readline())&lt;br /&gt;
        intervals = [tuple(map(int, fin.readline().split())) for _ in range(k)]&lt;br /&gt;
&lt;br /&gt;
    # Inițializăm suma momentelor palindromice&lt;br /&gt;
    total_palindromic_moments = 0&lt;br /&gt;
&lt;br /&gt;
    # Calculăm numărul de momente palindromice pentru fiecare interval de timp&lt;br /&gt;
    for interval in intervals:&lt;br /&gt;
        total_palindromic_moments += count_palindromic_moments(*interval)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;momente.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(total_palindromic_moments) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3562_-_Momente&amp;diff=10039</id>
		<title>3562 - Momente</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3562_-_Momente&amp;diff=10039"/>
		<updated>2024-06-03T17:22:46Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == G are un ceas digital care afișează ora printr-o valoare între 0 și 23 sub forma unui număr de una sau două cifre, minutul printr-o valoare între 0 și 59 sub forma unui număr de exact două cifre (prima cifră este 0 dacă numărul de minute care trebuie afișat este mai mic decât 10) și secunda printr-o valoare între 0 și 59 sub forma unui număr de exact două cifre (dacă numărul de secunde care trebuie afișat este mai mic decât 10, atunci prima...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
G are un ceas digital care afișează ora printr-o valoare între 0 și 23 sub forma unui număr de una sau două&lt;br /&gt;
cifre, minutul printr-o valoare între 0 și 59 sub forma unui număr de exact două cifre (prima cifră este 0 dacă numărul de minute care trebuie afișat este mai mic decât 10) și secunda printr-o valoare între 0 și 59 sub forma unui număr de exact două cifre (dacă numărul de secunde care trebuie afișat este mai mic decât 10, atunci prima cifră este 0). Aceste informaţii apar în ordinea: numărul de ore, numărul de minute, numărul de secunde şi sunt separate prin câte un spaţiu. Exemple: 23 39 17(pentru ora 23, 39 minute şi 17 secunde), 1 00 01(pentru ora 1, 0 minute şi o secundă) sau 0 02 02(pentru ora 0, 2 minute şi 2 secunde).&lt;br /&gt;
&lt;br /&gt;
G observă că dacă alătură aceste trei valori poate construi un număr natural. Asfel, pentru exemplele de mai&lt;br /&gt;
sus obține numerele 233917, 10001 și respectiv 202 (Atenție! Numărul rezultat nu începe cu 0 – eventualele cifre nule aflate la începutul lui sunt eliminate!). G mai observă că există momente de timp, când numărul astfel format este un palindrom, cum este cazul celui de-al doilea şi celui de-al treilea exemplu. G denumește aceste momente de timp momente palindromice și dorește să afle câte astfel de momente sunt într-un interval de timp dat.&lt;br /&gt;
&lt;br /&gt;
Un interval de timp este situat pe parcursul anului 2013 fiind precizat prin data și ora exactă când începe și&lt;br /&gt;
data și ora exactă când se termină. Data este precizată prin două numere care reprezintă luna și ziua, iar ora exactă sub forma afișată de ceasul digital al lui G.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Determinați câte momente palidromice au loc în k intervale de timp date.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare momente.in conține pe prima linie numărul natural k cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare dintre următoarele k linii se află câte 10 valori naturale separate prin câte un spațiu. Primele cinci numere reprezintă luna, ziua, ora, minutul și secunda când începe intervalul de timp dat. Următoarele cinci numere reprezintă luna, ziua, ora, minutul și secunda când se termină intervalul de timp dat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire momente.out va conține pe prima linie numărul S, reprezentând suma numerelor de pe a doua linie a fișierului de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* k ≤ 100.000&lt;br /&gt;
* data de început precede data de sfârşit pentru fiecare interval de timp;&lt;br /&gt;
* în anul 2013 luna februarie are 28 zile;&lt;br /&gt;
* pentru 50% dintre teste vom avea k = 1;&lt;br /&gt;
* se numeşte palindrom un număr care citit de la stânga la dreapta sau de la dreapta la stânga are aceeaşi valoare;&lt;br /&gt;
* dacă intervalul de timp considerat începe sau se termină cu un moment palindromic, acesta este numărat.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; momente.in&lt;br /&gt;
 1&lt;br /&gt;
 2 28 23 44 32 3 1 0 02 02&lt;br /&gt;
; momente.out&lt;br /&gt;
 24&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Fişierul de intrare conţine un singur interval de timp, între 28 februarie ora 23, 44 minute şi 32 secunde şi 1 martie ora 0, 2 minute şi 2 secunde. În acest interval de timp sunt 24 momente palindomice după cum urmeaza:&lt;br /&gt;
- în data de 28 februarie la orele 23 44 32 şi 23 55 32&lt;br /&gt;
- în data de 1 martie la orele 0 00 00, 0 00 01, 0 00 02, 0 00 03, 0 00 04, 0 00 05, 0 00 06, 0 00 07, 0 00 08, 0 00 09, 0 00 11, 0 00 22, 0 00 33, 0 00 44, 0 00 55, 0 01 01, 0 01 11, 0 01 21, 0 01 31, 0 01 41, 0 01 51 şi 0 02 02.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1781_-_Intersectii&amp;diff=10038</id>
		<title>1781 - Intersectii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1781_-_Intersectii&amp;diff=10038"/>
		<updated>2024-06-03T17:20:52Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Dreptunghiul ABCD are laturile de lungimi w şi h, numere naturale pare. Acest dreptunghi este desenat pe o foaie de matematică şi este descompus în w ∙ h pătrate de latură 1. Vârfurile A, B, C şi D sunt plasate în colţurile unor pătrate de latură 1. Se alege un punct P din interiorul dreptunghiului ABCD, situat în colţul unui pătrat de latură 1 şi se uneşte prin segmente de dreaptă cu cele patru colţuri ale dreptunghiului. Unele segmente inte...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Dreptunghiul ABCD are laturile de lungimi w şi h, numere naturale pare. Acest dreptunghi este desenat pe o foaie de matematică şi este descompus în w ∙ h pătrate de latură 1. Vârfurile A, B, C şi D sunt plasate în colţurile unor pătrate de latură 1. Se alege un punct P din interiorul dreptunghiului ABCD, situat în colţul unui pătrat de latură 1 şi se uneşte prin segmente de dreaptă cu cele patru colţuri ale dreptunghiului. Unele segmente intersectează pătrate de latură 1 în exact două puncte distincte, altele într-un singur punct.&lt;br /&gt;
Numim pătrat 2-intersectat, un pătrat de latură 1 intersectat de un segment în exact 2 puncte distincte.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dau două numere naturale w şi h reprezentând lungimile laturilor dreptunghiului ABCD, un număr natural n şi n numere naturale x1, x2,… xn cu propietatea din enunt. Punctul P se plasează, pe rând, în toate punctele interioare dreptunghiului ABCD care sunt colţuri ale unor pătrate de latură 1. Pentru fiecare valoare x[i] (1 ≤ i ≤ n), determinaţi numărul de segmente distincte care trec prin exact x[i] pătrate 2-intersectate.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare intersectii.in conţine pe prima linie trei numere naturale w, h (reprezentând dimensiunile dreptunghiului) şi n. Următoarele n linii conţin câte un număr natural x[i] cu semnificaţia de mai sus.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire intersectii.out va conţine n linii. Pe fiecare linie i va fi scris numărul de segmente care trec prin exact x[i] pătrate 2-intersectate, obţinute după plasarea punctului P în fiecare colţ al unui pătrat de latură 1 din interiorul dreptunghiului ABCD.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ w , h ≤ 2000 numere naturale pare;&lt;br /&gt;
* 2 ≤ n ≤ 100000;&lt;br /&gt;
* punctul P se alege doar în interiorul dreptunghiului;&lt;br /&gt;
* pentru 40% din teste 2 ≤ w, n, h ≤ 500.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; intersectii.in&lt;br /&gt;
 4 6 2&lt;br /&gt;
3&lt;br /&gt;
5&lt;br /&gt;
; intersectii.out&lt;br /&gt;
 12&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Se pot obţine 12 segmente care trec prin exact 3 pătrate 2-intersectate şi 4 segmente care trec prin exact 3 pătrate 2-intersectate.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def count_intersected_squares(w, h):&lt;br /&gt;
    # Calculăm numărul de pătrate 2-intersectate pentru fiecare punct P&lt;br /&gt;
    return (w - 1) * (h - 1) * 2&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;intersectii.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        w, h, n = map(int, fin.readline().split())&lt;br /&gt;
        x_values = [int(fin.readline()) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # Calculăm numărul de pătrate 2-intersectate pentru dreptunghi&lt;br /&gt;
    num_intersected_squares = count_intersected_squares(w, h)&lt;br /&gt;
&lt;br /&gt;
    # Calculăm numărul de segmente care trec prin fiecare x[i] pătrate 2-intersectate&lt;br /&gt;
    results = [x * num_intersected_squares for x in x_values]&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatele în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;intersectii.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(&amp;quot;\n&amp;quot;.join(map(str, results)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1758_-_Bile_3&amp;diff=10035</id>
		<title>1758 - Bile 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1758_-_Bile_3&amp;diff=10035"/>
		<updated>2024-06-03T17:17:40Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Matei a inventat un nou joc cu bile. Terenul de joc este o tablă dreptunghiulară aşezată vertical. Tabla este împărţită în m*n celule, aşezate în m linii şi n coloane. În unele dintre celule se află obstacole.  De sus, din celulele aflate pe prima linie, sunt lăsate să cadă bile. Bilele cad vertical până la întâlnirea unui obstacol sau până în celula cea mai de jos din coloana pe care se află. Prima bilă care loveşte un obstacol se depla...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Matei a inventat un nou joc cu bile. Terenul de joc este o tablă dreptunghiulară aşezată vertical. Tabla este împărţită în m*n celule, aşezate în m linii şi n coloane. În unele dintre celule se află obstacole.&lt;br /&gt;
&lt;br /&gt;
De sus, din celulele aflate pe prima linie, sunt lăsate să cadă bile. Bilele cad vertical până la întâlnirea unui obstacol sau până în celula cea mai de jos din coloana pe care se află. Prima bilă care loveşte un obstacol se deplasează pe orizontală în coloana alăturată din stânga, apoi îşi continuă căderea. Fiecare dintre celelalte bile care lovesc acelaşi obstacol se deplasează pe orizontală, în coloana alăturată, dar în direcţie opusă faţă de bila care a lovit acest obstacol exact înaintea lor, apoi îşi continuă căderea.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând numărul de bile lăsate să cadă de pe fiecare celulă a primei linii şi poziţia obstacolelor, determinaţi numărul de bile ajunse în fiecare celulă a ultimei linii. Poziţiile obstacolelor sunt indicate prin linia şi coloana lor (colţul din stânga sus corespunde liniei 1 şi coloanei 1).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul bile.in conţine pe prima linie, separate prin câte un spaţiu, numerele naturale m, n şi p (numărul de linii, numărul de coloane şi numărul de obstacole). Următoarele p linii conţin câte două numere, separate de câte un spaţiu, reprezentând poziţiile celor p obstacole. Ultimele n linii conţin câte un număr natural, reprezentând numărul bilelor lansate din fiecare celulă a primei linii (începând cu prima celulă de pe linie).&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire bile.out va conţine n linii cu câte un număr, acesta reprezentând numărul de bile din fiecare celulă a ultimei linii (începând cu prima celulă de pe această linie).&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ m,n ≤ 2000&lt;br /&gt;
* 0 ≤ p ≤ 10.000&lt;br /&gt;
* Se lansează maximum 1000 de bile din fiecare celulă;&lt;br /&gt;
* Pe prima şi ultima linie, respectiv prima şi ultima coloană, nu există obstacole;&lt;br /&gt;
* Nu există două obstacole alăturate pe linie, coloană sau diagonală.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; bile.in&lt;br /&gt;
 6 7 5&lt;br /&gt;
 2 3&lt;br /&gt;
 2 5&lt;br /&gt;
 4 2&lt;br /&gt;
 4 4&lt;br /&gt;
 5 6&lt;br /&gt;
 4&lt;br /&gt;
 6&lt;br /&gt;
 4&lt;br /&gt;
 5&lt;br /&gt;
 8&lt;br /&gt;
 3&lt;br /&gt;
 5 &lt;br /&gt;
; bile.out&lt;br /&gt;
 8&lt;br /&gt;
 0&lt;br /&gt;
 10&lt;br /&gt;
 0&lt;br /&gt;
 9&lt;br /&gt;
 0&lt;br /&gt;
 8&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def simulate_balls(m, n, p, obstacles, balls):&lt;br /&gt;
    # Inițializăm matricea pentru terenul de joc&lt;br /&gt;
    board = [[0] * n for _ in range(m)]&lt;br /&gt;
    &lt;br /&gt;
    # Adăugăm obstacolele pe tablă&lt;br /&gt;
    for obstacle in obstacles:&lt;br /&gt;
        x, y = obstacle&lt;br /&gt;
        board[x - 1][y - 1] = 1&lt;br /&gt;
    &lt;br /&gt;
    # Inițializăm vectorul pentru bilele lăsate să cadă de pe prima linie&lt;br /&gt;
    first_row_balls = balls&lt;br /&gt;
    &lt;br /&gt;
    # Iterăm prin fiecare coloană, de la stânga la dreapta&lt;br /&gt;
    for j in range(n):&lt;br /&gt;
        # Numărăm câte bile au ajuns în fiecare celulă de pe ultima linie&lt;br /&gt;
        for i in range(m):&lt;br /&gt;
            if i == m - 1:&lt;br /&gt;
                # Dacă suntem pe ultima linie, adăugăm numărul de bile lăsate să cadă din coloana j&lt;br /&gt;
                board[i][j] += first_row_balls[j]&lt;br /&gt;
            else:&lt;br /&gt;
                # Dacă nu suntem pe ultima linie, simulăm căderea bilelor&lt;br /&gt;
                if board[i][j] &amp;gt; 0:&lt;br /&gt;
                    # Bila va cădea în jos până întâlnește un obstacol sau ajunge pe ultima linie&lt;br /&gt;
                    k = i + 1&lt;br /&gt;
                    while k &amp;lt; m and board[k][j] == 0:&lt;br /&gt;
                        k += 1&lt;br /&gt;
                    # Dacă am întâlnit un obstacol, bilele se vor deplasa pe orizontală&lt;br /&gt;
                    if k &amp;lt; m:&lt;br /&gt;
                        if j &amp;gt; 0 and board[k][j - 1] == 1:&lt;br /&gt;
                            board[k][j - 1] += board[i][j]&lt;br /&gt;
                        if j &amp;lt; n - 1 and board[k][j + 1] == 1:&lt;br /&gt;
                            board[k][j + 1] += board[i][j]&lt;br /&gt;
                    else:&lt;br /&gt;
                        # Dacă am ajuns pe ultima linie, adăugăm bilele în acea celulă&lt;br /&gt;
                        board[k - 1][j] += board[i][j]&lt;br /&gt;
    &lt;br /&gt;
    # Extragem numărul de bile din fiecare celulă de pe ultima linie&lt;br /&gt;
    last_row_balls = board[-1]&lt;br /&gt;
    &lt;br /&gt;
    return last_row_balls&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;bile.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        m, n, p = map(int, fin.readline().split())&lt;br /&gt;
        obstacles = [tuple(map(int, fin.readline().split())) for _ in range(p)]&lt;br /&gt;
        balls = [int(fin.readline()) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # Simulăm căderea bilelor&lt;br /&gt;
    last_row_balls = simulate_balls(m, n, p, obstacles, balls)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;bile.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(&amp;quot;\n&amp;quot;.join(map(str, last_row_balls)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3577_-_Origami_1&amp;diff=10032</id>
		<title>3577 - Origami 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3577_-_Origami_1&amp;diff=10032"/>
		<updated>2024-06-03T17:14:03Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Costel este pasionat de arta orientală a confecţionării obiectelor de hârtie, origami, dar este abia la început şi trebuie să se familiarizeze cu operaţiile de îndoire corectă a hârtiei. El are la dispoziţie o foaie de hârtie pătrată, ruptă dintr-un caiet de matematică, având dimensiunea de exact N x N pătrăţele. Îndoiturile trebuie realizate exact pe o linie orizontală sau verticală. Sunt permise două tipuri de îndoituri:  îndoitura de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Costel este pasionat de arta orientală a confecţionării obiectelor de hârtie, origami, dar este abia la început şi trebuie să se familiarizeze cu operaţiile de îndoire corectă a hârtiei. El are la dispoziţie o foaie de hârtie pătrată, ruptă dintr-un caiet de matematică, având dimensiunea de exact N x N pătrăţele. Îndoiturile trebuie realizate exact pe o linie orizontală sau verticală.&lt;br /&gt;
Sunt permise două tipuri de îndoituri:&lt;br /&gt;
&lt;br /&gt;
îndoitura de tipul 1, îndoitură verticală executată la X pătrăţele faţă de marginea stângă a foii: partea din stânga a foii se pliază către dreapta, de-a lungul liniei verticale aflate la distanţa de X pătrăţele faţă de marginea stângă;&lt;br /&gt;
îndoitura de tipul 2, îndoitură orizontală executată la X pătrăţele faţă de marginea superioară a foii: partea de sus a foii se pliază în jos, de-a lungul liniei aflate la distanţa de X pătrăţele faţă de marginea de sus a hârtiei.&lt;br /&gt;
&lt;br /&gt;
În urma realizării unei succesiuni de îndoituri, din foaia iniţială de hârtie se va obţine un obiect, care va avea o formă dreptunghiulară, cu înălţimea H, lăţimea M şi având grosimea egală cu numărul maxim de foi care se suprapun în cadrul obiectului obţinut.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dată fiind o succesiune de îndoituri aplicată unei foi de dimensiune N x N, scrieţi un program care să determine înălţimea, lăţimea şi grosimea obiectului obţinut.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare origami1.in are următoarea structură :&lt;br /&gt;
&lt;br /&gt;
* prima linie a fişierului conţine un număr natural N, reprezentând dimensiunea iniţială a hârtiei;&lt;br /&gt;
a doua linie conţine un număr natural K, reprezentând numărul îndoiturilor;&lt;br /&gt;
* pe următoarele K linii se găsesc perechi de numere naturale nenule, A B, separate printr-un spaţiu, reprezentând tipul îndoiturii ( A este 1 dacă se realizează o îndoitură verticală sau A este 2 dacă se realizează o îndoitură orizontală), respectiv la ce distanţă se realizează îndoitura;&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire origami1.out va conţine, pe o singură linie, trei numere naturale nenule H, L, G, separate prin câte un spaţiu, reprezentând înălţimea, lăţimea şi respectiv grosimea obiectului obţinut.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ N ≤ 170&lt;br /&gt;
* 1 ≤ K ≤ 2N-2&lt;br /&gt;
* A = 1 sau A = 2&lt;br /&gt;
* 1 ≤ B &amp;lt; înălţimea sau lăţimea hârtiei la momentul respectiv (funcţie de tipul îndoiturii)&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; origami1.in&lt;br /&gt;
 4&lt;br /&gt;
 3&lt;br /&gt;
 1 3&lt;br /&gt;
 2 3&lt;br /&gt;
 1 1&lt;br /&gt;
; origami1.out&lt;br /&gt;
 3 2 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Hârtia are 4 unităţi înălţime şi 4 unităţi lăţime. Prima îndoitură se realizează de la stânga la dreapta, de-a lungul celei de-a treia linii verticale faţă de marginea stângă a foii. Se obţine o foaie de înălţime 4, lăţime 3 şi grosime 2. A doua îndoitură se realizează îndoind partea superioară a foii, în jos, de-a lungul celei de-a treia linii orizontale faţă se marginea de sus a foii. Se obţine un obiect de înălţime 3, lăţime 3 şi grosime 4. După a treia îndoitură se obţine obiectul final, având înălţimea 3, lăţimea 2 şi grosimea 6.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def fold_paper(N, K, folds):&lt;br /&gt;
    height = N&lt;br /&gt;
    width = N&lt;br /&gt;
    thickness = 1&lt;br /&gt;
&lt;br /&gt;
    for fold_type, position in folds:&lt;br /&gt;
        if fold_type == 1:&lt;br /&gt;
            # Îndoitură verticală&lt;br /&gt;
            width = min(position, N - position)&lt;br /&gt;
            thickness *= 2&lt;br /&gt;
        elif fold_type == 2:&lt;br /&gt;
            # Îndoitură orizontală&lt;br /&gt;
            height = min(position, N - position)&lt;br /&gt;
            thickness *= 2&lt;br /&gt;
&lt;br /&gt;
    return height, width, thickness&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;origami1.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        K = int(fin.readline())&lt;br /&gt;
        folds = [list(map(int, fin.readline().split())) for _ in range(K)]&lt;br /&gt;
&lt;br /&gt;
    height, width, thickness = fold_paper(N, K, folds)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;origami1.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{height} {width} {thickness}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3573_-_Joc_11&amp;diff=10029</id>
		<title>3573 - Joc 11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3573_-_Joc_11&amp;diff=10029"/>
		<updated>2024-06-03T17:10:19Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Pentru un concurs de design de jocuri, Gigel vrea să construiască un joc. La joc participă n concurenţi numerotaţi de la 1 la n. Fiecare concurent are la dispoziţie câte un şir de m încăperi, numerotate de la 1 la m. Scopul jocului este de a găsi o comoară ascunsă în una din aceste încăperi. Fiecare încăpere conţine un cod, număr natural, fie egal cu 0, fie având cel puţin 2 cifre. Ultima cifră indică numărul de etape de penalizare, adică...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Pentru un concurs de design de jocuri, Gigel vrea să construiască un joc. La joc participă n concurenţi numerotaţi de la 1 la n. Fiecare concurent are la dispoziţie câte un şir de m încăperi, numerotate de la 1 la m. Scopul jocului este de a găsi o comoară ascunsă în una din aceste încăperi. Fiecare încăpere conţine un cod, număr natural, fie egal cu 0, fie având cel puţin 2 cifre. Ultima cifră indică numărul de etape de penalizare, adică numărul de etape în care concurentul nu are voie să părăsească încăperea. Numărul obţinut prin eliminarea ultimei cifre a codului indică numărul încăperii în care se va deplasa acesta la următoarea etapă sau la expirarea penalizării.&lt;br /&gt;
&lt;br /&gt;
Există două excepţii de la regula de definire a codului: numărul 9999 codifică o încăpere conţinând o comoară, iar numărul 0 o încăpere conţinând o capcana.&lt;br /&gt;
&lt;br /&gt;
În etapa 1 fiecare jucător intră în încăperea 1 din şirul său de încăperi. În funcţie de codul găsit în încăpere sunt posibile următoarele situaţii:&lt;br /&gt;
&lt;br /&gt;
* codul găsit este 9999 ceea ce înseamnă că jucătorul este câştigător şi jocul se încheie la finalul acestei etape;&lt;br /&gt;
* codul găsit este 0 ceea ce duce la eliminarea sa din joc;&lt;br /&gt;
* pentru celelalte coduri, după efectuarea etapelor de penalizare, jucătorul efectuează o deplasare în încăperea indicată de cod. De exemplu la întâlnirea codul 157, după efectuarea celor 7 etape de penalizare jucătorul se va deplasa în camera 15.&lt;br /&gt;
Trecerea de la o etapă la alta se realizează simultan pentru toţi concurenţii.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat numărul n de concurenţi, numărul m de încăperi alocate fiecărui concurent, şi codurile din cele n×m încăperi să se determine câştigătorul jocului, numărul încăperii în care a găsit comoara, numărul de etape parcurse până când câştigătorul găseşte comoara precum şi numărul de concurenţi eliminaţi din joc până la etapa respectivă (inclusiv).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a fişierului de intrare joc11.in conţine două numere naturale n şi m, separate printr-un spaţiu, reprezentând numărul concurenţilor, respectiv numărul încăperilor. Următoarele n linii conţin câte m numere naturale, separate prin câte un spaţiu, reprezentând codurile din fiecare încăpere.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Prima linie a fişierului de ieşire joc11.out va conţine patru numere naturale separate prin câte un spaţiu, reprezentând indicele câştigătorului, numărul încăperii unde a găsit comoara, numărul etapei în care a câştigat şi respectiv numărul de concurenţi eliminaţi din joc.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 400&lt;br /&gt;
* 1 ≤ m ≤ 900&lt;br /&gt;
* Pentru toate testele de intrare se garantează că există exact un câştigător.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; joc11.in&lt;br /&gt;
 4 8&lt;br /&gt;
 0 9999 41 50 61 70 80 30&lt;br /&gt;
 30 80 60 60 9999 21 40 50&lt;br /&gt;
 20 30 40 50 61 71 81 9999&lt;br /&gt;
 20 30 50 0 61 71 9999 41&lt;br /&gt;
; joc11.out&lt;br /&gt;
 2 5 7 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Câştigă jucătorul al 2-lea, după 7 etape, iar încăperea în care a găsit comoara este încăperea 5. În cele 7 etape a fost eliminat un singur concurent şi anume primul concurent.&lt;br /&gt;
Încăperile prin care trece jucătorul câştigător până la final sunt: 1-&amp;gt;3-&amp;gt;6-&amp;gt;2-&amp;gt;8-&amp;gt;5&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def simulate_game(n, m, rooms):&lt;br /&gt;
    winner = None&lt;br /&gt;
    room_number = None&lt;br /&gt;
    steps = 0&lt;br /&gt;
    eliminated = 0&lt;br /&gt;
&lt;br /&gt;
    # Cream o listă de seturi pentru a memora concurenții eliminați în fiecare etapă&lt;br /&gt;
    eliminated_each_step = [set() for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    for step in range(m):&lt;br /&gt;
        next_rooms = [0] * n  # Inițializăm lista cu următoarele încăperi pentru fiecare concurent&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if i in eliminated_each_step[step]:&lt;br /&gt;
                continue  # Dacă concurentul este deja eliminat în această etapă, nu facem nimic cu el&lt;br /&gt;
&lt;br /&gt;
            code = rooms[i][step]  # Codul din încăperea curentă a concurentului&lt;br /&gt;
&lt;br /&gt;
            if code == 9999:&lt;br /&gt;
                winner = i + 1&lt;br /&gt;
                room_number = step + 1&lt;br /&gt;
                steps = step + 1&lt;br /&gt;
                return winner, room_number, steps, eliminated&lt;br /&gt;
&lt;br /&gt;
            if code == 0:&lt;br /&gt;
                eliminated += 1&lt;br /&gt;
                eliminated_each_step[step].add(i)&lt;br /&gt;
            else:&lt;br /&gt;
                next_room = int(str(code)[:-1])  # Obținem numărul următoarei încăperi&lt;br /&gt;
                next_rooms[next_room - 1] += 1&lt;br /&gt;
&lt;br /&gt;
        # Actualizăm seturile de concurenți eliminați pentru etapele următoare&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if next_rooms[i] &amp;gt; 1:&lt;br /&gt;
                eliminated_each_step[step + 1].add(i)&lt;br /&gt;
&lt;br /&gt;
    return winner, room_number, steps, eliminated&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;joc11.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        rooms = [list(map(int, fin.readline().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    winner, room_number, steps, eliminated = simulate_game(n, m, rooms)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;joc11.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{winner} {room_number} {steps} {eliminated}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3578_-_Palind&amp;diff=10027</id>
		<title>3578 - Palind</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3578_-_Palind&amp;diff=10027"/>
		<updated>2024-06-03T17:07:49Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Ana a descoperit că are o adevărată pasiune pentru palindromuri. Un şir de numere este palindrom dacă se citeşte la fel de la stânga la dreapta şi de la dreapta la stânga (primul număr este egal cu ultimul, al doilea cu penultimul etc). Ea are un şir cu N numere naturale şi vrea ca orice subsecvenţă de lungime impară a şirului să fie palindrom. Pentru a-şi îndeplini dorinţa ea poate efectua asupra şirului mai multe operaţii. O operaţie const...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Ana a descoperit că are o adevărată pasiune pentru palindromuri. Un şir de numere este palindrom dacă se citeşte la fel de la stânga la dreapta şi de la dreapta la stânga (primul număr este egal cu ultimul, al doilea cu penultimul etc). Ea are un şir cu N numere naturale şi vrea ca orice subsecvenţă de lungime impară a şirului să fie palindrom. Pentru a-şi îndeplini dorinţa ea poate efectua asupra şirului mai multe operaţii. O operaţie constă în alegerea unui element din şir şi incrementarea sau decrementarea lui cu o unitate. Bineînţeles, Ana doreşte să utilizeze un număr minim de operaţii pentru ca şirul obţinut să respecte proprietatea amintită mai sus (orice subsecvenţă de lungime impară să fie palindrom).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Determinaţi pentru Ana numărul minim de operaţii pe care trebuie să-l efectueze pentru ca orice subsecvenţă de lungime impară a şirului obţinut în urma efectuării operaţiilor să fie palindrom. De asemenea aflaţi şi numărul de şiruri finale distincte pe care le poate obţine efectuând acest numar minim de operaţii.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare palind.in va conţine pe prima linie numărul T, reprezentând numărul de seturi de date de intrare care urmează. În continuare urmează seturile de date de intrare, fiecare pe câte două linii. Pe prima linie a unui set de date se află numărul N, având semnificaţia din enunţ. Pe următoarea linie se află elementele şirului iniţial, separate prin câte un spaţiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire palind.out va conţine T linii, pe linia i aflându-se două numere, reprezentând raspunsul pentru al i-lea set de date de intrare. Primul numar este numarul minim de operaţii, iar al doilea numărul de şiruri distincte finale care se pot obţine efectuând numărul minim de operaţii.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ T ≤ 20&lt;br /&gt;
* 1 ≤ N ≤ 10.000&lt;br /&gt;
* Elementele şirului sunt numere naturale din intervalul [1, 7.000]&lt;br /&gt;
* subsecvenţă a unui şir este un subşir de numere care apar pe poziţii consecutive&lt;br /&gt;
* Toate testele folosite la corectare vor avea T = 20&lt;br /&gt;
* Pentru 20% din teste 1 ≤ N ≤ 100&lt;br /&gt;
* Pentru 20% din teste valoarea maximă din oricare şir este cel mult 500 şi N ≥ 101&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; palind.in&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 1 2 3&lt;br /&gt;
 1&lt;br /&gt;
 3&lt;br /&gt;
; palind.out&lt;br /&gt;
 2 3&lt;br /&gt;
 0 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
entru primul test, cele trei șiruri posibile sunt: 1 2 1, 2 2 2 și 3 2 3. Pentru al doilea test, singurul șir posibil este format din elementul 3.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def min_operations_and_unique_sequences(N, sequence):&lt;br /&gt;
    min_operations = 0&lt;br /&gt;
    unique_sequences = set()&lt;br /&gt;
&lt;br /&gt;
    for i in range(N // 2):&lt;br /&gt;
        diff = abs(sequence[i] - sequence[N - i - 1])&lt;br /&gt;
        min_operations += diff&lt;br /&gt;
&lt;br /&gt;
        # Actualizăm numărul de șiruri unice posibile&lt;br /&gt;
        unique_sequences.add(sequence[i] + min_operations)&lt;br /&gt;
        unique_sequences.add(sequence[N - i - 1] + min_operations)&lt;br /&gt;
&lt;br /&gt;
    if N % 2 == 1:&lt;br /&gt;
        # Dacă lungimea șirului este impară, trebuie să tratăm mijlocul separat&lt;br /&gt;
        middle_number = sequence[N // 2]&lt;br /&gt;
        unique_sequences.add(middle_number + min_operations)&lt;br /&gt;
&lt;br /&gt;
    return min_operations, len(unique_sequences)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;palind.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        T = int(fin.readline())&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for _ in range(T):&lt;br /&gt;
            N = int(fin.readline())&lt;br /&gt;
            sequence = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
            min_ops, unique_seqs = min_operations_and_unique_sequences(N, sequence)&lt;br /&gt;
            results.append((min_ops, unique_seqs))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;palind.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for min_ops, unique_seqs in results:&lt;br /&gt;
            fout.write(f&amp;quot;{min_ops} {unique_seqs}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2250_-_Fact&amp;diff=10025</id>
		<title>2250 - Fact</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2250_-_Fact&amp;diff=10025"/>
		<updated>2024-06-03T17:05:53Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Pentru un număr natural nenul, definim factorialul său ca fiind produsul tuturor numerelor naturale nenule mai mici sau egale decât el şi îl notăm N! (adică N! = 1*2*…*N). Pentru o bază de numeraţie B şi un număr natural nenul N, se cere determinarea ultimei cifre nenule a scrierii în baza B a lui N!. == Cerinţa == Se citesc 5 perechi de forma (Ni, Bi), unde 1 ≤ i ≤ 5. Pentru fiecare din cele 5 perechi citite, aflați ultima cifră nenulă a scr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Pentru un număr natural nenul, definim factorialul său ca fiind produsul tuturor numerelor naturale nenule mai mici sau egale decât el şi îl notăm N! (adică N! = 1*2*…*N). Pentru o bază de numeraţie B şi un număr natural nenul N, se cere determinarea ultimei cifre nenule a scrierii în baza B a lui N!.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se citesc 5 perechi de forma (Ni, Bi), unde 1 ≤ i ≤ 5. Pentru fiecare din cele 5 perechi citite, aflați ultima cifră nenulă a scrierii în baza Bi a factorialului numărului Ni.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare fact.in conţine 5 linii, pe fiecare dintre ele fiind scrise câte două numere naturale nenule Ni şi Bi, scrise în baza 10, despărţite printr-un spaţiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire fact.out va conţine 5 linii. Pe linia i se va afla cifra corespunzătoare unei perechi (Ni, Bi), citită de pe linia i din fişierul de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ Ni ≤ 1.000.000, pentru 1 ≤ i ≤ 5&lt;br /&gt;
* 2 ≤ Bi ≤ 36, pentru 1 ≤ i ≤ 5;&lt;br /&gt;
* în cazul în care Bi &amp;gt; 10, cifrele mai mari decât 9 vor fi reprezentate prin litere mari ale alfabetului englez (10=&#039;A&#039;, 11=&#039;B&#039;, …, 35=&#039;Z&#039;);&lt;br /&gt;
* un test va fi punctat doar dacă toate cele cinci rezultate cerute sunt corecte.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; fact.in&lt;br /&gt;
 5 10&lt;br /&gt;
 7 10&lt;br /&gt;
 7 20&lt;br /&gt;
 8 16&lt;br /&gt;
 9 8&lt;br /&gt;
; fact.out&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 C&lt;br /&gt;
 8&lt;br /&gt;
 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
5!=120, în baza 10, deci ultima cifră nenulă este 2&lt;br /&gt;
7!=5040, în baza 10, deci ultima cifră nenulă este 4&lt;br /&gt;
7!=CC0, în baza 20, deci ultima cifră nenulă este C&lt;br /&gt;
8!= 9D80, în baza 16, deci ultima cifră nenulă este 8&lt;br /&gt;
9!=1304600, în baza 8, deci ultima cifră nenulă este 6&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def last_nonzero_digit_factorial(N, B):&lt;br /&gt;
    # Calculează factorialul lui N&lt;br /&gt;
    factorial = 1&lt;br /&gt;
    for i in range(2, N + 1):&lt;br /&gt;
        factorial *= i&lt;br /&gt;
&lt;br /&gt;
    # Convertim factorialul în baza B&lt;br /&gt;
    factorial_base_B = &amp;quot;&amp;quot;&lt;br /&gt;
    while factorial &amp;gt; 0:&lt;br /&gt;
        remainder = factorial % B&lt;br /&gt;
        if remainder &amp;gt;= 10:&lt;br /&gt;
            factorial_base_B = chr(ord(&#039;A&#039;) + remainder - 10) + factorial_base_B&lt;br /&gt;
        else:&lt;br /&gt;
            factorial_base_B = str(remainder) + factorial_base_B&lt;br /&gt;
        factorial //= B&lt;br /&gt;
&lt;br /&gt;
    # Găsim ultima cifră nenulă&lt;br /&gt;
    for digit in reversed(factorial_base_B):&lt;br /&gt;
        if digit != &#039;0&#039;:&lt;br /&gt;
            return digit&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim datele de intrare&lt;br /&gt;
    with open(&amp;quot;fact.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        pairs = [list(map(int, line.split())) for line in fin.readlines()]&lt;br /&gt;
&lt;br /&gt;
    # Determinăm ultima cifră nenulă pentru fiecare pereche&lt;br /&gt;
    results = [last_nonzero_digit_factorial(N, B) for N, B in pairs]&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatele în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;fact.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            fout.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1811_-_Aritma&amp;diff=10022</id>
		<title>1811 - Aritma</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1811_-_Aritma&amp;diff=10022"/>
		<updated>2024-06-03T17:03:34Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == Shaka, regele zuluşilor, a dat ordin să se realizeze un sistem de comunicaţii bazat pe tobe (tamtam)care să acopere întreaga ţară. Pentru aceasta el a dispus instruirea celor ce vor urma să transmită mesajele. Problema intervenită este aceea că o parte din cursanţi nu pot face distincţie între sunete şi nu pot reda cu fidelitate succesiunea de sunete pe hârtie. S-a făcut următoarea convenţie de notare: un sunet lung va fi reprezentat prin +,...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Shaka, regele zuluşilor, a dat ordin să se realizeze un sistem de comunicaţii bazat pe tobe (tamtam)care să acopere întreaga ţară. Pentru aceasta el a dispus instruirea celor ce vor urma să transmită mesajele. Problema intervenită este aceea că o parte din cursanţi nu pot face distincţie între sunete şi nu pot reda cu fidelitate succesiunea de sunete pe hârtie. S-a făcut următoarea convenţie de notare: un sunet lung va fi reprezentat prin +, unul scurt prin -, iar unul nedecis (receptorul nu e sigur de lungimea sunetului) prin *.&lt;br /&gt;
&lt;br /&gt;
Spre finalul stagiului Shaka a mers să verifice nivelul de pregătire al cursanţilor. Pentru aceasta el a adunat n cursanţi pe care i-a pus să recepţioneze şi să noteze un mesaj format din m sunete. După transmiterea mesajului s-a constatat că mulţi dintre cursanţi au scris şiruri foarte diferite, ceea ce ducea la o alterare semnificativă a mesajului original, chiar dacă nici cel mai slab pregătit cursant nu a fost indecis la mai mult de jumătate din sunete. Supărat Shaka l-a chemat pe instructorul şef şi, ca să-l pedepsească, i-a cerut ca să determine câte mesaje distincte se pot forma din şirurile scrise de cursanţi.&lt;br /&gt;
&lt;br /&gt;
Scrieţi un program care determină numărul de mesaje distincte rezultate.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul aritma.in conţine pe prima sa linie numerele n şi m separate prin spaţiu, iar pe următoarele n linii şiruri de caractere de lungime m formate numai din simbolurile +, - sau *.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fişierului aritma.out se va scrie numărul de mesaje distincte.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 &amp;lt; n &amp;lt; 25&lt;br /&gt;
* 1 &amp;lt; m &amp;lt; 19&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; aritma.in&lt;br /&gt;
 3 3&lt;br /&gt;
 +-*&lt;br /&gt;
 +*+&lt;br /&gt;
 -*+&lt;br /&gt;
; aritma.out&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Mesajele rezultate sunt: +--, +-+, +++, +-+, --+, -++. Primele două mesaje sunt rezultate din prima identificare, următoarele două sunt din a doua identificare şi ultimele două din ultimul şir; numai cinci sunt distincte.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def distinct_messages(strings):&lt;br /&gt;
    def backtrack(index):&lt;br /&gt;
        if index == len(strings[0]):&lt;br /&gt;
            messages.add(&amp;quot;&amp;quot;.join(message))&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # Dacă sunetul este cunoscut, îl adăugăm în mesaj&lt;br /&gt;
        if all(s[index] != &#039;*&#039; for s in strings):&lt;br /&gt;
            message.append(strings[0][index])&lt;br /&gt;
            backtrack(index + 1)&lt;br /&gt;
            message.pop()&lt;br /&gt;
&lt;br /&gt;
        # Dacă sunetul este incert, încercăm toate posibilitățile&lt;br /&gt;
        elif any(s[index] == &#039;*&#039; for s in strings):&lt;br /&gt;
            for sound in [&#039;+&#039;, &#039;-&#039;, &#039;*&#039;]:&lt;br /&gt;
                message.append(sound)&lt;br /&gt;
                backtrack(index + 1)&lt;br /&gt;
                message.pop()&lt;br /&gt;
&lt;br /&gt;
    messages = set()&lt;br /&gt;
    message = []&lt;br /&gt;
    backtrack(0)&lt;br /&gt;
    return len(messages)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim datele de intrare&lt;br /&gt;
    with open(&amp;quot;aritma.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        strings = [fin.readline().strip() for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # Determinăm numărul de mesaje distincte&lt;br /&gt;
    result = distinct_messages(strings)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;aritma.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1704_-_Cercetasi&amp;diff=10021</id>
		<title>1704 - Cercetasi</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1704_-_Cercetasi&amp;diff=10021"/>
		<updated>2024-06-03T17:02:01Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Un grup de N cercetași, numerotați de la 1 la N, se află în tabără la munte. Pentru ei, organizatorii au pregătit N scaune, de asemenea numerotate de la 1 la N, așezate în cerc, astfel încât fiecare cercetaș să aibă locul său (locul cercetașului i este pe scaunul i, 1≤i≤N).  Pentru desfășurarea următoarei activități, organizatorii au decis ca M dintre cercetași să prezinte diferite exerciții. Numărul M este egal cu cea mai mare putere...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Un grup de N cercetași, numerotați de la 1 la N, se află în tabără la munte. Pentru ei, organizatorii au pregătit N scaune, de asemenea numerotate de la 1 la N, așezate în cerc, astfel încât fiecare cercetaș să aibă locul său (locul cercetașului i este pe scaunul i, 1≤i≤N).&lt;br /&gt;
&lt;br /&gt;
Pentru desfășurarea următoarei activități, organizatorii au decis ca M dintre cercetași să prezinte diferite exerciții. Numărul M este egal cu cea mai mare putere a lui 2 cu proprietatea că numărul N de cercetași aflați în tabără se poate scrie ca sumă de M numere consecutive în mulțimea numerelor impare. Cei M cercetași care vor prezenta sunt cei numerotați cu numerele impare consecutive a căror sumă este N. De exemplu, dacă N=8, atunci M este 2, iar exercițiile vor fi prezentate de cercetașii numerotați cu 3, respectiv cu 5.&lt;br /&gt;
&lt;br /&gt;
Din joacă, micii cercetași s-au așezat pe scaune la întâmplare. Organizatorii au nevoie pentru a desfășura activitatea ca cel puțin cei M cercetași care vor prezenta exercițiile să se afle pe locurile lor. Pentru aceasta, o parte dintre cercetași trebuie să-și schimbe locul și organizatorii invită micii cercetași să participe la jocul numit ”Mutare”. Acest joc se desfășoară astfel: unul dintre cercetașii care nu se află pe locul lor se ridică și merge în interiorul cercului. Cercetașul numerotat cu numărul scaunului rămas liber își va ocupa locul, iar locul ocupat de el anterior rămâne astfel liber. Jocul continuă până când scaunul cercetașului aflat în interiorul cercului se eliberează și el se așază pe locul său.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat numărul N, precum și ordinea în care s-au așezat cercetașii pe scaunele numerotate de la 1 la N, scrieți un program care să determine:&lt;br /&gt;
&lt;br /&gt;
* numărul M de cercetaşi care vor prezenta exerciţii în cadrul activităţii;&lt;br /&gt;
* numerele de identificare ale celor M cercetaşi care vor prezenta exerciţiile, în ordine strict crescătoare;&lt;br /&gt;
* numărul minim de cercetași care își vor schimba locul, astfel încât toţi cei M cercetași care vor prezenta exercițiile să se afle pe locurile lor.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare cercetasi.in conține pe prima linie numărul natural N cu semnificația din enunț. Pe a doua linie, se află N numere naturale distincte din mulțimea {1, 2, ..., N}, separate prin spaţii, reprezentând ordinea în care s-au așezat cei N cercetași pe scaunele numerotate de la 1 la N.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire cercetasi.out va conține 3 linii. Pe prima linie se va scrie un singur număr natural repre­zentând numărul M de cercetași care vor prezenta exercițiile. Pe a doua linie se vor scrie M numere naturale, în ordine strict crescătoare, separate prin câte un spaţiu, reprezentând cercetașii care vor prezenta exercițiile. Pe a treia linie se va scrie un număr natural, reprezentând numărul minim de cercetași care își vor schimba locul.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 0 &amp;lt; N ≤ 10000 şi N∉ {x ∈ ℕ | x=4*k+2, k∈ ℕ}&lt;br /&gt;
* Un joc ”Mutare” odată început, se va încheia doar atunci când cercetașul din interiorul cercului se așază pe locul său.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; cercetasi.in&lt;br /&gt;
 8 &lt;br /&gt;
 2 3 4 1 5 8 6 7&lt;br /&gt;
; cercetasi.out&lt;br /&gt;
 2&lt;br /&gt;
 3 5&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Dacă N=8, atunci M este 2, iar exercițiile vor fi prezentate de cercetașii numerotați cu 3, respectiv cu 5.&lt;br /&gt;
&lt;br /&gt;
Cercetașul cu numărul 3 nu se află pe locul său și va trece în interiorul cercului, astfel scaunul cu numărul 2 rămâne liber. Cercetașul cu numărul 2 își ocupă locul și rămâne liber scaunul cu numărul 1. Cercetașul cu numărul 1 își ocupă locul și rămâne liber scaunul cu numărul 4. Cercetașul cu numărul 4 își ocupă locul și rămâne liber scaunul cu numărul 3 și astfel cercetașul aflat în interiorul cercului se poate așeza pe locul său. In cadrul acestui joc ”Mutare” și-au schimbat locul 4 cercetași. Cum cercetașul cu numărul 5 se află deja pe locul său, numărul de cercetași care își schimbă locul rămâne 4.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def find_presenters(N, seats):&lt;br /&gt;
    # Cautăm cel mai mare M astfel încât suma primelor M numere impare să fie mai mică sau egală cu N&lt;br /&gt;
    M = 1&lt;br /&gt;
    while M * (M + 1) &amp;lt;= 2 * N:&lt;br /&gt;
        M += 2&lt;br /&gt;
&lt;br /&gt;
    # Identificăm cercetașii care vor prezenta exercițiile&lt;br /&gt;
    presenters = [i for i in range(1, N + 1) if i % 2 != 0]&lt;br /&gt;
&lt;br /&gt;
    # Numărăm câți dintre aceștia sunt deja pe locurile lor&lt;br /&gt;
    presenters_on_seats = sum(1 for i, s in enumerate(seats) if s == presenters[i])&lt;br /&gt;
&lt;br /&gt;
    # Calculăm câți cercetași trebuie să își schimbe locul&lt;br /&gt;
    moves = 0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        if seats[i] != presenters[i]:&lt;br /&gt;
            moves += 1&lt;br /&gt;
&lt;br /&gt;
    return M // 2, presenters, moves&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim datele de intrare&lt;br /&gt;
    with open(&amp;quot;cercetasi.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        seats = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Găsim prezentatorii și numărul minim de mutări necesare&lt;br /&gt;
    M, presenters, moves = find_presenters(N, seats)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatele în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;cercetasi.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{M}\n&amp;quot;)&lt;br /&gt;
        fout.write(&amp;quot; &amp;quot;.join(map(str, presenters)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{moves}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3015_-_Fibo_Interval&amp;diff=10019</id>
		<title>3015 - Fibo Interval</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3015_-_Fibo_Interval&amp;diff=10019"/>
		<updated>2024-06-03T16:58:48Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == Se dă șirul lui Fibonacci: f1=1, f2=1, f3=2, f4=3, f5=5, …, definit astfel fk+2 = fk+1 + fk, k&amp;gt;2.  Se dau Q query-uri de forma ab. Se cere să se afișeze pentru fiecare query fa, fb și suma elementelor fk din șirul lui Fibonacci cu a≤k≤b. == Date de intrare == Fișierul de intrare fibointerval.in conține pe prima linie numerele n si Q, iar pe următoarele Q linii câte două numere a si b reprezentând query-urile. == Date de ieșire == Fișierul de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă șirul lui Fibonacci: f1=1, f2=1, f3=2, f4=3, f5=5, …, definit astfel fk+2 = fk+1 + fk, k&amp;gt;2.&lt;br /&gt;
&lt;br /&gt;
Se dau Q query-uri de forma ab. Se cere să se afișeze pentru fiecare query fa, fb și suma elementelor fk din șirul lui Fibonacci cu a≤k≤b.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare fibointerval.in conține pe prima linie numerele n si Q, iar pe următoarele Q linii câte două numere a si b reprezentând query-urile.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire fibointerval.out va conține pe fiecare linie, în ordine, rezultatul celor Q query-uri, cele 3 valori care trebuie afișate fiind separate prin câte un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000&lt;br /&gt;
* 1 ≤ Q ≤ 10000&lt;br /&gt;
* 1 ≤ a ≤ b ≤ n&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; fibointerval.in&lt;br /&gt;
 10 3&lt;br /&gt;
 1 3&lt;br /&gt;
 3 5&lt;br /&gt;
 2 8&lt;br /&gt;
; fibointerval.out&lt;br /&gt;
 1 2 4&lt;br /&gt;
 2 5 10&lt;br /&gt;
 1 21 53&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
n=10 și Q=3.&lt;br /&gt;
Primul query: a=1, b=3, rezultă că f1=1, f3=2, iar suma elementelor cu indici cuprinși intre a și b este 4.Al doilea query: a=3, b=5, rezultă că f3=2, f5=5, iar suma elementelor cu indici cuprinși intre a și b este 10.Al treilea query: a=2, b=8, rezultă că f2=1, f8=21, iar suma elementelor cu indici cuprinși intre a și b este 53.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def generate_fibonacci(n):&lt;br /&gt;
    fibonacci = [1, 1]&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, n):&lt;br /&gt;
        fibonacci.append(fibonacci[i-1] + fibonacci[i-2])&lt;br /&gt;
&lt;br /&gt;
    return fibonacci&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;fibointerval.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, Q = map(int, fin.readline().split())&lt;br /&gt;
        queries = [tuple(map(int, fin.readline().split())) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
    fibonacci = generate_fibonacci(n)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;fibointerval.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for a, b in queries:&lt;br /&gt;
            fa = fibonacci[a - 1]&lt;br /&gt;
            fb = fibonacci[b - 1]&lt;br /&gt;
            fib_sum = sum(fibonacci[a - 1:b])&lt;br /&gt;
            fout.write(f&amp;quot;{fa} {fb} {fib_sum}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2458_-_Hobby&amp;diff=10017</id>
		<title>2458 - Hobby</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2458_-_Hobby&amp;diff=10017"/>
		<updated>2024-06-03T16:55:45Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == În școala lui Gigel copiii se pregătesc pentru vacanță. Ei vor să-și petreacă timpul liber în mod diferit în funcție de hobby-urile pe care le au. În concluzie, urmează să formeze grupuri, pe baza preferințelor. Totuși, a apărut o problemă. Unii sunt dispuși să renunțe la propriul hobby și preferă să facă parte dintr-un grup din care face parte și un anumit prieten al lor. În școala lui Gigel sunt n copii, numerotați de la 1 la n. == C...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
În școala lui Gigel copiii se pregătesc pentru vacanță. Ei vor să-și petreacă timpul liber în mod diferit în funcție de hobby-urile pe care le au. În concluzie, urmează să formeze grupuri, pe baza preferințelor. Totuși, a apărut o problemă. Unii sunt dispuși să renunțe la propriul hobby și preferă să facă parte dintr-un grup din care face parte și un anumit prieten al lor. În școala lui Gigel sunt n copii, numerotați de la 1 la n.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând prietenul preferat și hobby-ul fiecărui copil, scrieți un program care determină numărul grupurilor care se vor forma și numărul grupurilor formate din copii care au hobby-uri identice; doi copii vor face parte din același grup, dacă cel puțin unul din cei doi l-a numit pe celălalt ca prieten.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului de intrare hobby1.in se află un număr natural n, reprezentând numărul copiilor. Pe fiecare din următoarele n linii se află câte o pereche de numere naturale, unde primul număr reprezintă numărul de ordine al copilului având ca prieten preferat copilul identificat cu cel de al doilea număr. Pe următoarele n linii se află, pe fiecare, câte un șir de caractere format din litere mici ale alfabetului englez, reprezentând hobby-urile copiilor în ordinea în care sunt numerotați copiii.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului de ieșire hobby1.out veți scrie numărul gr al grupurilor de copii. Pe următoarea linie veți afișa numărul grupurilor în care toți copiii au același hobby.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 700.&lt;br /&gt;
* 1 ≤ lungime_denumire_hobby ≤ 10.&lt;br /&gt;
* 1 ≤ gr ≤ 400.&lt;br /&gt;
* numărul de ordine al fiecărui copil apare o singură dată pe prima poziție a unei perechi.&lt;br /&gt;
* un copil poate fi prietenul mai multor copii.&lt;br /&gt;
* numărul maxim al hobby-urilor: 20.&lt;br /&gt;
* La concurs s-au dat 10 puncte din oficiu, aici sunt date pe exemplu.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; hobby.in&lt;br /&gt;
 8&lt;br /&gt;
 1 2&lt;br /&gt;
 3 4&lt;br /&gt;
 5 6&lt;br /&gt;
 7 7&lt;br /&gt;
 8 3&lt;br /&gt;
 2 1&lt;br /&gt;
 4 3&lt;br /&gt;
 6 2&lt;br /&gt;
 baschet&lt;br /&gt;
 baschet&lt;br /&gt;
 tenis&lt;br /&gt;
 fotbal&lt;br /&gt;
 baschet&lt;br /&gt;
 baschet&lt;br /&gt;
 muzica&lt;br /&gt;
 tenis&lt;br /&gt;
; hobby.out&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Avem 3 grupuri:&lt;br /&gt;
1: 1 2 5 6&lt;br /&gt;
2: 7&lt;br /&gt;
3: 3 4 8&lt;br /&gt;
Toți copiii din primul grup (cu numerele de ordine 1 2 5 6) au ca hobby baschetul, copilul 7 este singur, iar în al treilea grup hobby-urile diferă. Deci avem 2 grupuri în care copiii au același hobby.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def form_groups(n, preferences, hobbies):&lt;br /&gt;
    groups = {}  # Dicționar pentru a înregistra grupurile&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        friend = preferences[i]&lt;br /&gt;
        hobby = hobbies[i]&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă prietenul preferat este deja într-un grup&lt;br /&gt;
        if friend in groups:&lt;br /&gt;
            # Adăugăm copilul curent în grupul prietenului său&lt;br /&gt;
            groups[friend].append(i)&lt;br /&gt;
            groups[i] = groups[friend]  # Actualizăm grupul pentru copilul curent&lt;br /&gt;
        else:&lt;br /&gt;
            # Creăm un nou grup pentru ei&lt;br /&gt;
            groups[i] = [i]&lt;br /&gt;
&lt;br /&gt;
    return groups&lt;br /&gt;
&lt;br /&gt;
def count_same_hobbies(groups, hobbies):&lt;br /&gt;
    same_hobby_groups = 0&lt;br /&gt;
&lt;br /&gt;
    for group in groups.values():&lt;br /&gt;
        # Verificăm dacă toți copiii din grup au același hobby&lt;br /&gt;
        same_hobby = all(hobbies[child] == hobbies[group[0]] for child in group)&lt;br /&gt;
        if same_hobby:&lt;br /&gt;
            same_hobby_groups += 1&lt;br /&gt;
&lt;br /&gt;
    return same_hobby_groups&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;hobby.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        preferences = {}&lt;br /&gt;
        hobbies = {}&lt;br /&gt;
&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            child, friend = map(int, fin.readline().split())&lt;br /&gt;
            preferences[child] = friend&lt;br /&gt;
&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            hobbies[i] = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
    # Formăm grupurile&lt;br /&gt;
    groups = form_groups(n, preferences, hobbies)&lt;br /&gt;
&lt;br /&gt;
    # Numărăm grupurile cu aceleași hobby-uri&lt;br /&gt;
    same_hobby_groups = count_same_hobbies(groups, hobbies)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;hobby.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(len(groups)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        fout.write(str(same_hobby_groups) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1119_-_Permutare_1&amp;diff=10014</id>
		<title>1119 - Permutare 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1119_-_Permutare_1&amp;diff=10014"/>
		<updated>2024-06-03T16:51:05Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă o matrice cu m linii şi n coloane, fiecare linie reprezentând o permutare. Se ştie că liniile de la 2 la m sunt permutări circulare ale primei linii. Unei linii x (1 ≤ x ≤ m) i se pot aplica următoarele operaţii:  * o permutare circulară la stânga: elementul de pe poziţia i (1 &amp;lt; i ≤ n) se mută pe poziţia i-1, mai puţin primul primul element, care devine ultimul; * o permutare circulară la dreapta: elementul de pe pozitia i (1 ≤ i &amp;lt; n)...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă o matrice cu m linii şi n coloane, fiecare linie reprezentând o permutare. Se ştie că liniile de la 2 la m sunt permutări circulare ale primei linii. Unei linii x (1 ≤ x ≤ m) i se pot aplica următoarele operaţii:&lt;br /&gt;
&lt;br /&gt;
* o permutare circulară la stânga: elementul de pe poziţia i (1 &amp;lt; i ≤ n) se mută pe poziţia i-1, mai puţin primul primul element, care devine ultimul;&lt;br /&gt;
* o permutare circulară la dreapta: elementul de pe pozitia i (1 ≤ i &amp;lt; n) se mută pe poziţia i+1, mai puţin ultimul element care devine primul.&lt;br /&gt;
Scopul este să permutăm circular liniile, la stânga sau la dreapta, astfel încât în final toate liniile să fie egale, folosind un număr minim de operaţii.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se o matrice cu proprietatea din enunţ se cere să se determine numărul minim de operaţii necesare pentru a ajunge la o matrice în care toate liniile sunt egale.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare permutare1.in conține pe prima linie două numere naturale m şi n, reprezentând numărul de linii şi numărul de coloane ale matricei. Pe a doua linie a fişierului de intrare se află n numere naturale, reprezentând permutarea de pe prima linie a matricei. Pe următoarele m-1 linii, se află câte un număr natural cuprins între 0 şi n-1. Al i-lea (0 &amp;lt; i &amp;lt; m) dintre aceste numere reprezintă numărul de poziţii cu care este permutată circular la dreapta a (i+1) -a linie faţă de linia 1.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire permutare1.out va conține pe prima linie un singur număr natural reprezentând numărul minim de operaţii necesare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n, m ≤ 100 000&lt;br /&gt;
* Două linii dintr-un tablou sunt egale dacă elementele aflate pe aceeaşi coloană sunt egale.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; permutare1.in&lt;br /&gt;
 pre.6 5&lt;br /&gt;
 3 1 4 2 6 5&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
 3&lt;br /&gt;
 3&lt;br /&gt;
; permutare1.out&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Matricea va fi:&lt;br /&gt;
&lt;br /&gt;
  3 1 4 2 6 5&lt;br /&gt;
  5 3 1 4 2 6&lt;br /&gt;
  5 3 1 4 2 6&lt;br /&gt;
  2 6 5 3 1 4&lt;br /&gt;
  2 6 5 3 1 4&lt;br /&gt;
&lt;br /&gt;
Dacă permutăm circular la dreapta prima linie cu o poziţie, iar liniile 4 şi 5 le permutăm la stânga cu două poziţii, vom obţine din 5 operaţii o matrice cu toate liniile egale între ele. Liniile vor fi determinate de permutarea: 5 3 1 4 2 6.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def min_operations_to_equalize_first_row(matrix, n):&lt;br /&gt;
    first_row = matrix[0]&lt;br /&gt;
    min_operations = n&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        operations = 0&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if matrix[i][j] != first_row[j]:&lt;br /&gt;
                operations += 1&lt;br /&gt;
        min_operations = min(min_operations, operations)&lt;br /&gt;
    return min_operations&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;permutare1.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        m, n = map(int, fin.readline().split())&lt;br /&gt;
        matrix = [list(map(int, fin.readline().split())) for _ in range(m-1)]&lt;br /&gt;
&lt;br /&gt;
    min_ops = min_operations_to_equalize_first_row(matrix, n)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;permutare1.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(min_ops) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1692_-_Calafat&amp;diff=10013</id>
		<title>1692 - Calafat</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1692_-_Calafat&amp;diff=10013"/>
		<updated>2024-06-03T16:48:28Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Această problemă se numește Calafat pentru că a fost compusă în timpul excursiei la Calafat de mâine. == Cerinţa == Se dă un șir format din N numere naturale. Pentru fiecare valoare distinctă dintr-o subsecvență cuprinsă între doi indici st si dr considerăm distanța dintre indicii primei și ultimei apariții ale acesteia în cadrul subsecvenței. Dându-se M subsecvențe de forma [st, dr], se cere să se calculeze suma distanțelor corespunzătoa...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Această problemă se numește Calafat pentru că a fost compusă în timpul excursiei la Calafat de mâine.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir format din N numere naturale. Pentru fiecare valoare distinctă dintr-o subsecvență cuprinsă între doi indici st si dr considerăm distanța dintre indicii primei și ultimei apariții ale acesteia în cadrul subsecvenței. Dându-se M subsecvențe de forma [st, dr], se cere să se calculeze suma distanțelor corespunzătoare tuturor valorilor distincte din subsecvență.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare calafat.in conține pe prima linie două numere natural N și M. Pe a doua linie se vor afla cele N numere din șirul dat. Pe următoarele M linii se vor afla câte două numere st și dr, cu semnificația că vrem să calculăm suma menționată mai sus pentru subsecvența [st,dr].&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire calafat.out va conține M numere naturale, câte unul pe fiecare linie, reprezentând cele M sume cerute.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N, M ≤ 200000&lt;br /&gt;
* 1 ≤ st ≤ dr ≤ N&lt;br /&gt;
* Valorile din șir se vor afla în intervalul [1, N]&lt;br /&gt;
* Pentru 20% din teste se garantează că N, M ≤ 1000&lt;br /&gt;
* Pentru alte 25% din teste se garantează că N, M ≤ 35 000 iar numărul de elemente distincte din șir este maxim 100.&lt;br /&gt;
* Pentru alte 25% din teste se garantează că N, M ≤ 70 000&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; calafat.in&lt;br /&gt;
 7 3&lt;br /&gt;
 1 3 1 2 2 1 3&lt;br /&gt;
 2 4&lt;br /&gt;
 2 7&lt;br /&gt;
 3 6&lt;br /&gt;
; calafat.out&lt;br /&gt;
 0&lt;br /&gt;
 9&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
În prima subsecvență fiecare valoare apare o singură dată, deci suma diferențelor este 0.&lt;br /&gt;
&lt;br /&gt;
În a doua subsecvență:&lt;br /&gt;
&lt;br /&gt;
* Valoarea 3 apare la indicii 2 și 7 rezultând diferența 7-2=5&lt;br /&gt;
* Valoarea 1 apare la indicii 3 și 6 =&amp;gt; diferența 6–3=3&lt;br /&gt;
* Valoarea 2 apare la indicii 4 și 5 =&amp;gt; diferența 5-4=1&lt;br /&gt;
Suma diferențelor este 9.&lt;br /&gt;
&lt;br /&gt;
În a treia subsecvență:&lt;br /&gt;
&lt;br /&gt;
* Valoarea 1 apare la indicii 3 și 6 =&amp;gt; diferența 6–3=3&lt;br /&gt;
* Valoarea 2 apare la indicii 4 și 5 =&amp;gt; diferența 5-4=1&lt;br /&gt;
Suma diferențelor este 4.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;calafat.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        sequence = list(map(int, fin.readline().split()))&lt;br /&gt;
        queries = [tuple(map(int, line.split())) for line in fin.readlines()]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;calafat.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for query in queries:&lt;br /&gt;
            st, dr = query&lt;br /&gt;
            subsequence = sequence[st-1:dr]&lt;br /&gt;
            distinct_values = set(subsequence)&lt;br /&gt;
            result = calculate_distances(subsequence, distinct_values)&lt;br /&gt;
            fout.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4087_-_vecine&amp;diff=10009</id>
		<title>4087 - vecine</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4087_-_vecine&amp;diff=10009"/>
		<updated>2024-06-03T16:43:08Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir de n cifre c1, c2, …, cn, adică 0 ≤ ci ≤ 9. Dintr-un șir de cifre se poate obține un șir de 1 ≤ m ≤ n numere a1, a2, …, am astfel:  * Inițial considerăm fiecare cifră un număr și obținem șirul de n numere ai = c1 * Un număr nou poate fi obținut prin lipirea unei secvențe de două sau mai multe numere vecine din șirul original. Două elemente dintr-un șir se numesc vecine dacă acestea se regăsesc în șir pe poziții al...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir de n cifre c1, c2, …, cn, adică 0 ≤ ci ≤ 9. Dintr-un șir de cifre se poate obține un șir de 1 ≤ m ≤ n numere a1, a2, …, am astfel:&lt;br /&gt;
&lt;br /&gt;
* Inițial considerăm fiecare cifră un număr și obținem șirul de n numere ai = c1&lt;br /&gt;
* Un număr nou poate fi obținut prin lipirea unei secvențe de două sau mai multe numere vecine din șirul original. Două elemente dintr-un șir se numesc vecine dacă acestea se regăsesc în șir pe poziții alăturate.&lt;br /&gt;
* Operația de lipire de două sau mai multe numere se poate realiza de oricâte ori atât timp cât numărul obținut este mai mic sau egal cu 2.000.000.000, nu începe cu cifra 0 și există cel puțin două numere în șir.&lt;br /&gt;
* De exemplu șirul [3, 5, 0, 2, 7, 3] poate deveni [35, 0, 2, 73] prin lipirea numerelor 3, 5 → 35 și 7, 3 → 73, care ulterior poate deveni [3502, 73] prin lipirea numerelor 35, 0, 2 → 3502. Dar nu putem crea șirul [35, 02, 73], deoarece am avea un număr care începe cu 0.&lt;br /&gt;
Două numere vecine sunt consecutive dacă primul este cu 1 mai mic decât al doilea.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscându-se șirul de cifre inițial, să se obțină următoarele rezultate:&lt;br /&gt;
&lt;br /&gt;
* Presupunând că nu se face nici o lipire de cifre, fiecare cifră devenind un număr în șir, adică ai = c1, să se determine câte perechi de numere vecine consecutive există în șir;&lt;br /&gt;
* Să se determine o modalitate de lipire a cifrelor astfel încât să se obțină cele mai mari două numere vecine consecutive și să se afișeze primul dintre aceste numere.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare vecine.in conține pe prima linie două numere p și n, p reprezentând cerința 1 sau 2, iar pe linia următoare cele n cifre, despărțite prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul de ieșire vecine.out se va afla un singur număr natural. Dacă p = 1, acesta va reprezenta răspunsul pentru cerința 1. Dacă p = 2, acesta va reprezenta răspunsul pentru cerința 2.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Pentru cerința 2 se garantează că numerele ce se pot obține nu vor depăși valoarea 2.000.000.000&lt;br /&gt;
* Tot pentru cerința 2 se garantează existența a cel puțin o pereche de numere vecine consecutive&lt;br /&gt;
* Cifra 0 poate forma singură doar numărul 0.&lt;br /&gt;
* Două numere vecine sunt consecutive dacă primul este cu 1 mai mic decât al doilea.&lt;br /&gt;
* Pentru 20 de puncte p = 1 și 3 ≤ n ≤ 100.000&lt;br /&gt;
* Pentru 80 de puncte p = 2 și 3 ≤ n ≤ 100.000&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; vecine.in&lt;br /&gt;
 1 18&lt;br /&gt;
 3 2 1 2 1 0 6 3 0 5 6 3 0 6 9 2 9 3&lt;br /&gt;
; vecine.out&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Există două perechi de numere vecine consecutive formate dintr-o singură cifră: 1, 2 și 5, 6&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; vecine.in&lt;br /&gt;
 2 18&lt;br /&gt;
 3 2 1 2 1 0 6 3 0 5 6 3 0 6 9 2 9 3&lt;br /&gt;
; vecine.out&lt;br /&gt;
 6305&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Perechea cu cele mai mari două numere vecine consecutive este 6305 și 6306. Conform cerinței s-a scris în fișier doar primul număr din pereche.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def count_consecutive_pairs(arr):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(len(arr) - 1):&lt;br /&gt;
        if abs(arr[i] - arr[i+1]) == 1:&lt;br /&gt;
            count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def find_largest_consecutive_pair(arr):&lt;br /&gt;
    max_num = arr[0]&lt;br /&gt;
    second_max_num = arr[1]&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, len(arr) - 1):&lt;br /&gt;
        if abs(arr[i] - arr[i+1]) == 1:&lt;br /&gt;
            if arr[i] &amp;gt; max_num:&lt;br /&gt;
                second_max_num = max_num&lt;br /&gt;
                max_num = arr[i]&lt;br /&gt;
            elif arr[i] &amp;gt; second_max_num:&lt;br /&gt;
                second_max_num = arr[i]&lt;br /&gt;
    &lt;br /&gt;
    return max_num&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    p, n = map(int, input().split())&lt;br /&gt;
    digits = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if p == 1:&lt;br /&gt;
        result = count_consecutive_pairs(digits)&lt;br /&gt;
        print(result)&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        result = find_largest_consecutive_pair(digits)&lt;br /&gt;
        print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3860_-_consecutive1&amp;diff=10006</id>
		<title>3860 - consecutive1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3860_-_consecutive1&amp;diff=10006"/>
		<updated>2024-06-03T16:40:02Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir (a[1], a[2], ..., a[n]) de numere naturale cuprinse între 1 și n. Se dau de asemenea Q interogări, fiecare prin două numere x, y: dacă s-ar ordona a[x], a[x+1], ..., a[y], se obține sau nu o secvență de numere consecutive? (De exemplu, 5,3,6,4 dacă e ordonată se obține 3,4,5,6, care este o secvență de numere consecutive). == Cerinţa == Dându-se Q întrebări, să se răspundă la acestea. La fiecare interogare, dacă prin sortare se o...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir (a[1], a[2], ..., a[n]) de numere naturale cuprinse între 1 și n. Se dau de asemenea Q interogări, fiecare prin două numere x, y: dacă s-ar ordona a[x], a[x+1], ..., a[y], se obține sau nu o secvență de numere consecutive? (De exemplu, 5,3,6,4 dacă e ordonată se obține 3,4,5,6, care este o secvență de numere consecutive).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se Q întrebări, să se răspundă la acestea. La fiecare interogare, dacă prin sortare se obține o secvență de numere consecutive veți afișa valoarea 1, iar în caz contrar veți afișa valoarea 0.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
De la tastatură, de pe prima linie se citește numărul natural n. Pe linia a doua se află n numere naturale reprezentând elementele șirului. Pe a treia linie se află numărul Q, iar pe următoarele Q linii se găsesc câte două numere naturale x și y, 1 ≤ x ≤ y ≤ n, reprezentând câte o interogare.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
La ecran se vor afișa pe o singură linie, fără spații, Q cifre din mulțimea {0, 1} reprezentând răspunsurile la fiecare întrebare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Pentru 10 puncte, 3 ≤ n ≤ 50, 1 ≤ Q ≤ 100&lt;br /&gt;
* Pentru 30 puncte, n ≤ 300, Q ≤ 10.000&lt;br /&gt;
* Pentru 60 puncte, 10.000 ≤ n ≤ 100.000, Q ≤ 200.000&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 9&lt;br /&gt;
 4 1 3 4 2 1 6 5 4&lt;br /&gt;
 5&lt;br /&gt;
 1 4&lt;br /&gt;
 3 5&lt;br /&gt;
 3 6&lt;br /&gt;
 5 9&lt;br /&gt;
 7 9&lt;br /&gt;
; Ieșire&lt;br /&gt;
 01101&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sunt 5 interogări.&lt;br /&gt;
Întrebarea 1: 4 1 3 4 nu obține o secvență de numere consecutive, deci răspunsul este 0.&lt;br /&gt;
Întrebarea 2: 3 4 2 obține o secvență de numere consecutive, deci răspunsul este 1.&lt;br /&gt;
Întrebarea 3: 3 4 2 1 obține o secvență de numere consecutive, deci răspunsul este 1.&lt;br /&gt;
Întrebarea 4: 2 1 6 5 4 nu obține o secvență de numere consecutive, deci răspunsul este 0.&lt;br /&gt;
Întrebarea 5: 6 5 4 obține o secvență de numere consecutive, deci răspunsul este 1.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def can_form_consecutive_sequence(arr, x, y):&lt;br /&gt;
    sorted_arr = sorted(arr[x-1:y])&lt;br /&gt;
    for i in range(1, len(sorted_arr)):&lt;br /&gt;
        if sorted_arr[i] != sorted_arr[i-1] + 1:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
    Q = int(input())&lt;br /&gt;
&lt;br /&gt;
    result = &amp;quot;&amp;quot;&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        result += &amp;quot;1&amp;quot; if can_form_consecutive_sequence(arr, x, y) else &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3778_-_Pian&amp;diff=10005</id>
		<title>3778 - Pian</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3778_-_Pian&amp;diff=10005"/>
		<updated>2024-06-03T16:38:04Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Ian este un copil pasionat de muzică, așa că părinții săi i-au cumpărat de ziua lui un pian. Pianul lui Ian este mai special, acesta are N clape. Întrucât pianul nu este nou, clapele se mișcă mai greu, astfel apăsarea celei de-a i-a clape durează t[i] secunde.  Deoarece Ian este foarte nerăbdător, s-a hotarât să repare clapele pianului pentru ca apăsarea unei clape să fie cât mai rapidă. Acesta poate selecta două clape vecine i și i+1 ce nec...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Ian este un copil pasionat de muzică, așa că părinții săi i-au cumpărat de ziua lui un pian. Pianul lui Ian este mai special, acesta are N clape. Întrucât pianul nu este nou, clapele se mișcă mai greu, astfel apăsarea celei de-a i-a clape durează t[i] secunde.&lt;br /&gt;
&lt;br /&gt;
Deoarece Ian este foarte nerăbdător, s-a hotarât să repare clapele pianului pentru ca apăsarea unei clape să fie cât mai rapidă. Acesta poate selecta două clape vecine i și i+1 ce necesită t[i], respectiv t[i+1] secunde pentru a fi apăsate și le lustruiește. În urma lustruirii, cele două clape vor necesita doar cmmdc(t[i],t[i+1]) secunde pentru apăsarea fiecăreia. Practic, o operație va efectua următoarea transformare asupra clapelor: t[i] = t[i + 1] = cmmdc(t[i], t[i+1]).&lt;br /&gt;
&lt;br /&gt;
Ian consideră ca pianul este lustruit dacă timpul de apăsare al fiecărei clape este minim posibil.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
* Cerința 1: Ian vrea să facă un riff (adică să apese fiecare clapă o singură dată) și vrea să știe care ar fi durata de timp a unui riff pe pianul lustruit.&lt;br /&gt;
* Cerința 2: Pentru că Ian nu are timp de pierdut cu lustruitul, acesta vrea o listă de instrucțiuni de lungime minimă asfel încât dupa efectuarea instrucțiunilor pianul să fie lustruit.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare pian.in conține pe prima linie numărul C ce reprezintă cerința care trebuie rezolvată. Pe următoarea linie se află N, numărul de clape ale pianului. Pe următoarea linie se vor afla N numere separate prin câte un spațiu, al i-lea număr reprezentând durata inițială t[i] necesară pentru apăsarea clapei cu indicele i.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul pian.out se vor afișa în funcție de cerință următoarele:&lt;br /&gt;
&lt;br /&gt;
* Dacă C = 1, atunci fișierul va conține o singură linie cu un singur număr S, ce reprezintă răspunsul pentru prima cerință.&lt;br /&gt;
* Dacă C = 2, atunci fișierul va conține pe prima linie un număr M care reprezintă numarul minim de operații pe care Ian trebuie să le facă, iar pe următoarea linie M numere separate prin câte un spatiu, al i-lea număr x[i], reprezentând faptul că a i-a operație de lustruire a clapelor se va face între clapele cu indicii x[i] și x[i]+1.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* C ∈ {1, 2}&lt;br /&gt;
* 1 ≤ N ≤ 100.000&lt;br /&gt;
* 1 ≤ v[i] ≤ 1.000.000, pentru orice i ∈ {1, 2, ..., N}&lt;br /&gt;
* 1 ≤ x[j] &amp;lt; N, pentru orice j ∈ {1, 2, ..., M}&lt;br /&gt;
* Daca pentru cerința 2 există mai multe soluții cu număr minim de operații se acceptă oricare.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; pian.in&lt;br /&gt;
 1&lt;br /&gt;
 5&lt;br /&gt;
 2 4 6 8 10&lt;br /&gt;
; pian.out&lt;br /&gt;
 10&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Ian poate lustrui pianul în doar 2 instrucțiuni în următorul mod:&lt;br /&gt;
&lt;br /&gt;
* Aplicăm operația pe clapele 2 și 3. Obținem șirul 2 2 2 8 10&lt;br /&gt;
* Aplicăm operația pe clapele 4 și 5. Obținem șirul 2 2 2 2 2&lt;br /&gt;
În final se va obține șirul de clape: 2 2 2 2 2. Astfel, durata unui riff va fi de 10 secunde.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; pian.in&lt;br /&gt;
 2&lt;br /&gt;
 5&lt;br /&gt;
 2 4 6 8 10&lt;br /&gt;
; pian.out&lt;br /&gt;
 2&lt;br /&gt;
 2 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
from math import gcd&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    C = int(input())&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    times = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if C == 1:&lt;br /&gt;
        # Cerința 1&lt;br /&gt;
        total_time = 0&lt;br /&gt;
        for i in range(N):&lt;br /&gt;
            total_time += gcd(times[i], times[i + 1]) if i &amp;lt; N - 1 else times[i]&lt;br /&gt;
        print(total_time)&lt;br /&gt;
    elif C == 2:&lt;br /&gt;
        # Cerința 2&lt;br /&gt;
        operations = []&lt;br /&gt;
        for i in range(N):&lt;br /&gt;
            if gcd(times[i], times[i + 1]) &amp;lt; times[i] or gcd(times[i], times[i + 1]) &amp;lt; times[i + 1]:&lt;br /&gt;
                operations.append(i + 1)&lt;br /&gt;
        print(len(operations))&lt;br /&gt;
        print(*operations)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3759_-_Cartita&amp;diff=10002</id>
		<title>3759 - Cartita</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3759_-_Cartita&amp;diff=10002"/>
		<updated>2024-06-03T16:34:34Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == În grădina lui Macarie există un șir de N morcovi, numerotați de la 1 la N. Ca să știe unde sunt plantați, Macarie a făcut câte o grămăjoară de pământ în dreptul fiecărui morcov și a notat înălțimea fiecăreia exprimată în centimetri. Astfel morcovul i are în dreptul său o grămăjoară de pământ cu înălțimea de h[i] centimetri.  O cârtiță neastâmpărată sapă galerii subterane pe sub morcovii lui Macarie. Când sapă o galerie c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
În grădina lui Macarie există un șir de N morcovi, numerotați de la 1 la N. Ca să știe unde sunt plantați, Macarie a făcut câte o grămăjoară de pământ în dreptul fiecărui morcov și a notat înălțimea fiecăreia exprimată în centimetri. Astfel morcovul i are în dreptul său o grămăjoară de pământ cu înălțimea de h[i] centimetri.&lt;br /&gt;
&lt;br /&gt;
O cârtiță neastâmpărată sapă galerii subterane pe sub morcovii lui Macarie. Când sapă o galerie către un morcov, tot pământul rezultat îl scoate afară modificând astfel înălțimea grămăjoarei corespunzătoare acelui morcov, dar și ale celorlalți morcovi din grădină.&lt;br /&gt;
&lt;br /&gt;
Dacă în urma săpării unei galerii către morcovul de pe poziția pos înălțimea grămăjoarei lui a crescut cu x centimetri, atunci înălțimile grămăjoarelor tuturor morcovilor se modifică după următoarea regulă ce depinde de un număr K:&lt;br /&gt;
&lt;br /&gt;
* înălțimea grămăjoarei morcovului pos - 1 se modifică cu x - K centimetri iar a morcovului pos + 1 cu x + K centimetri,&lt;br /&gt;
* înălțimile gramăjoarelor morcovilor pos - 2 și pos + 2 se modifică cu x - 2 * K respectiv x + 2 * K centimetri&lt;br /&gt;
* În caz general, înălțimea se modifică după următoarele reguli pentru fiecare morcov din grădină:&lt;br /&gt;
- Înălțimea h[pos - i] devine h[pos - i] + x - i * K, pentru fiecare i, 1 ≤ i ≤ pos-1&lt;br /&gt;
- Înălțimea h[pos + i] devine h[pos + i] + x + i * K, pentru fiecare i, 1 ≤ i ≤ N-pos&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se cunosc înălțimile inițiale ale tuturor celor N grămăjoare și cele U modificări făcute de cârtiță asupra înălțimilor grămăjoarelor de pământ ale morcovilor. Știm că în cadrul unei secvențe continue de morcovi cel mai tentant pentru cârtiță este morcovul cu cea mai mică înălțime a grămăjoarei de pământ. Ajutați-l pe Macarie să identifice înălțimea grămăjoarei celui mai tentant morcov, pentru mai multe intervale date, după efectuarea tuturor modificărilor realizate de cârtiță.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare cartita.in conţine pe prima linie un număr natural N având semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
Pe următoarea linie se află N numere naturale despărțite prin câte un spațiu, reprezentând în ordine, înălțimile grămăjoarelor de pământ, al i-lea număr reprezentând înălțimea inițială h[i], a grămăjoarei din dreptul morcovului i.&lt;br /&gt;
&lt;br /&gt;
Pe a treia linie se află un număr natural U reprezentând numărul de morcovi către care cărtița a săpat galerii.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele U linii se află câte un triplet de numere naturale pos, x, K, separate între ele prin câte un spațiu, cu semnificația că în urma săpării unei galerii către morcovul pos înălțimea grămăjoarei lui a crescut cu x centimetri, iar celelalte înălțimi se modifică, după regula descrisă în enunț.&lt;br /&gt;
&lt;br /&gt;
Pe următoarea linie se găsește numărul Q reprezentând numărul de intervale unde se dorește identificarea înălțimii minime a unei grămăjoare corespunzătoare celui mai tentant morcov.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele Q linii sunt câte două numere naturale L, R, separate între ele printr-un spațiu, reprezentând capetele intervalului de morcovi investigat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire cartita.out va conţine Q linii, pe fiecare găsindu-se, în ordine, răspunsul la intervalele investigate.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100.000&lt;br /&gt;
* 1 ≤ U ≤ 300.000&lt;br /&gt;
* 1 ≤ Q ≤ 200.000&lt;br /&gt;
* 1 ≤ L ≤ R ≤ N&lt;br /&gt;
* Inițial 1 ≤ h[i] ≤ N, pentru fiecare i, 1 ≤ i ≤ N&lt;br /&gt;
* 1 ≤ pos ≤ N, 1 ≤ x ≤ 400 și -21 ≤ K ≤ 21, K ≠ 0&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; cartita.in&lt;br /&gt;
 6&lt;br /&gt;
 1 6 2 4 3 4&lt;br /&gt;
 3&lt;br /&gt;
 4 5 2&lt;br /&gt;
 2 4 1&lt;br /&gt;
 4 2 8&lt;br /&gt;
 3&lt;br /&gt;
 1 6&lt;br /&gt;
 2 4&lt;br /&gt;
 4 4&lt;br /&gt;
; cartita.in&lt;br /&gt;
 -19&lt;br /&gt;
 -3&lt;br /&gt;
 17&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
* După prima galerie săpată către morcovul 4, șirul înălțimilor celor N=6 grămăjoare a devenit (0, 7, 5, 9, 10, 13).&lt;br /&gt;
* După a doua galerie săpată către morcovul 2, șirul înălțimilor celor N=6 grămăjoare a devenit (3, 11, 10, 15, 17, 21).&lt;br /&gt;
* După a treia galerie săpată către morcovul 4, șirul înălțimilor celor N=6 grămăjoare a devenit (-19, -3, 4, 17, 27, 39)&lt;br /&gt;
* Pe intervalul [1,6], înălțimea minimă este -19, pe intervalul [2,4], înălțimea minimă este -3, iar pentru ultimul interval investigat [4,4] înălțimea minimă este 17.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
from math import inf&lt;br /&gt;
&lt;br /&gt;
class SegmentTree:&lt;br /&gt;
    def __init__(self, arr):&lt;br /&gt;
        self.n = len(arr)&lt;br /&gt;
        self.tree = [0] * (4 * self.n)&lt;br /&gt;
        self.construct_segment_tree(arr, 0, self.n - 1, 0)&lt;br /&gt;
    &lt;br /&gt;
    def construct_segment_tree(self, arr, start, end, idx):&lt;br /&gt;
        if start == end:&lt;br /&gt;
            self.tree[idx] = arr[start]&lt;br /&gt;
            return&lt;br /&gt;
        mid = (start + end) // 2&lt;br /&gt;
        self.construct_segment_tree(arr, start, mid, 2 * idx + 1)&lt;br /&gt;
        self.construct_segment_tree(arr, mid + 1, end, 2 * idx + 2)&lt;br /&gt;
        self.tree[idx] = min(self.tree[2 * idx + 1], self.tree[2 * idx + 2])&lt;br /&gt;
    &lt;br /&gt;
    def update(self, pos, val, start, end, idx):&lt;br /&gt;
        if start == end:&lt;br /&gt;
            self.tree[idx] += val&lt;br /&gt;
            return&lt;br /&gt;
        mid = (start + end) // 2&lt;br /&gt;
        if pos &amp;lt;= mid:&lt;br /&gt;
            self.update(pos, val, start, mid, 2 * idx + 1)&lt;br /&gt;
        else:&lt;br /&gt;
            self.update(pos, val, mid + 1, end, 2 * idx + 2)&lt;br /&gt;
        self.tree[idx] = min(self.tree[2 * idx + 1], self.tree[2 * idx + 2])&lt;br /&gt;
    &lt;br /&gt;
    def query(self, left, right, start, end, idx):&lt;br /&gt;
        if left &amp;gt; end or right &amp;lt; start:&lt;br /&gt;
            return inf&lt;br /&gt;
        if left &amp;lt;= start and right &amp;gt;= end:&lt;br /&gt;
            return self.tree[idx]&lt;br /&gt;
        mid = (start + end) // 2&lt;br /&gt;
        return min(self.query(left, right, start, mid, 2 * idx + 1),&lt;br /&gt;
                   self.query(left, right, mid + 1, end, 2 * idx + 2))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    heights = list(map(int, input().split()))&lt;br /&gt;
    U = int(input())&lt;br /&gt;
    changes = []&lt;br /&gt;
    for _ in range(U):&lt;br /&gt;
        pos, x, K = map(int, input().split())&lt;br /&gt;
        changes.append((pos, x, K))&lt;br /&gt;
&lt;br /&gt;
    tree = SegmentTree(heights)&lt;br /&gt;
    &lt;br /&gt;
    Q = int(input())&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        L, R = map(int, input().split())&lt;br /&gt;
        min_height = inf&lt;br /&gt;
        for pos, x, K in changes:&lt;br /&gt;
            min_height = min(min_height, tree.query(L - 1, R - 1, 0, N - 1, 0) + x - abs(L - pos) * K)&lt;br /&gt;
        print(min_height)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3729_-_Exclusiv&amp;diff=10001</id>
		<title>3729 - Exclusiv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3729_-_Exclusiv&amp;diff=10001"/>
		<updated>2024-06-03T16:31:19Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se consideră doi vectori care conțin numere naturale: s cu M elemente și v cu N elemente. Numim secvență i-exclusivă o secvență a vectorului s care nu conține niciuna dintre valorile v[1], v[2], …, v[i]. == Cerinţa == Scrieți un program care să determine, pentru orice 1 ≤ i ≤ N, lungimea maximă a unei secvențe i-exclusive. == Date de intrare == Fișierul de intrare exclusiv.in conține pe prima linie numerele naturale M și N. Pe linia a doua s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se consideră doi vectori care conțin numere naturale: s cu M elemente și v cu N elemente. Numim secvență i-exclusivă o secvență a vectorului s care nu conține niciuna dintre valorile v[1], v[2], …, v[i].&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieți un program care să determine, pentru orice 1 ≤ i ≤ N, lungimea maximă a unei secvențe i-exclusive.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare exclusiv.in conține pe prima linie numerele naturale M și N. Pe linia a doua se află M numere naturale reprezentând elementele vectorului s, iar pe linia a treia N numere naturale reprezentând elementele vectorului v. Valorile scrise pe aceeași linie sunt separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire exclusiv.out va conține N linii. Pe linia i (1 ≤ i ≤ N) va fi scris un număr natural care reprezintă lungimea maximă a unei secvențe i-exclusive.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 2.000&lt;br /&gt;
* 3 ≤ M ≤ 100.000&lt;br /&gt;
* Vectorii s și v conțin numere naturale mai mici sau egale cu 2.000.000.000, memorate începând cu poziția 1&lt;br /&gt;
* Valorile din fiecare vector nu sunt obligatoriu distincte două câte două.&lt;br /&gt;
* O subsecvență nevidă în s este formată din elemente situate pe poziții consecutive (s[i], s[i + 1], …, s[j]), i ≤ j. O subsecvență i-exclusivă poate fi și vidă, lungimea ei fiind 0.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; exclusiv.in&lt;br /&gt;
 20 6&lt;br /&gt;
 11 5 11 7 2 10 11 9 2 77 88 88 88 2 7 2 2 77 2 11 &lt;br /&gt;
 11 5 7 9 5 2&lt;br /&gt;
; exclusiv.out&lt;br /&gt;
 12&lt;br /&gt;
 12&lt;br /&gt;
 7&lt;br /&gt;
 6&lt;br /&gt;
 6&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Cea mai lungă secvență 1-exclusivă (care nu conține valoarea 11) este 9 2 77 88 88 88 2 7 2 2 77 2 și are lungimea 12.&lt;br /&gt;
Cea mai lungă secvență 2-exclusivă (care nu conține valorile 11 și 5) este 9 2 77 88 88 88 2 7 2 2 77 2 și are lungimea 12.&lt;br /&gt;
Cea mai lungă secvență 3-exclusivă (care nu conține valorile 11, 5 și 7) este 9 2 77 88 88 88 2 și are lungimea 7.&lt;br /&gt;
Cea mai lungă secvență 4-exclusivă (care nu conține valorile 11, 5, 7 și 9) este 2 77 88 88 88 2 și are&lt;br /&gt;
lungimea 6.&lt;br /&gt;
Cea mai lungă secvență 5-exclusivă (care nu conține valorile 11, 5 7, 9 și 5) este 2 77 88 88 88 2 și are lungimea 6.&lt;br /&gt;
Cea mai lungă secvență 6-exclusivă (care nu conține valorile 11, 5, 7, 9, 5 și 2) este 77 88 88 88 și are lungimea 4.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def longest_exclusive_sequence(s, v):&lt;br /&gt;
    last_position = {value: -1 for value in v}&lt;br /&gt;
    longest_sequence = 0&lt;br /&gt;
    current_sequence = 0&lt;br /&gt;
&lt;br /&gt;
    for value in s:&lt;br /&gt;
        if value in last_position:&lt;br /&gt;
            current_sequence = min(current_sequence + 1, 1 + last_position[value])&lt;br /&gt;
        else:&lt;br /&gt;
            current_sequence += 1&lt;br /&gt;
        last_position[value] = current_sequence&lt;br /&gt;
        longest_sequence = max(longest_sequence, current_sequence)&lt;br /&gt;
&lt;br /&gt;
    return longest_sequence&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    M, N = map(int, input().split())&lt;br /&gt;
    s = list(map(int, input().split()))&lt;br /&gt;
    v = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        result.append(longest_exclusive_sequence(s, v[:i+1]))&lt;br /&gt;
&lt;br /&gt;
    for length in result:&lt;br /&gt;
        print(length)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3695_-_iziStack&amp;diff=9999</id>
		<title>3695 - iziStack</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3695_-_iziStack&amp;diff=9999"/>
		<updated>2024-06-03T16:29:11Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă o stivă vidă. Elementele stivei sunt numerotate incepand cu 1 de la bază înspre vârf. Avem de procesat T comenzi de tipurile:  * 0 x – elementul x se va adăuga în vârful stivei * 1 x y add – tuturor elementelor din intervalul x y le va fi adăugată valoarea add * 2 – eliminarea elementului din vârf == Cerinţa == Afisați dupa fiecare operație elementul din vârful stivei. Se garantează: 1. că nu se va efectua operația de tip 2 dacă nu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă o stivă vidă. Elementele stivei sunt numerotate incepand cu 1 de la bază înspre vârf. Avem de procesat T comenzi de tipurile:&lt;br /&gt;
&lt;br /&gt;
* 0 x – elementul x se va adăuga în vârful stivei&lt;br /&gt;
* 1 x y add – tuturor elementelor din intervalul x y le va fi adăugată valoarea add&lt;br /&gt;
* 2 – eliminarea elementului din vârf&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Afisați dupa fiecare operație elementul din vârful stivei.&lt;br /&gt;
Se garantează:&lt;br /&gt;
1. că nu se va efectua operația de tip 2 dacă nu există cel puțin două elemente în stivă;&lt;br /&gt;
2. că prima operatie va fi de tipul 0&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare izi.in conține pe prima linie un număr natural T, iar pe următoarele T linii operațiile efectuate asupra stivei.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire izi.out va conține T linii, reprezentând elementele din vârful stivei dupa fiecare operație.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ T ≤ 1.000.000&lt;br /&gt;
* -1000 ≤ add ≤ 1000&lt;br /&gt;
* Pentru operațiile de tip 1, -1000 ≤ x ≤ 1000, iar pentru operatiile de tip 2 numărul elementelor aflate în stivă este mai mare ca y&lt;br /&gt;
* Pentru 36 puncte: 1 ≤ T ≤ 1000&lt;br /&gt;
* Pentru alte 33 puncte: Toate operatiile de tip 2 se vor afla la finalul fișierului de intrare&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; izi.in&lt;br /&gt;
 7&lt;br /&gt;
 0 1&lt;br /&gt;
 1 1 1 2&lt;br /&gt;
 0 2&lt;br /&gt;
 1 1 2 3&lt;br /&gt;
 2&lt;br /&gt;
 0 4&lt;br /&gt;
 2&lt;br /&gt;
; izi.out&lt;br /&gt;
 1&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
 5&lt;br /&gt;
 6&lt;br /&gt;
 4&lt;br /&gt;
 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
class Stack:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.stack = []&lt;br /&gt;
&lt;br /&gt;
    def push(self, x):&lt;br /&gt;
        self.stack.append(x)&lt;br /&gt;
&lt;br /&gt;
    def pop(self):&lt;br /&gt;
        if self.is_empty():&lt;br /&gt;
            return None&lt;br /&gt;
        return self.stack.pop()&lt;br /&gt;
&lt;br /&gt;
    def top(self):&lt;br /&gt;
        if self.is_empty():&lt;br /&gt;
            return None&lt;br /&gt;
        return self.stack[-1]&lt;br /&gt;
&lt;br /&gt;
    def is_empty(self):&lt;br /&gt;
        return len(self.stack) == 0&lt;br /&gt;
&lt;br /&gt;
def process_operations(T, operations):&lt;br /&gt;
    stack = Stack()&lt;br /&gt;
    for op in operations:&lt;br /&gt;
        if op[0] == 0:&lt;br /&gt;
            stack.push(op[1])&lt;br /&gt;
        elif op[0] == 1:&lt;br /&gt;
            x, y, add = op[1], op[2], op[3]&lt;br /&gt;
            for i in range(x - 1, y):&lt;br /&gt;
                stack.stack[i] += add&lt;br /&gt;
        elif op[0] == 2:&lt;br /&gt;
            stack.pop()&lt;br /&gt;
        if not stack.is_empty():&lt;br /&gt;
            print(stack.top())&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    T = int(input())&lt;br /&gt;
    operations = []&lt;br /&gt;
    for _ in range(T):&lt;br /&gt;
        operation = list(map(int, input().split()))&lt;br /&gt;
        operations.append(operation)&lt;br /&gt;
    process_operations(T, operations)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3436_-_Wind&amp;diff=9997</id>
		<title>3436 - Wind</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3436_-_Wind&amp;diff=9997"/>
		<updated>2024-06-03T16:26:06Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Domnul Vânt a pus pe marginea unei șosele N centrale eoliene, dintre care unele produc energie electrică, iar altele, deocamdată, doar consumă energie. El a etichetat centralele cu numerele naturale distincte de la 1 la N, în ordinea poziționării lor pe șosea. Fiecare centrală eoliană are la bază un ecran pe care este afișat un număr întreg, reprezentând cantitatea de energie pe care o produce (dacă numărul este pozitiv) sau pe care o consumă (d...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Domnul Vânt a pus pe marginea unei șosele N centrale eoliene, dintre care unele produc energie electrică, iar altele, deocamdată, doar consumă energie. El a etichetat centralele cu numerele naturale distincte de la 1 la N, în ordinea poziționării lor pe șosea. Fiecare centrală eoliană are la bază un ecran pe care este afișat un număr întreg, reprezentând cantitatea de energie pe care o produce (dacă numărul este pozitiv) sau pe care o consumă (dacă numărul este negativ).&lt;br /&gt;
&lt;br /&gt;
Pentru a construi corect k orașe de-a lungul acestei șosele, un arhitect trebuie să aibă în vedere că:&lt;br /&gt;
&lt;br /&gt;
* fiecărui oraș îi va fi atribuit câte un grup format din centrale eoliene vecine pe șosea, toate grupurile având același număr de centrale;&lt;br /&gt;
* cantitatea de energie repartizată unui oraș este egală cu suma numerelor afișate pe ecranele centralelor&lt;br /&gt;
eoliene din grupul atribuit; uneori este posibil ca, deocamdată, suma obținută să fie negativă;&lt;br /&gt;
* fiecare dintre cele N centrale eoliene trebuie să fie atribuită unui oraș;&lt;br /&gt;
* factorul de dezechilibru, notat cu P(k), este valoarea maximă a diferenței dintre energiile repartizate oricăror două orașe diferite, dintre cele k.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieți un program care citește numărul N, valorile afișate pe cele N ecrane ale centralelor eoliene și rezolvă următoarele două cerinţe:&lt;br /&gt;
&lt;br /&gt;
* afișează numărul M de moduri în care se pot grupa cele N centrale pentru construcția corectă de orașe;&lt;br /&gt;
* afișează numărul maxim X de orașe ce pot fi construite corect, dintre cele care au factorul de dezechilibru minim, precum și eticheta E a primei centrale eoliene atribuită orașului cu cea mai mare cantitate de energie repartizată, dintre cele X orașe; dacă sunt mai multe astfel de orașe, se ia în considerare cel care are atribuite centrale etichetate cu numere mai mari.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare wind.in conține pe prima linie un număr natural C reprezentând cerința care trebuie rezolvată (1 sau 2). A doua linie a fișierului conține un număr natural N, cu semnificația din enunț. A treia linie din fișier conține N numere întregi, separate prin câte un spațiu, reprezentând valorile afișate pe cele N ecrane ale centralelor eoliene, în ordinea poziționării acestora pe șosea.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire wind.out va conține pe prima linie:&lt;br /&gt;
&lt;br /&gt;
* dacă C=1, numărul natural M, reprezentând răspunsul la cerința 1;&lt;br /&gt;
* dacă C=2, cele două numere naturale X și E, în această ordine, separate printr-un singur spațiu,&lt;br /&gt;
reprezentând răspunsul la cerința 2.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ N ≤ 100000, N număr natural;&lt;br /&gt;
* Numerele afișate pe ecranele centralelor sunt numere întregi formate din cel mult nouă cifre;&lt;br /&gt;
* Se vor construi minimum 2 orașe;&lt;br /&gt;
* În concurs, pentru rezolvarea cerinței 1 s-au acordat 20 de puncte, pentru rezolvarea cerinței 2 s-au acordat 70 de puncte. Pe site se acordă 10 puncte pentru exemple.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; wind.in&lt;br /&gt;
 1&lt;br /&gt;
 12&lt;br /&gt;
 2 4 -5 12 3 5 -6 4 5 7 -8 2&lt;br /&gt;
; wind.out&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Cerința este 1. Centralele eoliene se pot grupa câte 1, câte 2, câte 3, câte 4 sau câte 6.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; wind.in&lt;br /&gt;
 2&lt;br /&gt;
 12&lt;br /&gt;
 2 4 -5 12 3 5 -6 4 5 7 -8 2&lt;br /&gt;
; wind.out&lt;br /&gt;
 3 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Cerința este 2. Posibilitățile de grupare:&lt;br /&gt;
&lt;br /&gt;
* câte 1 centrală/oraș (sumele sunt 2, 4, -5, …, 2; P(12)=20=12-(-8));&lt;br /&gt;
* câte 2 centrale/oraș (sumele sunt: 6, 7, 8, -2, 12, -6; P(6)=18=12-(-6));&lt;br /&gt;
* câte 3 centrale/oraș (sumele sunt: 1, 20, 3, 1; P(4)=19=20-1);&lt;br /&gt;
* câte 4 centrale/oraș (sumele sunt: 13, 6, 6; P(3)=7=13-6);&lt;br /&gt;
* câte 6 centrale/oraș (sumele sunt: 21 si 4; P(2)=17=21-4).&lt;br /&gt;
Astfel, factorul de dezechilibru minim este P(3)=7, deci X=3. Pentru această grupare a centralelor, orașul cu cantitatea maximă de energie (13) corespunde primului grup, care începe cu centrala etichetată cu E=1.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def calculate_divisors(n):&lt;br /&gt;
    divisors = []&lt;br /&gt;
    for i in range(1, int(n**0.5) + 1):&lt;br /&gt;
        if n % i == 0:&lt;br /&gt;
            divisors.append(i)&lt;br /&gt;
            if i != n // i:&lt;br /&gt;
                divisors.append(n // i)&lt;br /&gt;
    return divisors&lt;br /&gt;
&lt;br /&gt;
def imbalance_factor(groups):&lt;br /&gt;
    max_energy = max(sum(group) for group in groups)&lt;br /&gt;
    min_energy = min(sum(group) for group in groups)&lt;br /&gt;
    return max_energy - min_energy&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    task = int(input())&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    energies = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if task == 1:&lt;br /&gt;
        divisors = calculate_divisors(N)&lt;br /&gt;
        print(len(divisors))&lt;br /&gt;
    elif task == 2:&lt;br /&gt;
        divisors = calculate_divisors(N)&lt;br /&gt;
        min_imbalance = float(&#039;inf&#039;)&lt;br /&gt;
        max_cities = 0&lt;br /&gt;
        best_start = 0&lt;br /&gt;
&lt;br /&gt;
        for divisor in divisors:&lt;br /&gt;
            groups = [energies[i:i + divisor] for i in range(0, N, divisor)]&lt;br /&gt;
            imbalance = imbalance_factor(groups)&lt;br /&gt;
            if imbalance &amp;lt; min_imbalance:&lt;br /&gt;
                min_imbalance = imbalance&lt;br /&gt;
                max_cities = len(groups)&lt;br /&gt;
                best_start = sum(groups[0])&lt;br /&gt;
&lt;br /&gt;
        print(max_cities, best_start)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3085_-_fsecv&amp;diff=9993</id>
		<title>3085 - fsecv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3085_-_fsecv&amp;diff=9993"/>
		<updated>2024-06-03T16:22:24Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se consideră un șir A format din N numere întregi, numerotate de la 1 la N. Numim secvență a șirului A orice succesiune de elemente consecutive din șir de forma A[i], A[i+1], …, A[j], cu 0 &amp;lt; i &amp;lt; j ≤ N. == Cerinţa == Fiind dat șirul A cu N numere întregi se cere să se răspundă la Q întrebări de forma: i j k (0 &amp;lt; i &amp;lt; j ≤ N). Pentru fiecare întrebare se cere să se determine câte numere din secvența A[i], …, A[j] au frecvența de apariții e...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se consideră un șir A format din N numere întregi, numerotate de la 1 la N. Numim secvență a șirului A orice succesiune de elemente consecutive din șir de forma A[i], A[i+1], …, A[j], cu 0 &amp;lt; i &amp;lt; j ≤ N.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat șirul A cu N numere întregi se cere să se răspundă la Q întrebări de forma: i j k (0 &amp;lt; i &amp;lt; j ≤ N). Pentru fiecare întrebare se cere să se determine câte numere din secvența A[i], …, A[j] au frecvența de apariții egală cu k.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare fsecv.in conține pe prima linie numerele naturale nenule N și Q cu semnificația din enunț. Pe următoarea linie se găsesc N numere întregi ce reprezintă valorile șirului A. Pe următoarele linii se află descrierea celor Q întrebări, câte una pe linie, în formatul precizat i j k.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire fsecv.out va conține Q linii. Pe fiecare linie se va găsi răspunsul întrebării i, cu 1 ≤ i ≤ Q.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 &amp;lt; N ≤ 100.000&lt;br /&gt;
* 1 &amp;lt; Q ≤ 100.000&lt;br /&gt;
* 0 &amp;lt; k ≤ N&lt;br /&gt;
* -100.000 ≤ A[i] ≤ 100.000; 1 ≤ i ≤ N&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; fsecv.in&lt;br /&gt;
 11 3&lt;br /&gt;
 1 2 4 3 2 5 6 4 5 2 1&lt;br /&gt;
 1 6 2&lt;br /&gt;
 2 7 3&lt;br /&gt;
 4 11 1&lt;br /&gt;
; fsecv.out&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Secvența la care se referă prima întrebare este 1,2,4,3,2,5, iar răspunsul este egal cu 1.&lt;br /&gt;
Secvența la care se referă a doua întrebare este 2,4,3,2,5,6, iar răspunsul este egal cu 0.&lt;br /&gt;
Secvența la care se referă a treia întrebare este 3,2,5,6,4,5,2,1, iar răspunsul este egal cu 4.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def count_elements_with_frequency(sequence, k):&lt;br /&gt;
    frequency = {}&lt;br /&gt;
    for num in sequence:&lt;br /&gt;
        if num in frequency:&lt;br /&gt;
            frequency[num] += 1&lt;br /&gt;
        else:&lt;br /&gt;
            frequency[num] = 1&lt;br /&gt;
&lt;br /&gt;
    count = 0&lt;br /&gt;
    for num in sequence:&lt;br /&gt;
        if frequency[num] == k:&lt;br /&gt;
            count += 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    N, Q = map(int, input().split())&lt;br /&gt;
    sequence = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    # Procesarea întrebărilor&lt;br /&gt;
    answers = []&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        i, j, k = map(int, input().split())&lt;br /&gt;
        count = count_elements_with_frequency(sequence[i-1:j], k)&lt;br /&gt;
        answers.append(count)&lt;br /&gt;
&lt;br /&gt;
    # Afisarea rezultatului&lt;br /&gt;
    for count in answers:&lt;br /&gt;
        print(count)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4169_-_Switch_Letters&amp;diff=9991</id>
		<title>4169 - Switch Letters</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4169_-_Switch_Letters&amp;diff=9991"/>
		<updated>2024-06-03T16:19:35Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir s = s0, s1,…, sn-1 de n litere mici. Prin s[i..j] se înțelege secvența si, si+1, …, sj. Asupra șirului se efectuează de mai multe ori operația switch(i,j,c1,c2), care în secvența s[i..j] modifică orice apariție a literei c1 în litera c2. De exemplu, dacă s=abcdaabcdaaab, atunci switch(0,5,&amp;#039;a&amp;#039;,&amp;#039;z&amp;#039;) face ca șirul să devină s=zbcdzzbcdaaab. == Cerinţa == Dându-se șirul s și m operații switch, să se afișeze șirul s după efect...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir s = s0, s1,…, sn-1 de n litere mici. Prin s[i..j] se înțelege secvența si, si+1, …, sj. Asupra șirului se efectuează de mai multe ori operația switch(i,j,c1,c2), care în secvența s[i..j] modifică orice apariție a literei c1 în litera c2. De exemplu, dacă s=abcdaabcdaaab, atunci switch(0,5,&#039;a&#039;,&#039;z&#039;) face ca șirul să devină s=zbcdzzbcdaaab.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se șirul s și m operații switch, să se afișeze șirul s după efectuarea celor m operații.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare switchletters.in conține pe prima linie șirul s, pe a doua linie numărul natural m, iar pe următoarele m linii se află câte două numere naturale și două litere mici ale alfabetului englez, separate prin câte un spațiu i j c1 c2, reprezentând operația switch(i,j,c1,c2).&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire switchletters.out va conține șirul s după efectuarea celor m operații.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Șirul s conține cel mult 1.000.000 litere mici: 1 ≤ n ≤ 1.000.000.&lt;br /&gt;
* Șirul s nu conține alte caractere în afară de litere mici.&lt;br /&gt;
* Într-o operație switch(i,j,c1,c2), întotdeauna 0 ≤ i ≤ j &amp;lt; n, iar c1 ≠ c2.&lt;br /&gt;
* 1 ≤ m ≤ 217.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; switchletters.in&lt;br /&gt;
 aaaabbbbcccc&lt;br /&gt;
 3&lt;br /&gt;
 0 2 a y&lt;br /&gt;
 5 9 b c&lt;br /&gt;
 1 3 a z&lt;br /&gt;
; switchletters.out&lt;br /&gt;
 yyyzbccccccc&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Pentru primul exemplu, După operația switch(0,2,’a’,’y’), s=yyyabbbbcccc.&lt;br /&gt;
După operația switch(5,9,’b’,’c’), s=yyyabccccccc.&lt;br /&gt;
După operația switch(1,3,’a’,’z’), s=yyyzbccccccc&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; switchletters.in&lt;br /&gt;
 anaaremere&lt;br /&gt;
 2&lt;br /&gt;
 3 6 z y&lt;br /&gt;
 2 7 o x&lt;br /&gt;
; switchletters.out&lt;br /&gt;
 anaaremere&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
s rămâne neschimbat, deoarece literele z și o nu apar în șir.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def switch_letters(s, operations):&lt;br /&gt;
    for op in operations:&lt;br /&gt;
        i, j, c1, c2 = op&lt;br /&gt;
        for k in range(i, j+1):&lt;br /&gt;
            if s[k] == c1:&lt;br /&gt;
                s[k] = c2&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    s = list(input().strip())&lt;br /&gt;
    m = int(input().strip())&lt;br /&gt;
    operations = [list(input().split()) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Conversia indicele și literelor la valorile numerice corespunzătoare&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        operations[i][0] = int(operations[i][0])&lt;br /&gt;
        operations[i][1] = int(operations[i][1])&lt;br /&gt;
&lt;br /&gt;
    # Aplicarea operațiilor switch&lt;br /&gt;
    switch_letters(s, operations)&lt;br /&gt;
&lt;br /&gt;
    # Afisarea rezultatului&lt;br /&gt;
    print(&amp;quot;&amp;quot;.join(s))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3772_-_Joc_Cu_Lasere&amp;diff=9988</id>
		<title>3772 - Joc Cu Lasere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3772_-_Joc_Cu_Lasere&amp;diff=9988"/>
		<updated>2024-06-03T16:16:07Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == RAU-Gigel testează un joc cu trageri și premii. Jocul constă într-o serie de acțiuni care au loc la anumite momente de timp. Acțiunile pot fi: (1) aparițiile unor premii sau (2) trageri. Premiile apar la anumite înălțimi, pentru un interval de timp bine definit. Tragerile au loc la anumite momente de timp și se propagă în spațiu instantaneu. RAU-Gigel câștigă câte un punct pentru fiecare premiu ochit.  Din păcate, RAU-Gigel nu și-a calibrat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
RAU-Gigel testează un joc cu trageri și premii. Jocul constă într-o serie de acțiuni care au loc la anumite momente de timp. Acțiunile pot fi: (1) aparițiile unor premii sau (2) trageri. Premiile apar la anumite înălțimi, pentru un interval de timp bine definit. Tragerile au loc la anumite momente de timp și se propagă în spațiu instantaneu. RAU-Gigel câștigă câte un punct pentru fiecare premiu ochit.&lt;br /&gt;
&lt;br /&gt;
Din păcate, RAU-Gigel nu și-a calibrat bine trăgătorul, astfel încât fiecare tragere devine activă numai între două înălțimi date: [h1, h2], interval numit rază de acțiune. Așadar, RAU-Gigel nu va câștiga puncte decât pentru premiile aflate în raza de acțiune a fiecărei trageri.&lt;br /&gt;
&lt;br /&gt;
Dacă o tragere are loc exact în același moment în care apare un premiu în raza ei de acțiune, acesta se consideră ”ochit”. Similar, dacă un premiu este programat să dispară la un moment de timp în care are loc o tragere, iar el se află în raza de acțiune a tragerii, atunci punctul se consideră câștigat. Un premiu ochit rămâne în joc și poate genera și alte puncte, până la momentul la care este programat să dispară. Nu pot avea loc două trageri în același moment, dar pot exista mai multe premii la aceeași înălțime în același timp și toate sunt generatoare de puncte.&lt;br /&gt;
&lt;br /&gt;
Dându-se numărul N de operații de tipul 1 sau 2, unde:&lt;br /&gt;
&lt;br /&gt;
Operația 1 t d h – reprezintă un premiu: t este momentul în care apare, d este numărul de unități de timp cât este programat să existe, iar h este înălțimea la care apare;&lt;br /&gt;
Operația 2 t h1 h2 – reprezintă o tragere, t este momentul în care are loc, iar h1 și h2 reprezintă înălțimile în care tragerea este activă (raza de acțiune).&lt;br /&gt;
Să se afle câte puncte câștigă RAU-Gigel la fiecare tragere și care este punctajul cu care termină jocul?&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare lasere.in conține pe prima linie un număr natural N. Pe următoarele N linii se află operațiile, în ordine crescătoare a momentului t de începere a acțiunii, de tipul 1 și 2, de forma:&lt;br /&gt;
&lt;br /&gt;
* 1 t d h , unde t, d,  h sunt 3 numere naturale separate cu un spațiu, cu semnificația de mai sus, reprezintă o operație de tipul 1;&lt;br /&gt;
* 2 t h1 h2 , unde t, h1, h2 sunt 3 numere naturale separate cu un spațiu, cu semnificația de mai sus, reprezintă o operație de tipul 2.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire lasere.out va conține răspunsurile, în ordinea solicitării, pentru operațiile de tip 2, câte unul pe linie, iar pe ultimul rând, punctajul lui RAU-Gigel la sfârșitul jocului.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ N ≤ 100.000&lt;br /&gt;
* 1 ≤ t, d, h, h1, h2 ≤ 1.000.000.000, h1&amp;lt;h2&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; lasere.in&lt;br /&gt;
 4&lt;br /&gt;
 1 2 8 4&lt;br /&gt;
 2 3 5 10&lt;br /&gt;
 1 5 6 7&lt;br /&gt;
 2 8 3 8&lt;br /&gt;
; lasere.out&lt;br /&gt;
 0&lt;br /&gt;
 2&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sunt 4 acțiuni, dintre care 2 trageri (tipul 2). La prima tragere RAU-Gigel nu nimerește singurul premiu existent în momentul tragerii (momentul 3), pentru că aceasta nu este în raza sa de acțiune.&lt;br /&gt;
&lt;br /&gt;
La a doua tragere, din momentul 8, RAU-Gigel nimerește ambele premii.&lt;br /&gt;
&lt;br /&gt;
Total: 0+2=2.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; lasere.in&lt;br /&gt;
 6&lt;br /&gt;
 2 2 4 5&lt;br /&gt;
 1 2 8 4&lt;br /&gt;
 2 3 5 10&lt;br /&gt;
 1 5 6 7&lt;br /&gt;
 2 10 4 8&lt;br /&gt;
 1 10 3 7&lt;br /&gt;
; lasere.out&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
 3&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sunt 6 acțiuni, dintre care 3 trageri. În momentul 2 au loc 2 acțiuni: o tragere și apariția unui premiu. Pentru că premiul, aflat la înălțimea 4, este în raza de acțiune a acestei trageri și anume în intervalul [4-5], RAU-Gigel câștigă un punct.&lt;br /&gt;
&lt;br /&gt;
La a doua tragere, nu nimerește nimic, singurul premiu existent în acel moment nefiind în raza sa de acțiune.&lt;br /&gt;
&lt;br /&gt;
La a treia tragere, RAU-Gigel mai câștigă 3 puncte, acele premii fiind în raza de acțiune a tragerii (intervalul 4-8). Se numără inclusiv primul premiu, planificat să existe până în momentul 10, care este și momentul tragerii. De asemenea, se numără și ultimul premiu, apărut chiar în momentul tragerii.&lt;br /&gt;
&lt;br /&gt;
Total: 1+0+3=4.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    actions = []&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        action = list(map(int, input().split()))&lt;br /&gt;
        actions.append(action)&lt;br /&gt;
    &lt;br /&gt;
    # Dicționar pentru stocarea premiilor și tragerilor&lt;br /&gt;
    prizes = {}&lt;br /&gt;
    shots = []&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem toate acțiunile și le salvăm în dicționarul corespunzător&lt;br /&gt;
    for action in actions:&lt;br /&gt;
        if action[0] == 1:  # Dacă este o acțiune de tip premiu&lt;br /&gt;
            start_time = action[1]&lt;br /&gt;
            end_time = action[1] + action[2]  # Momentul în care premiul va dispărea&lt;br /&gt;
            height = action[3]&lt;br /&gt;
            prizes[start_time] = (end_time, height)&lt;br /&gt;
        elif action[0] == 2:  # Dacă este o acțiune de tip tragere&lt;br /&gt;
            time = action[1]&lt;br /&gt;
            height1 = action[2]&lt;br /&gt;
            height2 = action[3]&lt;br /&gt;
            shots.append((time, height1, height2))&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem fiecare tragere și numărăm câte premii sunt în raza de acțiune&lt;br /&gt;
    for shot in shots:&lt;br /&gt;
        time = shot[0]&lt;br /&gt;
        height1 = shot[1]&lt;br /&gt;
        height2 = shot[2]&lt;br /&gt;
        points = 0&lt;br /&gt;
        for prize_time, prize_info in prizes.items():&lt;br /&gt;
            if time &amp;gt;= prize_time and time &amp;lt;= prize_info[0] and prize_info[1] &amp;gt;= height1 and prize_info[1] &amp;lt;= height2:&lt;br /&gt;
                points += 1&lt;br /&gt;
        print(points)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0935_-_Punct_In_Poligon_Simplu&amp;diff=9987</id>
		<title>0935 - Punct In Poligon Simplu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0935_-_Punct_In_Poligon_Simplu&amp;diff=9987"/>
		<updated>2024-06-03T16:13:22Z</updated>

		<summary type="html">&lt;p&gt;AjM: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau coordonatele în plan pentru n puncte care determină un poligon. Se mai dau coordonatele altor m puncte. Să se verifice, pentru fiecare dintre cele m puncte, dacă se găsește sau nu în interiorul (sau pe marginea) poligonului.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare punctinpoligonsimplu.in conține pe prima linie două numere separate prin spațiu: n și m, reprezentând respectiv, numărul de vârfuri ale poligonului și numărul de puncte de testat. Pe următoarele n linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui vârf al poligonului. Acestea sunt date între-un sens de parcurgere a laturilor poligonului. Pe următoarele m linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui punct care trebuie testat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire punctinpoligonsimplu.out va conține m linii și pe fiecare dintre ele sa află mesajul DA sau NU după cum punctul corespunzător este sau nu în interiorul&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
1 ≤ n , m ≤ 100&lt;br /&gt;
Numerele din fișierul de intrare sunt întregi cuprinse între -1001 și 1001.&lt;br /&gt;
Poligonul nu este neapărat convex dar nu se autointersectează.&lt;br /&gt;
În primele două teste poligonul este convex.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; punctinpoligonsimplu.in&lt;br /&gt;
 8 9&lt;br /&gt;
 -4 -1&lt;br /&gt;
 -3 2&lt;br /&gt;
 -1 3&lt;br /&gt;
 2 3&lt;br /&gt;
 4 1&lt;br /&gt;
 4 -2&lt;br /&gt;
 1 -4&lt;br /&gt;
 -2 -4&lt;br /&gt;
 0 0&lt;br /&gt;
 -3 -2&lt;br /&gt;
 3 -2&lt;br /&gt;
 -1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 -4 0&lt;br /&gt;
 -2 3&lt;br /&gt;
 0 -20&lt;br /&gt;
 20 0&lt;br /&gt;
; punctinpoligonsimplu.out&lt;br /&gt;
 DA&lt;br /&gt;
 DA&lt;br /&gt;
 DA&lt;br /&gt;
 DA&lt;br /&gt;
 DA&lt;br /&gt;
 NU&lt;br /&gt;
 NU&lt;br /&gt;
 NU&lt;br /&gt;
 NU&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_point_in_polygon(n, vertices, point):&lt;br /&gt;
    x, y = point&lt;br /&gt;
    inside = False&lt;br /&gt;
&lt;br /&gt;
    p1x, p1y = vertices[0]&lt;br /&gt;
    for i in range(n + 1):&lt;br /&gt;
        p2x, p2y = vertices[i % n]&lt;br /&gt;
        if y &amp;gt; min(p1y, p2y):&lt;br /&gt;
            if y &amp;lt;= max(p1y, p2y):&lt;br /&gt;
                if x &amp;lt;= max(p1x, p2x):&lt;br /&gt;
                    if p1y != p2y:&lt;br /&gt;
                        xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x&lt;br /&gt;
                    if p1x == p2x or x &amp;lt;= xinters:&lt;br /&gt;
                        inside = not inside&lt;br /&gt;
        p1x, p1y = p2x, p2y&lt;br /&gt;
&lt;br /&gt;
    return inside&lt;br /&gt;
&lt;br /&gt;
def read_input_file(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        data = file.readlines()&lt;br /&gt;
    n, m = map(int, data[0].strip().split())&lt;br /&gt;
    vertices = [tuple(map(int, line.strip().split())) for line in data[1:n+1]]&lt;br /&gt;
    points = [tuple(map(int, line.strip().split())) for line in data[n+1:]]&lt;br /&gt;
    return n, m, vertices, points&lt;br /&gt;
&lt;br /&gt;
def write_output_file(filename, results):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as file:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            file.write(result + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m, vertices, points = read_input_file(&#039;punctinpoligonsimplu.in&#039;)&lt;br /&gt;
    results = []&lt;br /&gt;
    &lt;br /&gt;
    for point in points:&lt;br /&gt;
        if is_point_in_polygon(n, vertices, point):&lt;br /&gt;
            results.append(&#039;DA&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            results.append(&#039;NU&#039;)&lt;br /&gt;
    &lt;br /&gt;
    write_output_file(&#039;punctinpoligonsimplu.out&#039;, results)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0935_-_Punct_In_Poligon_Simplu&amp;diff=9985</id>
		<title>0935 - Punct In Poligon Simplu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0935_-_Punct_In_Poligon_Simplu&amp;diff=9985"/>
		<updated>2024-06-03T16:11:32Z</updated>

		<summary type="html">&lt;p&gt;AjM: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau coordonatele în plan pentru n puncte care determină un poligon. Se mai dau coordonatele altor m puncte. Să se verifice, pentru fiecare dintre cele m puncte, dacă se găsește sau nu în interiorul (sau pe marginea) poligonului.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare punctinpoligonsimplu.in conține pe prima linie două numere separate prin spațiu: n și m, reprezentând respectiv, numărul de vârfuri ale poligonului și numărul de puncte de testat. Pe următoarele n linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui vârf al poligonului. Acestea sunt date între-un sens de parcurgere a laturilor poligonului. Pe următoarele m linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui punct care trebuie testat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire punctinpoligonsimplu.out va conține m linii și pe fiecare dintre ele sa află mesajul DA sau NU după cum punctul corespunzător este sau nu în interiorul&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
1 ≤ n , m ≤ 100&lt;br /&gt;
Numerele din fișierul de intrare sunt întregi cuprinse între -1001 și 1001.&lt;br /&gt;
Poligonul nu este neapărat convex dar nu se autointersectează.&lt;br /&gt;
În primele două teste poligonul este convex.&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt; punctinpoligonsimplu.in&lt;br /&gt;
&lt;br /&gt;
8 9&lt;br /&gt;
&lt;br /&gt;
-4 -1&lt;br /&gt;
&lt;br /&gt;
-3 2&lt;br /&gt;
&lt;br /&gt;
-1 3&lt;br /&gt;
&lt;br /&gt;
2 3&lt;br /&gt;
&lt;br /&gt;
4 1&lt;br /&gt;
&lt;br /&gt;
4 -2&lt;br /&gt;
&lt;br /&gt;
1 -4&lt;br /&gt;
&lt;br /&gt;
-2 -4&lt;br /&gt;
&lt;br /&gt;
0 0&lt;br /&gt;
&lt;br /&gt;
-3 -2&lt;br /&gt;
&lt;br /&gt;
3 -2&lt;br /&gt;
&lt;br /&gt;
-1 2&lt;br /&gt;
&lt;br /&gt;
2 2&lt;br /&gt;
&lt;br /&gt;
-4 0&lt;br /&gt;
&lt;br /&gt;
-2 3&lt;br /&gt;
&lt;br /&gt;
0 -20&lt;br /&gt;
&lt;br /&gt;
20 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt; punctinpoligonsimplu.out&lt;br /&gt;
&lt;br /&gt;
DA&lt;br /&gt;
&lt;br /&gt;
DA&lt;br /&gt;
&lt;br /&gt;
DA&lt;br /&gt;
&lt;br /&gt;
DA&lt;br /&gt;
&lt;br /&gt;
DA&lt;br /&gt;
&lt;br /&gt;
NU&lt;br /&gt;
&lt;br /&gt;
NU&lt;br /&gt;
&lt;br /&gt;
NU&lt;br /&gt;
&lt;br /&gt;
NU&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_point_in_polygon(n, vertices, point):&lt;br /&gt;
    x, y = point&lt;br /&gt;
    inside = False&lt;br /&gt;
&lt;br /&gt;
    p1x, p1y = vertices[0]&lt;br /&gt;
    for i in range(n + 1):&lt;br /&gt;
        p2x, p2y = vertices[i % n]&lt;br /&gt;
        if y &amp;gt; min(p1y, p2y):&lt;br /&gt;
            if y &amp;lt;= max(p1y, p2y):&lt;br /&gt;
                if x &amp;lt;= max(p1x, p2x):&lt;br /&gt;
                    if p1y != p2y:&lt;br /&gt;
                        xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x&lt;br /&gt;
                    if p1x == p2x or x &amp;lt;= xinters:&lt;br /&gt;
                        inside = not inside&lt;br /&gt;
        p1x, p1y = p2x, p2y&lt;br /&gt;
&lt;br /&gt;
    return inside&lt;br /&gt;
&lt;br /&gt;
def read_input_file(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        data = file.readlines()&lt;br /&gt;
    n, m = map(int, data[0].strip().split())&lt;br /&gt;
    vertices = [tuple(map(int, line.strip().split())) for line in data[1:n+1]]&lt;br /&gt;
    points = [tuple(map(int, line.strip().split())) for line in data[n+1:]]&lt;br /&gt;
    return n, m, vertices, points&lt;br /&gt;
&lt;br /&gt;
def write_output_file(filename, results):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as file:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            file.write(result + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m, vertices, points = read_input_file(&#039;punctinpoligonsimplu.in&#039;)&lt;br /&gt;
    results = []&lt;br /&gt;
    &lt;br /&gt;
    for point in points:&lt;br /&gt;
        if is_point_in_polygon(n, vertices, point):&lt;br /&gt;
            results.append(&#039;DA&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            results.append(&#039;NU&#039;)&lt;br /&gt;
    &lt;br /&gt;
    write_output_file(&#039;punctinpoligonsimplu.out&#039;, results)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3683_-_Predictor_Machine&amp;diff=9984</id>
		<title>3683 - Predictor Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3683_-_Predictor_Machine&amp;diff=9984"/>
		<updated>2024-06-03T16:09:58Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == După ce a văzut câti oameni au vrut să știe ce rating vor avea în viitor pe Codeforces, Ștefan s-a decis să își folosească abilitățile sale de programator pentru a găsi punctele importante din graficele ratingurilor de pe Codeforces. Pentru că nu are timp să adauge toate tehnicile sale, el se va ocupa doar de punctele de interes.  Astfel, el primește un vector de n numere, indexat de la 1 și o funcție continuă, astfel încât v[i] = f(i), un...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
După ce a văzut câti oameni au vrut să știe ce rating vor avea în viitor pe Codeforces, Ștefan s-a decis să își folosească abilitățile sale de programator pentru a găsi punctele importante din graficele ratingurilor de pe Codeforces. Pentru că nu are timp să adauge toate tehnicile sale, el se va ocupa doar de punctele de interes.&lt;br /&gt;
&lt;br /&gt;
Astfel, el primește un vector de n numere, indexat de la 1 și o funcție continuă, astfel încât v[i] = f(i), unde v[i] e ratingul utilizatorului dupa i concursuri. Pentru că funcția e continuă, pentru fiecare linie dintre cele două puncte, graficul funcției va atinge toate punctele de coordonate întregi dintre valori.&lt;br /&gt;
&lt;br /&gt;
De exemplu, daca f(1) = 3 și f(2) = 9, linia va atinge punctele de pe coordonatele întregi 3, 4, 5, 6, 7, 8 și 9.&lt;br /&gt;
&lt;br /&gt;
De asemenea ni se dau q query-uri, unde la un query vom schimba valoarea unui punct din vector și după fiecare query, va trebui să afișăm punctul de interes al vectorului, care este punctul atins de cel mai mare număr de ori de către graficul funcției. De asemenea, trebuie afișat și numărul de ori în care este atins.&lt;br /&gt;
&lt;br /&gt;
Dacă avem mai multe puncte de acest fel, vom afișa punctul cu cea mai mică valoare dintre ele.&lt;br /&gt;
&lt;br /&gt;
Se garantează că cele n valori vor fi distincte atât la început, cât și de-a lungul actualizărilor.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură pe prima linie numărul n. Pe următoarea linie, programul va citi cele n numere naturale, reprezentând valorile inițiale ale vectorului v.&lt;br /&gt;
&lt;br /&gt;
Pe linia a treia, programul va citi numărul q, iar pe următoarele q linii, programul va citi câte două numere, pos și val, reprezentând poziția schimbată și valoarea nouă.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran q linii, pe fiecare din cele q linii regăsindu-se cele două valori cerute de problemă, și anume punctul cu valoare minimă care este atins de numărul maxim de ori, precum și numărul de ori în care este atins.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ pos ≤ n ≤ 100 000&lt;br /&gt;
* 1 ≤ q ≤ 200 000&lt;br /&gt;
* 1 ≤ v[i], val ≤ 200 000&lt;br /&gt;
* Pentru teste în valoare de 30 de puncte, 1 ≤ n, q ≤ 1000&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 5&lt;br /&gt;
 4 2 6 1 7&lt;br /&gt;
 5&lt;br /&gt;
 1 3&lt;br /&gt;
 4 4&lt;br /&gt;
 2 1&lt;br /&gt;
 5 2&lt;br /&gt;
 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
 3 4&lt;br /&gt;
 5 3&lt;br /&gt;
 5 3&lt;br /&gt;
 2 3&lt;br /&gt;
 2 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
După ce s-au efectuat toate actualizăriile, vectorul va arăta astfel: 3 1 5 4 2.&lt;br /&gt;
&lt;br /&gt;
Valoarea 2 e atinsă de 3 ori, între pozițiile 1 și 2, între pozițiile 2 și 3 precum și între pozițiile 4 și 5.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
class SegmentTree:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.tree = [0] * (4 * n)&lt;br /&gt;
    &lt;br /&gt;
    def update(self, node, start, end, idx, val):&lt;br /&gt;
        if start == end:&lt;br /&gt;
            if start == idx:&lt;br /&gt;
                self.tree[node] = val&lt;br /&gt;
            return&lt;br /&gt;
        mid = (start + end) // 2&lt;br /&gt;
        if idx &amp;lt;= mid:&lt;br /&gt;
            self.update(2 * node, start, mid, idx, val)&lt;br /&gt;
        else:&lt;br /&gt;
            self.update(2 * node + 1, mid + 1, end, idx, val)&lt;br /&gt;
        self.tree[node] = self.tree[2 * node] + self.tree[2 * node + 1]&lt;br /&gt;
    &lt;br /&gt;
    def query(self, node, start, end, left, right):&lt;br /&gt;
        if start &amp;gt; right or end &amp;lt; left:&lt;br /&gt;
            return 0&lt;br /&gt;
        if left &amp;lt;= start and end &amp;lt;= right:&lt;br /&gt;
            return self.tree[node]&lt;br /&gt;
        mid = (start + end) // 2&lt;br /&gt;
        return self.query(2 * node, start, mid, left, right) + self.query(2 * node + 1, mid + 1, end, left, right)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    v = list(map(int, input().split()))&lt;br /&gt;
    &lt;br /&gt;
    # Construim arborele de segmente&lt;br /&gt;
    seg_tree = SegmentTree(n)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        seg_tree.update(1, 1, n, v[i], 1)&lt;br /&gt;
    &lt;br /&gt;
    q = int(input())&lt;br /&gt;
    for _ in range(q):&lt;br /&gt;
        pos, val = map(int, input().split())&lt;br /&gt;
        # Actualizăm arborele de segmente&lt;br /&gt;
        seg_tree.update(1, 1, n, v[pos - 1], 0)&lt;br /&gt;
        seg_tree.update(1, 1, n, val, seg_tree.query(1, 1, n, val, val) + 1)&lt;br /&gt;
        v[pos - 1] = val&lt;br /&gt;
        &lt;br /&gt;
        # Căutăm punctul de interes&lt;br /&gt;
        left = 1&lt;br /&gt;
        right = n&lt;br /&gt;
        while left &amp;lt; right:&lt;br /&gt;
            mid = (left + right) // 2&lt;br /&gt;
            if seg_tree.query(1, 1, n, left, mid) &amp;gt;= seg_tree.query(1, 1, n, mid + 1, right):&lt;br /&gt;
                right = mid&lt;br /&gt;
            else:&lt;br /&gt;
                left = mid + 1&lt;br /&gt;
        print(left, seg_tree.query(1, 1, n, left, left))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3230_-_Cambridge&amp;diff=9982</id>
		<title>3230 - Cambridge</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3230_-_Cambridge&amp;diff=9982"/>
		<updated>2024-06-03T16:07:19Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Interviul de admitere la prestigioasa Universitate Cambridge constă în N probleme, numerotate de la 1 la N. Alex este în momentul acesta acolo, așteptând să susțină interviul. Takahiro Wong, care tocmai a ieșit din examen, a rezolvat toate problemele, problema i rezolvând-o după Di secunde de la începerea interviului. Cunoscând ca poate rezolva fiecare problema i în Ti secunde, Alex, panicat din fire, își pune M întrebări de forma: x y. Pentru fi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Interviul de admitere la prestigioasa Universitate Cambridge constă în N probleme, numerotate de la 1 la N. Alex este în momentul acesta acolo, așteptând să susțină interviul. Takahiro Wong, care tocmai a ieșit din examen, a rezolvat toate problemele, problema i rezolvând-o după Di secunde de la începerea interviului.&lt;br /&gt;
Cunoscând ca poate rezolva fiecare problema i în Ti secunde, Alex, panicat din fire, își pune M întrebări de forma: x y. Pentru fiecare întrebare, Alex vrea să afle dacă poate rezolva fiecare problemă din intervalul [x;y] înaintea lui Takahiro Wong (Alex poate rezolva problemele din intervalul [x;y] în ce ordine dorește).&lt;br /&gt;
De exemplu, să considerăm că Alex rezolvă problemele a și b (în această ordine). El va termina problema a după Ta secunde, și problema b după Ta + Tb secunde. Alex va rezolva ambele probleme înaintea lui Takahiro Wong dacă Ta &amp;lt; Da și Ta + Tb &amp;lt; Db. Atât interviul lui Takahiro Wong, cât și cel al lui Alex încep de la secunda 0.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Ajutați-l pe Alex să răspundă corect la cele M întrebări pentru a nu intra panicat la interviu.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie se vor citi de la tastatura N și M, separate prin câte un spațiu. N – numărul de probleme, M – numărul de întrebări.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele N linii se vor citi de la tastatura Ti și Di, separate prin câte un spațiu. Ti – timpul necesar lui Alex sa rezolve problema i. Di – timpul (de la începerea interviului) după care Takahiro Wong rezolv[ problema i.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele M linii se vor citi de la tastatură x și y, separate prin câte un spațiu. x – capătul din stânga al intervalului. y – capătul din dreapta al intervalului.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Se vor afișa pe ecran M linii – răspunsurile la cele M întrebări. Linia cu numărul i va conține răspunsul pentru întrebarea cu numărul i: 1, dacă Alex poate găsi o ordine în care să rezolve toate problemele din intervalul [x;y], astfel încât să termine fiecare problema înaintea lui Takahiro Wong, sau 0, altfel.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N, M ≤ 100.000&lt;br /&gt;
* 1 ≤ Ti, Di ≤ 1.000.000.000&lt;br /&gt;
* Valorile Di nu sunt distincte două câte două (o valoarea poate apărea de mai multe ori)&lt;br /&gt;
* Alex nu poate rezolva două probleme în același timp, însă Takahiro Wong poate (valorile Di nu sunt distincte două câte două).&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 4 3&lt;br /&gt;
 1 10&lt;br /&gt;
 14 18&lt;br /&gt;
 2 7&lt;br /&gt;
 10 12&lt;br /&gt;
 3 4&lt;br /&gt;
 2 4&lt;br /&gt;
 1 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sunt 4 probleme, numerotate de la 1 la 4:&lt;br /&gt;
* problema numărul 1: T1 = 1, D1 = 10;&lt;br /&gt;
* problema numărul 2: T2 = 14, D2 = 18;&lt;br /&gt;
* problema numărul 3: T3 = 2, D3 = 7;&lt;br /&gt;
* problema numărul 4: T4 = 10, D4 = 12;&lt;br /&gt;
* Prima întrebare se referă la intervalul [3,4]: – Dacă rezolvăm problemele în ordinea (3,4) trebuie să avem T3 &amp;lt; D3 și T3 + T4 &amp;lt; D4. Observăm că a doua relație este falsă. – Dacă rezolvăm problemele în ordinea (4,3) trebuie să avem T4 &amp;lt; D4 și T4 + T3 &amp;lt; D3. Observăm, din nou, că a doua relație este falsă. – Nu există nicio altă ordine în care putem rezolva problemele, deci răspunsul este 0.&lt;br /&gt;
* A doua întrebare se referă la intervalul [2,4]: – Exista șase modalități de a rezolva problemele: (2, 3, 4), (2, 4, 3), (3, 2, 4), (3, 4,  2), (4, 2, 3), (4, 3, 2). – În niciuna din cele șase modalități nu sunt toate relațiile respectate, deci răspunsul este 0.&lt;br /&gt;
* A treia întrebare se referă la intervalul [1,3]: – Exista șase modalități de a rezolva problemele: (1,2,3), (1, 3, 2), (2, 1, 3), (2, 3,  1), (3, 1, 2), (3, 2, 1). – Dacă rezolvăm problemele în ordinea (1,3,2) trebuie să avem T1 &amp;lt; D1, T1 + T3 &amp;lt; D3 și T1 + T3 + T2 &amp;lt; D2. * Observăm că toate sunt adevărate. – Deoarece am găsit o ordine de a rezolva problemele, pentru care toate relațiile sunt adevărate, răspunsul este 1.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def can_solve_in_time_interval(N, problems, x, y):&lt;br /&gt;
    max_time_ending_here = 0&lt;br /&gt;
    for i in range(x - 1, y):&lt;br /&gt;
        max_time_ending_here = max(max_time_ending_here, problems[i][0]) + problems[i][1]&lt;br /&gt;
        if max_time_ending_here &amp;gt; problems[i][2]:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, M = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    problems = []&lt;br /&gt;
    for _ in range(N):&lt;br /&gt;
        T, D = map(int, input().split())&lt;br /&gt;
        problems.append((T, D, T + D))&lt;br /&gt;
&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        if can_solve_in_time_interval(N, problems, x, y):&lt;br /&gt;
            print(1)&lt;br /&gt;
        else:&lt;br /&gt;
            print(0)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3225_-_Simple&amp;diff=9980</id>
		<title>3225 - Simple</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3225_-_Simple&amp;diff=9980"/>
		<updated>2024-06-03T16:02:55Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir de N numere și Q operații de tipul:  * 0 a b val : se va aduna valoarea val la toate numerele din intervalul [a, b]. * 1 a b : se va afișa elementul minim par și elementul maxim impar din intervalul [a, b]; în cazul în care unul dintre aceste numere nu există, se va afișa -1 în locul său. == Cerinţa == Răspundeți corect la toate operațiile de tip 1. == Date de intrare == Programul citește de la tastatură numărul N. Pe a doua linie s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir de N numere și Q operații de tipul:&lt;br /&gt;
&lt;br /&gt;
* 0 a b val : se va aduna valoarea val la toate numerele din intervalul [a, b].&lt;br /&gt;
* 1 a b : se va afișa elementul minim par și elementul maxim impar din intervalul [a, b]; în cazul în care unul dintre aceste numere nu există, se va afișa -1 în locul său.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Răspundeți corect la toate operațiile de tip 1.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul N. Pe a doua linie se vor afla N numere reprezentând elementele din sir. Pe linia a treia se va afla numărul Q, iar pe următoarele Q linii se vor afla Q operații sub forma descrisa în enunț.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Se vor afișa pe ecran răspunsurile la operațiile de tip 1, câte unul pe linie.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* N, Q &amp;lt;= 200.000&lt;br /&gt;
* Numerele din sir sunt cuprinse intre 1 și 2.000.000.000.&lt;br /&gt;
* Valorile val din operațiile de tip 0 sunt cuprinse intre 1 și 2.000.000.000.&lt;br /&gt;
* ATENȚIE! În cazul în care unul din cele două răspunsuri la o operație de tip 1 nu poate fi calculat, se va afișa -1&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 7&lt;br /&gt;
 5 6 3 1 9 8 5&lt;br /&gt;
 10&lt;br /&gt;
 1 2 5&lt;br /&gt;
 0 2 3 2&lt;br /&gt;
 1 2 4&lt;br /&gt;
 0 2 7 3&lt;br /&gt;
 1 2 4&lt;br /&gt;
 1 4 7&lt;br /&gt;
 0 5 7 1&lt;br /&gt;
 1 1 6&lt;br /&gt;
 1 1 2&lt;br /&gt;
 1 3 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
 6 9&lt;br /&gt;
 8 5&lt;br /&gt;
 4 11&lt;br /&gt;
 4 11&lt;br /&gt;
 4 13&lt;br /&gt;
 -1 11&lt;br /&gt;
 4 -1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Șirul inițial este: 5 6 3 1 9 8 5.&lt;br /&gt;
Operația 1 2 5: Se vor afișa cele doua valori cerute pe intervalul [2; 5].&lt;br /&gt;
Operația 0 2 3 2: Șirul nou format va fi 5 8 5 1 9 8 5.&lt;br /&gt;
Operația 1 2 4 : Se vor afișa cele doua valori cerute pe intervalul [2; 4].&lt;br /&gt;
Operația 0 2 7 3 : Șirul nou format va fi 5 11 8 4 12 11 8.&lt;br /&gt;
Operația 1 2 4 : Se vor afișa cele doua valori cerute pe intervalul [2; 4].&lt;br /&gt;
Operația 1 4 7 : Se vor afișa cele doua valori cerute pe intervalul [4; 7].&lt;br /&gt;
Operația 0 5 7 1 : Șirul nou format va fi 5 11 8 4 13 12 9.&lt;br /&gt;
Operația 1 1 6 : Se vor afișa cele doua valori cerute pe intervalul [1; 6].&lt;br /&gt;
Operația 1 1 2 : Se vor afișa cele doua valori cerute pe intervalul [1; 2].&lt;br /&gt;
Operația 1 3 4 : Se vor afișa cele doua valori cerute pe intervalul [3; 4].&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def apply_operation_0(arr, a, b, val):&lt;br /&gt;
    for i in range(a - 1, b):&lt;br /&gt;
        arr[i] += val&lt;br /&gt;
&lt;br /&gt;
def find_min_par_and_max_odd(arr, a, b):&lt;br /&gt;
    min_par = float(&#039;inf&#039;)&lt;br /&gt;
    max_odd = float(&#039;-inf&#039;)&lt;br /&gt;
    for i in range(a - 1, b):&lt;br /&gt;
        if arr[i] % 2 == 0:&lt;br /&gt;
            min_par = min(min_par, arr[i])&lt;br /&gt;
        else:&lt;br /&gt;
            max_odd = max(max_odd, arr[i])&lt;br /&gt;
    if min_par == float(&#039;inf&#039;):&lt;br /&gt;
        min_par = -1&lt;br /&gt;
    if max_odd == float(&#039;-inf&#039;):&lt;br /&gt;
        max_odd = -1&lt;br /&gt;
    return min_par, max_odd&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
    Q = int(input())&lt;br /&gt;
&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        query = input().split()&lt;br /&gt;
        op = int(query[0])&lt;br /&gt;
        a = int(query[1])&lt;br /&gt;
        b = int(query[2])&lt;br /&gt;
&lt;br /&gt;
        if op == 0:&lt;br /&gt;
            val = int(query[3])&lt;br /&gt;
            apply_operation_0(arr, a, b, val)&lt;br /&gt;
        elif op == 1:&lt;br /&gt;
            min_par, max_odd = find_min_par_and_max_odd(arr, a, b)&lt;br /&gt;
            print(min_par, max_odd)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3059_-_Lexicografic&amp;diff=9979</id>
		<title>3059 - Lexicografic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3059_-_Lexicografic&amp;diff=9979"/>
		<updated>2024-06-03T16:00:40Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt ==  Se dă un șir v format din N elemente naturale nenule nu neapărat distincte. Asupra șirului putem aplica un singur tip de operație: interschimbarea a două elemente aflate pe poziții consecutive. == Cerinţa == Dându-se un număr natural K, se cere șirul minim lexicografic ce se poate obține prin aplicarea a cel mult K interschimbări de elemente de pe poziții consecutive. == Date de intrare == În fișierul lexicografic.in se află pe prima linie T, rep...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Se dă un șir v format din N elemente naturale nenule nu neapărat distincte. Asupra șirului putem aplica un singur tip de operație: interschimbarea a două elemente aflate pe poziții consecutive.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se un număr natural K, se cere șirul minim lexicografic ce se poate obține prin aplicarea a cel mult K interschimbări de elemente de pe poziții consecutive.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
În fișierul lexicografic.in se află pe prima linie T, reprezentând numărul de teste. Urmează cele T teste, fiecare pe câte două linii. Pe prima linie din cadrul unui test se află două numere N și K separate prin spațiu. Pe linia a doua din cadrul unui test se află cele N elemente ale șirului v separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul lexicografic.out se vor afișa cele T linii, câte una corespunzătoare răspunsului pe fiecare test. Linia corespunzătoare unui test va conține cele N elemente separate prin spații ale șirului minim lexicografic ce s-a obținut din șirul inițial, după aplicarea a cel mult K interschimbări de elemente de pe poziții consecutive.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 250.000;&lt;br /&gt;
* T ≤ 2500;&lt;br /&gt;
* într-un fișier de intrare suma totală a lungimilor șirurilor corespunzătoare celor T teste nu va depăși 250.000;&lt;br /&gt;
* 1 ≤ K ≤ N*(N-1)/2;&lt;br /&gt;
* 1 ≤ v[i] ≤ N, pentru 1 ≤ i ≤ N;&lt;br /&gt;
* Vă rugăm să acordați atenție tipului de date necesar pentru a citi valoarea lui K;&lt;br /&gt;
* Pentru acordarea punctajului pe un fișier de test este necesară rezolvarea corectă a tuturor celor T teste;&lt;br /&gt;
* Pentru teste în valoare de 5 puncte se garantează K = N * (N – 1) / 2;&lt;br /&gt;
* Pentru alte teste în valoare de 7 puncte se garantează K = 1;&lt;br /&gt;
* Pentru alte teste în valoare de 23 de puncte se garantează T ≤ 10, N ≤ 50;&lt;br /&gt;
* Pentru alte teste în valoare de 4 puncte se garantează T ≤ 10, N ≤ 100;&lt;br /&gt;
* Pentru alte teste în valoare de 12 puncte se garantează T ≤ 10, N ≤ 500;&lt;br /&gt;
* Pentru alte teste în valoare de 24 de puncte se garantează T ≤ 10, N ≤ 2000;&lt;br /&gt;
* Un șir a1, a2, …, an este mai mic lexicografic decât un alt șir b1, b2, …, bn dacă există un număr întreg P mai mic sau egal cu N astfel * încât: a1 = b1, a2 = b2, … , aP-1 = bP-1, iar aP &amp;lt; bP.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; lexicografic.in&lt;br /&gt;
 3&lt;br /&gt;
 5 2&lt;br /&gt;
 4 2 3 1 1&lt;br /&gt;
 4 3&lt;br /&gt;
 2 1 3 4&lt;br /&gt;
 6 4&lt;br /&gt;
 5 3 5 3 4 6&lt;br /&gt;
; lexicografic.out&lt;br /&gt;
 2 3 4 1 1&lt;br /&gt;
 1 2 3 4&lt;br /&gt;
 3 3 5 4 5 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Pentru primul test: Șirul este format din N = 5 elemente, și anume v=(4,2,3,1,1). Putem efectua K=2 interschimbări. Interschimbând elementele v[1] și v[2] obținem șirul (2,4,3,1,1), apoi după interschimbarea elementelor v[3] și v[2] se obține șirul minim lexicografic (2,3,4,1,1).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def min_lexicographic_sequence(N, K, v):&lt;br /&gt;
    for _ in range(min(K, N)):&lt;br /&gt;
        for i in range(N - 1):&lt;br /&gt;
            if v[i] &amp;gt; v[i + 1]:&lt;br /&gt;
                v[i], v[i + 1] = v[i + 1], v[i]&lt;br /&gt;
    &lt;br /&gt;
    return v&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;lexicografic.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;lexicografic.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        T = int(fin.readline())&lt;br /&gt;
        for _ in range(T):&lt;br /&gt;
            N, K = map(int, fin.readline().split())&lt;br /&gt;
            v = list(map(int, fin.readline().split()))&lt;br /&gt;
            min_lex_seq = min_lexicographic_sequence(N, K, v)&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, min_lex_seq)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4019_-_Pikachu&amp;diff=9977</id>
		<title>4019 - Pikachu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4019_-_Pikachu&amp;diff=9977"/>
		<updated>2024-06-03T15:57:52Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Miruna şi partenerul ei de aventură, Pikachu, sunt în faţa unei noi provocări. Cele două personaje au ajuns lângă un lanţ muntos format din N vârfuri aşezate în linie dreaptă unul după altul. Pentru fiecare vârf muntos se cunoaşte înălţimea lui. Folosindu-se de puterile sale extraordinare, Pikachu este capabil sa scadă sau să crească înălţimea unui vârf muntos cu o unitate într-o secundă. Din motive necunoscute muritorilor de rând, cei...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Miruna şi partenerul ei de aventură, Pikachu, sunt în faţa unei noi provocări. Cele două personaje au ajuns lângă un lanţ muntos format din N vârfuri aşezate în linie dreaptă unul după altul. Pentru fiecare vârf muntos se cunoaşte înălţimea lui. Folosindu-se de puterile sale extraordinare, Pikachu este capabil sa scadă sau să crească înălţimea unui vârf muntos cu o unitate într-o secundă. Din motive necunoscute muritorilor de rând, cei doi prieteni vor să obţină cel puţin K vârfuri montane consecutive care au aceeaşi înălţime, într-un timp cât mai scurt.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Determinaţi timpul minim în care Pikachu poate îndeplini această sarcină.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare pikachu.in conține pe prima linie două numere N şi K având semnificaţia din enunţ. Pe cea de a doua linie se vor găsi N numere naturale reprezentând înălţimile vârfurilor muntoase.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire pikachu.out va conţine un singur număr natural T, reprezentând timpul minim necesar pentru a obţine cel puţin K vârfuri consecutive cu aceeaşi înălţime.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100.000&lt;br /&gt;
* 1 ≤ K ≤ N&lt;br /&gt;
* Înălţimile munţilor sunt numere pozitive care se pot reprezenta pe întregi de 32 de biţi cu semn&lt;br /&gt;
* 20% din teste au 1 ≤ N, K ≤ 100, iar înălţimile aparţin intervalului [1, 100]&lt;br /&gt;
* Alte 20% din teste au 1 ≤ N, K ≤ 5000&lt;br /&gt;
* Rezultatul se poate reprezenta pe un întreg de 64 biţi cu semn&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; pikachu.in&lt;br /&gt;
 5 3&lt;br /&gt;
 5 2 4 3 7&lt;br /&gt;
; pikachu.out&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
În prima secundă se creşte înălţimea muntelui de pe poziţia a doua, iar în a doua secundă se scade înălţimea muntelui de pe poziţia a treia. În urma acestor operaţii subsevenţa care începe pe a doua poziţie şi se termină pe a patra poziţie va conţine doar vârfuri de înălţime 3.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def min_time_to_consecutive_height(N, K, heights):&lt;br /&gt;
    min_time = float(&#039;inf&#039;)&lt;br /&gt;
    counter = {}&lt;br /&gt;
    start, end = 0, 0&lt;br /&gt;
    &lt;br /&gt;
    while end &amp;lt; N:&lt;br /&gt;
        height = heights[end]&lt;br /&gt;
        counter[height] = counter.get(height, 0) + 1&lt;br /&gt;
        end += 1&lt;br /&gt;
        &lt;br /&gt;
        while len(counter) &amp;gt; 1 or (len(counter) == 1 and max(counter.values()) &amp;lt; K):&lt;br /&gt;
            start_height = heights[start]&lt;br /&gt;
            counter[start_height] -= 1&lt;br /&gt;
            if counter[start_height] == 0:&lt;br /&gt;
                del counter[start_height]&lt;br /&gt;
            start += 1&lt;br /&gt;
        &lt;br /&gt;
        if len(counter) == 1 and max(counter.values()) &amp;gt;= K:&lt;br /&gt;
            min_time = min(min_time, end - start)&lt;br /&gt;
    &lt;br /&gt;
    return min_time&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;pikachu.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;pikachu.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N, K = map(int, fin.readline().split())&lt;br /&gt;
        heights = list(map(int, fin.readline().split()))&lt;br /&gt;
        min_time = min_time_to_consecutive_height(N, K, heights)&lt;br /&gt;
        fout.write(str(min_time) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2092_-_Actualizare_Element,_Produs_Interval,_Matrice&amp;diff=9975</id>
		<title>2092 - Actualizare Element, Produs Interval, Matrice</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2092_-_Actualizare_Element,_Produs_Interval,_Matrice&amp;diff=9975"/>
		<updated>2024-06-03T15:54:40Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir de matrice pătratice asupra căruia se pot face două tipuri de operații: actualizare a unui element (se înlocuiește matricea de pe acea poziție cu alta) și interogarea unui interval de indici (determinarea produsului matricelor memorate între cei doi indici, inclusiv). == Cerinţa == Afișați răspunsul la fiecare interogare. == Date de intrare == Prima linie a fisierului aepim.in conține două numere: N, ce reprezintă lungimea șirului d...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir de matrice pătratice asupra căruia se pot face două tipuri de operații: actualizare a unui element (se înlocuiește matricea de pe acea poziție cu alta) și interogarea unui interval de indici (determinarea produsului matricelor memorate între cei doi indici, inclusiv).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Afișați răspunsul la fiecare interogare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a fisierului aepim.in conține două numere: N, ce reprezintă lungimea șirului dat și K ce reprezintă dimensiunea matricelor pătratice. Linia a doua, conține, separate prin câte un spațiu, matricele din șirului dat. Atât matricele date în șirul inițial cât și cele de la actualizări conțin doar 1 și 2 și sunt date la intrare codificat, ca un șir de K*K caractere, conform parcurgerii crescător după linii și apoi crescător după coloane (fără spații). De exemplu, matricea:&lt;br /&gt;
  1 2 2&lt;br /&gt;
  1 1 1&lt;br /&gt;
  1 2 1&lt;br /&gt;
se codifică prin 122111121.&lt;br /&gt;
Codificările matricelor de pe a doua linie se separă prin câte un spațiu.&lt;br /&gt;
Pe linia a treia e află un număr M ce reprezintă numărul de operații ce se efectuează asupra șirului dat. Pe fiecare din următoarele M linii se găsesc câte 3 numere naturale separate prin câte un spațiu: T A B. Dacă T = 1 operația este de interogare iar A și B sunt capetele inrervalului. Dacă T = 2 operația este de actualizare cu semnificația: elementul de pe poziția A devine B (B reprezintă codificarea unei matrice).&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul aepim.out conține pe câte o linie răspunsul la căte o operațe de tip 1, în ordinea în care acestea apar în datele de intrare. Elementele matricelor rezultat se scriu modulo 9901, se afișează, ca ordine, după aceeași regulă ca la codificarea din datele de intrare și se separă prin câte un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100000&lt;br /&gt;
* 1 ≤ M ≤ 100000&lt;br /&gt;
* 1 ≤ A ≤ B ≤ N&lt;br /&gt;
* 2 ≤ K ≤ 3&lt;br /&gt;
* elementele șirului dat sunt indexate de la 1&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; aepim.in&lt;br /&gt;
 4 2&lt;br /&gt;
 1121 1221 1121 1121&lt;br /&gt;
 3&lt;br /&gt;
 1 2 4&lt;br /&gt;
 2 2 2112&lt;br /&gt;
 1 2 4&lt;br /&gt;
; aepim.out&lt;br /&gt;
 11 8 10 7 &lt;br /&gt;
 10 7 11 8&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Matricele sunt de ordin 2. Pe prima linie a fișierului deieșire este codifictă matricea&lt;br /&gt;
  11 8 &lt;br /&gt;
  10 7 &lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2091_-_Actualizare_Interval,_Minim_Interval&amp;diff=9973</id>
		<title>2091 - Actualizare Interval, Minim Interval</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2091_-_Actualizare_Interval,_Minim_Interval&amp;diff=9973"/>
		<updated>2024-06-03T15:50:37Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui interval (schimbarea valorii tuturor elementelor aflate între două poziții date) și interogarea unui interval (determinarea celei mai mici valori aflate între două poziții date). == Cerinţa == Afișați răspunsurile la fiecare interogare. == Date de intrare == Prima linie a fisierului aimi.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui interval (schimbarea valorii tuturor elementelor aflate între două poziții date) și interogarea unui interval (determinarea celei mai mici valori aflate între două poziții date).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Afișați răspunsurile la fiecare interogare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a fisierului aimi.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a doua, conține, separate prin câte un spațiu elementele șirului dat. Pe linia a treia se află un număr M ce reprezintă numărul de operații ce se efectuează asupra șirului dat. Pe fiecare din următoarele M linii se află descrierea câte unei operații astfel: interogările sub forma 1 A B, cerându-se minimul elementelor aflate între pozițiile A și B inclusiv, sau 2 A B X, semnificând faptul că toate elementele de pe poziții de la A la B inclusiv primesc valoarea X.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul aimi.out conține pe câte o linie răspunsul la căte o operațe de tip 1, în ordinea în care acestea apar în datele de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100000&lt;br /&gt;
* 1 ≤ M ≤ 100000&lt;br /&gt;
* 1 ≤ A ≤ B ≤ N&lt;br /&gt;
* elementele șirului dat sunt indexate de la 1&lt;br /&gt;
* elementele șirului dat precum și valorile X sunt de tip int, pozitive&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; aimi.in&lt;br /&gt;
 5&lt;br /&gt;
 1 6 4 3 9&lt;br /&gt;
 3&lt;br /&gt;
 1 2 4&lt;br /&gt;
 2 2 3 2&lt;br /&gt;
 1 2 4&lt;br /&gt;
; aimi.out&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
class SegmentTree:&lt;br /&gt;
    def __init__(self, nums):&lt;br /&gt;
        self.n = len(nums)&lt;br /&gt;
        self.tree = [float(&#039;inf&#039;)] * (4 * self.n)&lt;br /&gt;
        self.build(nums, 0, 0, self.n - 1)&lt;br /&gt;
        &lt;br /&gt;
    def build(self, nums, idx, left, right):&lt;br /&gt;
        if left == right:&lt;br /&gt;
            self.tree[idx] = nums[left]&lt;br /&gt;
            return&lt;br /&gt;
        mid = (left + right) // 2&lt;br /&gt;
        self.build(nums, 2 * idx + 1, left, mid)&lt;br /&gt;
        self.build(nums, 2 * idx + 2, mid + 1, right)&lt;br /&gt;
        self.tree[idx] = min(self.tree[2 * idx + 1], self.tree[2 * idx + 2])&lt;br /&gt;
    &lt;br /&gt;
    def update(self, idx, left, right, pos, val):&lt;br /&gt;
        if left == right == pos:&lt;br /&gt;
            self.tree[idx] = val&lt;br /&gt;
            return&lt;br /&gt;
        mid = (left + right) // 2&lt;br /&gt;
        if pos &amp;lt;= mid:&lt;br /&gt;
            self.update(2 * idx + 1, left, mid, pos, val)&lt;br /&gt;
        else:&lt;br /&gt;
            self.update(2 * idx + 2, mid + 1, right, pos, val)&lt;br /&gt;
        self.tree[idx] = min(self.tree[2 * idx + 1], self.tree[2 * idx + 2])&lt;br /&gt;
    &lt;br /&gt;
    def query(self, idx, left, right, q_left, q_right):&lt;br /&gt;
        if q_left &amp;lt;= left and right &amp;lt;= q_right:&lt;br /&gt;
            return self.tree[idx]&lt;br /&gt;
        if q_right &amp;lt; left or right &amp;lt; q_left:&lt;br /&gt;
            return float(&#039;inf&#039;)&lt;br /&gt;
        mid = (left + right) // 2&lt;br /&gt;
        left_min = self.query(2 * idx + 1, left, mid, q_left, q_right)&lt;br /&gt;
        right_min = self.query(2 * idx + 2, mid + 1, right, q_left, q_right)&lt;br /&gt;
        return min(left_min, right_min)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;aimi.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;aimi.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        nums = list(map(int, fin.readline().split()))&lt;br /&gt;
        tree = SegmentTree(nums)&lt;br /&gt;
        &lt;br /&gt;
        M = int(fin.readline())&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            op = list(map(int, fin.readline().split()))&lt;br /&gt;
            if op[0] == 1:&lt;br /&gt;
                left, right = op[1] - 1, op[2] - 1&lt;br /&gt;
                min_val = tree.query(0, 0, N - 1, left, right)&lt;br /&gt;
                fout.write(f&amp;quot;{min_val}\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                pos, val = op[1], op[2]&lt;br /&gt;
                tree.update(0, 0, N - 1, pos - 1, val)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2093_-_Actualizare_Element,_Stergere_Minim&amp;diff=9972</id>
		<title>2093 - Actualizare Element, Stergere Minim</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2093_-_Actualizare_Element,_Stergere_Minim&amp;diff=9972"/>
		<updated>2024-06-03T15:48:07Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui element (schimbarea valorii sale) și determinarea, urmată de ștergerea, elementului minim. Dacă valoarea minimă apare de mai multe ori în șir, se elimină prima sa apariție. Se consideră că elementele aflate în dreapta celui eliminat se deplasează o poziție la stânga (acoperă golul lăsat). == Cerinţa == Afișați, după fiecare operație de ștergere,...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui element (schimbarea valorii sale) și determinarea, urmată de ștergerea, elementului minim. Dacă valoarea minimă apare de mai multe ori în șir, se elimină prima sa apariție. Se consideră că elementele aflate în dreapta celui eliminat se deplasează o poziție la stânga (acoperă golul lăsat).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Afișați, după fiecare operație de ștergere, valoarea eliminată.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a fisierului aesm.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a doua, conține, separate prin câte un spațiu, elementele șirului. Pe linia a treia e află un număr M ce reprezintă numărul de operații ce se efectuează asupra șirului. Pe fiecare din următoarele M linii se găsește descrierea unei operații, astfel: fie se găsește pe linie doar numărul 1, fie se găsește numărul 2, urmat de un număr p și de un număr x, separate prin câte un spațiu. Dacă operația este de tip 1, se va determina valoarea minimă din șir și apoi se va șterge prima sa apariție. Dacă operația este de tip 2, elementul aflat în șir pe poziția p va primi valoarea x. Se garantează că la apariția fiecărei astfel de operații șirul conține cel puțin p numere.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul aesm.out conține valorile minime din momentul apariției operațiilor de tip 1, câte una pe linie, în ordinea apariției în fișierul de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100.000&lt;br /&gt;
* 1 ≤ M ≤ 100.000&lt;br /&gt;
* elementele șirului dat sunt indexate de la 1&lt;br /&gt;
* elementele șirului dat precum și valoriile x sunt pozitive ≤ 2.000.000.000&lt;br /&gt;
* se garantează că numărul de operații de tip 1 este ≤ N&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; aesm.in&lt;br /&gt;
 7&lt;br /&gt;
 1 6 3 9 3 7 2&lt;br /&gt;
 5&lt;br /&gt;
 1&lt;br /&gt;
 2 4 2&lt;br /&gt;
 1&lt;br /&gt;
 2 5 8&lt;br /&gt;
 1&lt;br /&gt;
; aesm.out&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Minimul din șir este 1, aflat pe poziția 1, acesta se afișează și se șterge. Șirul rămâne 6 3 9 3 7 2. După prima operație de tip 2, șirul devine: 6 3 9 2 7 2. Se obține minimul 2 și se șterge acesta, șirul devenind 6 3 9 7 2. A doua operație de tip 2 transformă acum șirul în 6 3 9 7 8. Ultima dată se tipărește și se șterge 3.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def remove_min(nums, heap):&lt;br /&gt;
    min_val = nums[heap[0]]&lt;br /&gt;
    nums[heap[0]] = None&lt;br /&gt;
    heapq.heapify(heap)&lt;br /&gt;
    return min_val&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;aesm.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;aesm.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        nums = list(map(int, fin.readline().split()))&lt;br /&gt;
        heap = [(num, idx) for idx, num in enumerate(nums) if num is not None]&lt;br /&gt;
        heapq.heapify(heap)&lt;br /&gt;
        &lt;br /&gt;
        M = int(fin.readline())&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            op = fin.readline().split()&lt;br /&gt;
            if op[0] == &#039;1&#039;:&lt;br /&gt;
                min_val = remove_min(nums, heap)&lt;br /&gt;
                fout.write(f&amp;quot;{min_val}\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                p, x = map(int, op[1:])&lt;br /&gt;
                nums[p - 1] = x&lt;br /&gt;
                heapq.heapify(heap)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2095_-_Descompunere_in_Intervale&amp;diff=9970</id>
		<title>2095 - Descompunere in Intervale</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2095_-_Descompunere_in_Intervale&amp;diff=9970"/>
		<updated>2024-06-03T15:45:49Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dau numerele N și M și apoi M perechi de numere X, Y ambele valori fiind cuprinse între 1 și N. În această problemă numim interval o mulțime de numere naturale consecutive. Notăm [A, B] cu A &amp;lt;= B ca fiind intervalul format din numerele A, A+1, A+2, ... B-1, B. Numim descompunere în intervale a unei perechi de numere X, Y ca fiind o mulțime de intervale care acoperă complet mulțimea (fiecare număr dintre X și Y, inclusiv, este conținut de exact u...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dau numerele N și M și apoi M perechi de numere X, Y ambele valori fiind cuprinse între 1 și N. În această problemă numim interval o mulțime de numere naturale consecutive. Notăm [A, B] cu A &amp;lt;= B ca fiind intervalul format din numerele A, A+1, A+2, ... B-1, B. Numim descompunere în intervale a unei perechi de numere X, Y ca fiind o mulțime de intervale care acoperă complet mulțimea (fiecare număr dintre X și Y, inclusiv, este conținut de exact un interval din descompunere). De exemplu, pentru perechea 5,10, o descompunere în intervale este [5,5], [6,8],[9,10]. Dorim să realizăm o descompunere în intervale a tuturor celor M perechi de numere date, astfel încât să se îndeplinească condițiile următoare (notăm L = 1 + [log2N]).&lt;br /&gt;
fiecare pereche să aibă în descompunere maxim 2*L intervale.&lt;br /&gt;
numărul total de intervale distincte cu mai mult de un element care apar în descompuneri să nu depășească valoarea N.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Afișați descompunerea fiecărei perechi din fișierul de intrare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fisierului di.in se află două numere N și M, separate prin spațiu, cu semnificația de mai sus. Pe fiecare din următoarele M linii se găsesc câte 2 numere naturale separate prin câte un spațiu, X Y ce reprezintă câte o pereche ce trebuie descompusă.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul di.out conține M linii, pe fiecare aflându-se descompunerea unei perechi date în fișierul de intrare, în ordine. Primul element al unei linii reprezintă numărul de intervale ale unei descompuneri, notat K. Urmează apoi K+1 elemente în ordine strict crescătoare, E1, E2, ... Ek+1. Primul interval este [E1, E2], al doilea este [E2+1, E3] ... Ultimul interval este [Ek+1 ,E  k+1 ].&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100000&lt;br /&gt;
* 1 ≤ M ≤ 200000&lt;br /&gt;
* 1 ≤ X ≤ Y ≤ N&lt;br /&gt;
* X ≤ Y&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; di.in&lt;br /&gt;
 7 10&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 6&lt;br /&gt;
 1 7&lt;br /&gt;
 2 5&lt;br /&gt;
 2 6&lt;br /&gt;
 2 7&lt;br /&gt;
 3 6&lt;br /&gt;
 3 7&lt;br /&gt;
 4 7&lt;br /&gt;
; di.out&lt;br /&gt;
 1 1 4&lt;br /&gt;
 2 1 4 5&lt;br /&gt;
 2 1 4 6&lt;br /&gt;
 1 1 7&lt;br /&gt;
 3 2 2 4 5&lt;br /&gt;
 3 2 2 4 6&lt;br /&gt;
 3 2 2 4 7&lt;br /&gt;
 2 3 4 6&lt;br /&gt;
 3 3 4 6 7&lt;br /&gt;
 2 4 4 7&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Pentru perechea 2,7 codificarea descompunerii este 2 2 4 7 reprezentând intervalele [2,2], [3,4], [5,7].&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def decompose_interval(X, Y, N):&lt;br /&gt;
    L = 1 + math.floor(math.log2(N))&lt;br /&gt;
    intervals = []&lt;br /&gt;
    while Y - X + 1 &amp;gt; 2 * L:&lt;br /&gt;
        intervals.append((X, X + L - 1))&lt;br /&gt;
        X += L&lt;br /&gt;
    intervals.append((X, Y))&lt;br /&gt;
    return intervals&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;di.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;di.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            X, Y = map(int, fin.readline().split())&lt;br /&gt;
            intervals = decompose_interval(X, Y, N)&lt;br /&gt;
            fout.write(f&amp;quot;{len(intervals)} {&#039; &#039;.join(str(i) for interval in intervals for i in interval)}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2094_-_Actualizare_Element,_CMMDC_Interval&amp;diff=9968</id>
		<title>2094 - Actualizare Element, CMMDC Interval</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2094_-_Actualizare_Element,_CMMDC_Interval&amp;diff=9968"/>
		<updated>2024-06-03T15:42:33Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui element (schimbarea valorii sale) și interogarea unui interval de indici (determinarea celui mai mare divizor comun pentru valorile aflate între cei doi indici, inclusiv). == Cerinţa == Afișați răspunsul la fiecare interogare. == Date de intrare == Prima linie a fisierului aecmmdci.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a doua conț...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui element (schimbarea valorii sale) și interogarea unui interval de indici (determinarea celui mai mare divizor comun pentru valorile aflate între cei doi indici, inclusiv).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Afișați răspunsul la fiecare interogare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a fisierului aecmmdci.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a doua conține, separate prin câte un spațiu, elementele șirului dat. Pe linia a treia se află un număr M ce reprezintă numărul de operații ce se efectuează asupra șirului dat. Pe fiecare din următoarele M linii se găsesc câte 3 numere naturale separate prin câte un spațiu: T A B. Dacă T = 1 operația este de interogare iar A și B sunt capetele inrervalului. Dacă T = 2 operația este de actualizare cu semnificația: elementul de pe poziția A devine B.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul aecmmdci.out conține pe câte o linie răspunsul la căte o operațe de tip 1, în ordinea în care acestea apar în datele de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100000&lt;br /&gt;
* 1 ≤ M ≤ 100000&lt;br /&gt;
* 1 ≤ A ≤ B ≤ N&lt;br /&gt;
* elementele șirului dat sunt indexate de la 1&lt;br /&gt;
* elementele șirului dat, precum și cele de la operațiile de actualizare, sunt strict pozitive &amp;lt;= 2000000000&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; aecmmdci.in&lt;br /&gt;
 5&lt;br /&gt;
 2 12 6 9 8&lt;br /&gt;
 3&lt;br /&gt;
 1 2 4&lt;br /&gt;
 2 4 2&lt;br /&gt;
 1 2 4&lt;br /&gt;
; aecmmdci.out&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;aecmmdci.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;aecmmdci.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        arr = list(map(int, fin.readline().split()))&lt;br /&gt;
        last_update = {i + 1: val for i, val in enumerate(arr)}&lt;br /&gt;
&lt;br /&gt;
        m = int(fin.readline())&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            op, a, b = map(int, fin.readline().split())&lt;br /&gt;
            if op == 1:&lt;br /&gt;
                result = gcd(last_update[a], last_update[b])&lt;br /&gt;
                fout.write(f&amp;quot;{result}\n&amp;quot;)&lt;br /&gt;
            elif op == 2:&lt;br /&gt;
                last_update[a] = b&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3526_-_StringQuery&amp;diff=9966</id>
		<title>3526 - StringQuery</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3526_-_StringQuery&amp;diff=9966"/>
		<updated>2024-06-03T15:38:34Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == Se dă un string s de lungime n și q query-uri de forma (op, x, y), unde op poate fi 0 sau 1. Dacă op este egal cu 1, atunci caracterul de pe poziția x din s va deveni y. Dacă op este egal cu 0, se va afișa numărul de caractere distincte ale lui s din intervalul [x, y]. == Date de intrare == Programul citește de la tastatură n, s, q si cele q query-uri. == Date de ieșire == Programul va afișa pe ecran raspunsurile la query-urile de tipul 0, fiecare pe...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un string s de lungime n și q query-uri de forma (op, x, y), unde op poate fi 0 sau 1. Dacă op este egal cu 1, atunci caracterul de pe poziția x din s va deveni y. Dacă op este egal cu 0, se va afișa numărul de caractere distincte ale lui s din intervalul [x, y].&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură n, s, q si cele q query-uri.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran raspunsurile la query-urile de tipul 0, fiecare pe linie nouă.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 5.000.000&lt;br /&gt;
* 1 ≤ q ≤ 250.000&lt;br /&gt;
* s este format doar din litere mici ale alfabetului englez&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 4&lt;br /&gt;
 aaaa&lt;br /&gt;
 4&lt;br /&gt;
 1 2 b&lt;br /&gt;
 1 3 c&lt;br /&gt;
 0 1 2&lt;br /&gt;
 0 2 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
După primele 2 operatii, s = &amp;quot;abca&amp;quot;.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def distinct_characters_in_range(s, x, y):&lt;br /&gt;
    count = {}&lt;br /&gt;
    for i in range(x - 1, y):&lt;br /&gt;
        if s[i] not in count:&lt;br /&gt;
            count[s[i]] = 1&lt;br /&gt;
    return len(count)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți lungimea șirului: &amp;quot;))&lt;br /&gt;
    s = input(&amp;quot;Introduceți șirul: &amp;quot;)&lt;br /&gt;
    q = int(input(&amp;quot;Introduceți numărul de query-uri: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    for _ in range(q):&lt;br /&gt;
        op, x, y = map(int, input().split())&lt;br /&gt;
        if op == 1:&lt;br /&gt;
            s = s[:x - 1] + chr(y) + s[x:]&lt;br /&gt;
        elif op == 0:&lt;br /&gt;
            result = distinct_characters_in_range(s, x, y)&lt;br /&gt;
            print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3600_-_Numbers_Tree&amp;diff=9965</id>
		<title>3600 - Numbers Tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3600_-_Numbers_Tree&amp;diff=9965"/>
		<updated>2024-06-03T15:33:40Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == Se dă un șir a de n numere naturale nenule strict mai mari decât 1, indexat de la 1. Asupra acestui șir se aplică 3 tipuri de operații: * 1 st dr val – toate valorile a[i] cu i din intervalul [st, dr] devin egale cu val; * 2 st dr – se cere să se afle câte elemente ale șirului a care au indicii aflați în intervalul [st, dr] sunt numere compuse(un număr natural este compus dacă are cel puțin 3 divizori); * 3 st dr – se cere să se afișeze lu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un șir a de n numere naturale nenule strict mai mari decât 1, indexat de la 1. Asupra acestui șir se aplică 3 tipuri de operații:&lt;br /&gt;
* 1 st dr val – toate valorile a[i] cu i din intervalul [st, dr] devin egale cu val;&lt;br /&gt;
* 2 st dr – se cere să se afle câte elemente ale șirului a care au indicii aflați în intervalul [st, dr] sunt numere compuse(un număr natural este compus dacă are cel puțin 3 divizori);&lt;br /&gt;
* 3 st dr – se cere să se afișeze lungimea cele mai lungi secvențe de numere prime alcătuită exclusiv din elemente ale șirului care au indicii aflați în intervalul [st, dr](o secvență a unui șir este alcătuită din elemente aflate poziții consecutive).&lt;br /&gt;
Dându-se Q operații, să se raspundă în ordine la cele de tip 2 și 3.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare numbers_tree.in conține pe prima linie numerele n și Q, reprezentând numărul de elemente ale șirului a, respectiv numărul de operații, pe a doua linie n numere naturale separate prin spații reprezentând elementele șirului inițial, iar pe următoarele Q linii sunt descrise operațiile.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire numbers_tree.out va conține pe câte o linie răspunsurile la operațiile de tip 2 și 3 în ordinea în care acestea apar în fișierul de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n, Q ≤ 100.000&lt;br /&gt;
* 2 ≤ a[i], val ≤ 1.000.000&lt;br /&gt;
* 1 ≤ st ≤ dr ≤ n&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; numbers_tree.in&lt;br /&gt;
 7 7&lt;br /&gt;
 2 3 4 5 6 7 8&lt;br /&gt;
 2 1 7&lt;br /&gt;
 3 1 7&lt;br /&gt;
 1 2 5 4&lt;br /&gt;
 2 2 5&lt;br /&gt;
 3 2 5&lt;br /&gt;
 1 2 4 3&lt;br /&gt;
 3 1 6&lt;br /&gt;
; numbers_tree.out&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 0&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as f:&lt;br /&gt;
        n, Q = map(int, f.readline().split())&lt;br /&gt;
        a = list(map(int, f.readline().split()))&lt;br /&gt;
        operations = [list(map(int, line.split())) for line in f.readlines()]&lt;br /&gt;
    return n, a, operations&lt;br /&gt;
&lt;br /&gt;
def is_prime(num):&lt;br /&gt;
    if num &amp;lt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(2, int(num ** 0.5) + 1):&lt;br /&gt;
        if num % i == 0:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def apply_operation_2(a, st, dr):&lt;br /&gt;
    count_composite = 0&lt;br /&gt;
    for i in range(st - 1, dr):&lt;br /&gt;
        if a[i] &amp;gt; 1 and not is_prime(a[i]):&lt;br /&gt;
            count_composite += 1&lt;br /&gt;
    return count_composite&lt;br /&gt;
&lt;br /&gt;
def apply_operation_3(a, st, dr):&lt;br /&gt;
    max_prime_sequence = 0&lt;br /&gt;
    current_prime_sequence = 0&lt;br /&gt;
    for i in range(st - 1, dr):&lt;br /&gt;
        if is_prime(a[i]):&lt;br /&gt;
            current_prime_sequence += 1&lt;br /&gt;
            max_prime_sequence = max(max_prime_sequence, current_prime_sequence)&lt;br /&gt;
        else:&lt;br /&gt;
            current_prime_sequence = 0&lt;br /&gt;
    return max_prime_sequence&lt;br /&gt;
&lt;br /&gt;
def process_operations(n, a, operations):&lt;br /&gt;
    result = []&lt;br /&gt;
    for op in operations:&lt;br /&gt;
        if op[0] == 2:&lt;br /&gt;
            count_composite = apply_operation_2(a, op[1], op[2])&lt;br /&gt;
            result.append(count_composite)&lt;br /&gt;
        elif op[0] == 3:&lt;br /&gt;
            max_prime_sequence = apply_operation_3(a, op[1], op[2])&lt;br /&gt;
            result.append(max_prime_sequence)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, result):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as f:&lt;br /&gt;
        for res in result:&lt;br /&gt;
            f.write(str(res) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    input_file = &amp;quot;numbers_tree.in&amp;quot;&lt;br /&gt;
    output_file = &amp;quot;numbers_tree.out&amp;quot;&lt;br /&gt;
    n, a, operations = read_input(input_file)&lt;br /&gt;
    result = process_operations(n, a, operations)&lt;br /&gt;
    write_output(output_file, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3386_-_Serbare_3&amp;diff=9963</id>
		<title>3386 - Serbare 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3386_-_Serbare_3&amp;diff=9963"/>
		<updated>2024-06-03T15:28:13Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Am o prietenă educatoare. Anul acesta are grupa mică și trebuie să organizeze serbarea de Crăciun. Ea s-a gândit să așeze copiii sub forma unui brad (cam așa ∆). Va împărți copiii în trei categorii: prima categorie va fi formată din primii X cei mai scunzi copii, a doua categorie este formată din copiii cu înălțimea maximă și restul Y de copii în a treia categorie. Copiii din prima categorie vor fi așezați în ordinea crescătoare a înăl...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Am o prietenă educatoare. Anul acesta are grupa mică și trebuie să organizeze serbarea de Crăciun. Ea s-a gândit să așeze copiii sub forma unui brad (cam așa ∆). Va împărți copiii în trei categorii: prima categorie va fi formată din primii X cei mai scunzi copii, a doua categorie este formată din copiii cu înălțimea maximă și restul Y de copii în a treia categorie. Copiii din prima categorie vor fi așezați în ordinea crescătoare a înălțimilor, iar cei din a treia categorie în ordinea descrescătoare a înălțimilor. Prietena mea vrea ca toți copiii cu aceeași înălțime să stea unul lângă altul, iar dacă numărul de copii din prima categorie nu poate fi egal cu cel din a treia, vrea ca prima categorie să fie mai numeroasă (X ≥ Y). Prietena mea știe N, numărul de elevi din grupă, prenumele copiilor și înălțimea lor în centimetri. Ea încearcă de câteva zile să îi așeze. Oare cum ar rezolva un elev olimpic la informatică această problemă?&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieţi un program care să determine:&lt;br /&gt;
1. Numărul maxim de copii cu aceeași înălțime.&lt;br /&gt;
2. O posibilă distribuire a înălțimilor sub forma unui brad.&lt;br /&gt;
3. Lista cu prenumele copiilor conform distribuirii înălțimilor determinată anterior.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare serbare.in conține pe prima linie cerința (1, 2 sau 3). Linia următoare conține un număr natural N reprezentând numărul de copii. Pe următoarele N linii conține câte o pereche de forma prenume înălțime, reprezentând prenumele și înălțimea corespunzătoare fiecărui copil din grupă.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire serbare.out va conține, dacă cerința este 1, o singură linie pe care va fi scris un număr natural determinat conform cerinței, dacă cerința este 2 va conține o linie pe care vor fi scrise N numere naturale determinate conform cerinței, dacă cerința este 3 va conține o linie pe care vor fi scrise prenumele copiilor conform distribuirii înălțimilor afișate la cerința 2.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 0 &amp;lt; N, X, Y &amp;lt; 101; X ≥ Y&lt;br /&gt;
* 0 &amp;lt; înălțime &amp;lt; 151, numere naturale.&lt;br /&gt;
* prenumele este un cuvânt cu cel mult 50 de caractere alfabetice.&lt;br /&gt;
* NU există doi copii cu același prenume.&lt;br /&gt;
* Dacă sunt mai multe soluții se va afișa prima din punct de vedere lexicografic.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; serbare.in&lt;br /&gt;
 1&lt;br /&gt;
 5&lt;br /&gt;
 Ionel 96&lt;br /&gt;
 Vasile 88&lt;br /&gt;
 Gigel 66&lt;br /&gt;
 Mara 77&lt;br /&gt;
 Ana 77&lt;br /&gt;
; serbare.out&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sunt 2 copii cu aceeași înălțime (77), acesta fiind numărul maxim de apariții a aceleiași înălțimi.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; serbare.in&lt;br /&gt;
 2&lt;br /&gt;
 5&lt;br /&gt;
 Ionel 96&lt;br /&gt;
 Vasile 88&lt;br /&gt;
 Gigel 66&lt;br /&gt;
 Mara 77&lt;br /&gt;
 Ana 77&lt;br /&gt;
; serbare.out&lt;br /&gt;
 66 77 77 96 88&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Așezăm copiii în ordinea crescătoare a înălțimilor și apoi în ordinea descrescătoare a înălțimilor.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as f:&lt;br /&gt;
        request = int(f.readline().strip())&lt;br /&gt;
        N = int(f.readline().strip())&lt;br /&gt;
        children = []&lt;br /&gt;
        for _ in range(N):&lt;br /&gt;
            name, height = f.readline().strip().split()&lt;br /&gt;
            children.append((name, int(height)))&lt;br /&gt;
    return request, children&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, output):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as f:&lt;br /&gt;
        if isinstance(output, int):&lt;br /&gt;
            f.write(str(output))&lt;br /&gt;
        elif isinstance(output, list):&lt;br /&gt;
            f.write(&#039; &#039;.join(map(str, output)))&lt;br /&gt;
        elif isinstance(output, tuple):&lt;br /&gt;
            f.write(&#039; &#039;.join(output))&lt;br /&gt;
&lt;br /&gt;
def max_same_height(children):&lt;br /&gt;
    heights = {}&lt;br /&gt;
    for _, height in children:&lt;br /&gt;
        if height in heights:&lt;br /&gt;
            heights[height] += 1&lt;br /&gt;
        else:&lt;br /&gt;
            heights[height] = 1&lt;br /&gt;
    return max(heights.values())&lt;br /&gt;
&lt;br /&gt;
def arrange_children(children, max_height_count):&lt;br /&gt;
    sorted_children = sorted(children, key=lambda x: x[1])&lt;br /&gt;
    ascending = sorted_children[:max_height_count]&lt;br /&gt;
    descending = sorted_children[max_height_count:]&lt;br /&gt;
    descending.reverse()&lt;br /&gt;
    arranged_children = [child[1] for child in ascending] + [child[1] for child in descending]&lt;br /&gt;
    return arranged_children&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    input_file = &amp;quot;serbare.in&amp;quot;&lt;br /&gt;
    output_file = &amp;quot;serbare.out&amp;quot;&lt;br /&gt;
    request, children = read_input(input_file)&lt;br /&gt;
&lt;br /&gt;
    if request == 1:&lt;br /&gt;
        max_same = max_same_height(children)&lt;br /&gt;
        write_output(output_file, max_same)&lt;br /&gt;
    elif request == 2:&lt;br /&gt;
        max_same = max_same_height(children)&lt;br /&gt;
        arranged_children = arrange_children(children, max_same)&lt;br /&gt;
        write_output(output_file, arranged_children)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2054_-_Joc_7&amp;diff=9961</id>
		<title>2054 - Joc 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2054_-_Joc_7&amp;diff=9961"/>
		<updated>2024-06-03T15:22:20Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Enunt == Inspirați de clasicul joc Tic-Tac-Toe (X și 0), Teodora și Ștefan își propun să joace ceva asemănător, adăugând jocului clasic câteva reguli noi:  tabla de joc este un pătrat de latură N, care este împărțit în N*N celule, așezate pe N linii și N coloane; celulele pătratului sunt numerotate de la 1 la N^2 parcurgând liniile de sus în jos, și coloanele de la stânga la dreapta; Teodora va marca celulele cu X (litera X), iar Ștefan cu 0 (cifr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Inspirați de clasicul joc Tic-Tac-Toe (X și 0), Teodora și Ștefan își propun să joace ceva asemănător, adăugând jocului clasic câteva reguli noi:&lt;br /&gt;
&lt;br /&gt;
tabla de joc este un pătrat de latură N, care este împărțit în N*N celule, așezate pe N linii și N coloane; celulele pătratului sunt numerotate de la 1 la N^2 parcurgând liniile de sus în jos, și coloanele de la stânga la dreapta;&lt;br /&gt;
Teodora va marca celulele cu X (litera X), iar Ștefan cu 0 (cifra 0);&lt;br /&gt;
în cadrul unei runde, copiii marchează alternativ câte o celulă din pătrat, nemarcată anterior;&lt;br /&gt;
o rundă a jocului este descrisă printr-un șir format din exact N^2 numere naturale reprezentând celulele pătratului, în ordinea în care au fost marcate succesiv de cei doi copii;&lt;br /&gt;
jocul are K runde; prima este începută de Teodora, a doua de Ștefan, a treia Teodora, a patra Ștefan și așa mai departe;&lt;br /&gt;
o rundă este câștigată de jucătorul care reușește primul să marcheze complet o linie, o coloană, diagonala principală sau una din cele două semidiagonale paralele și alăturate cu aceasta, diagonala secundară sau una din cele două semidiagonale paralele și alăturate acesteia;&lt;br /&gt;
o rundă se încheie fără un câștigător dacă după marcarea celor N^2 celule nu există pe tabla de joc nicio linie, coloană, diagonală sau semidiagonală marcate cu același simbol.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând numerele N, K și cele K șiruri de numere care reprezintă rundele jucate, scrieți un program care să rezolve una dintre următoarele două cerințe:&lt;br /&gt;
&lt;br /&gt;
Să se determine câte runde a câștigat fiecare copil.&lt;br /&gt;
Să se determine care este cel mai mare număr de marcări efectuate până la câștigarea unei runde.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare joc7.in conține pe prima linie un număr natural C. Pentru toate testele, C poate lua numai valorile 1 sau 2. Pe a doua linie se află două numere naturale N și K, separate prin câte un spațiu, reprezentând dimensiunea tablei de joc și respectiv numărul de runde jucate. Pe următoarele K linii sunt descrise rundele de joc, câte o rundă pe câte o linie a fișierului. În cadrul liniilor, numerele sunt separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă valoarea lui C este 1, se va rezolva numai punctul 1) din cerințe. În acest caz, fișierul de ieșire joc7.out va conține pe prima linie două numere naturale t și s, separate printr-un spațiu, unde t reprezintă numărul de runde câștigate de Teodora, iar s numărul rundelor câștigate de Ștefan.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui C este 2, se va rezolva numai punctul 2) din cerințe. În acest caz, fișierul de ieșire joc7.out va conține pe prima linie numărul cel mai mare de marcări efectuate până la câștigarea unei runde.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 3 ≤ N ≤ 100&lt;br /&gt;
* 1 ≤ K ≤ 25&lt;br /&gt;
* La fiecare joc se câștigă cel puțin o rundă.&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerințe se acordă 45 de puncte, iar pentru rezolvarea corectă a celei de a doua cerințe se acordă 45 de puncte. În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemple.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; joc7.in&lt;br /&gt;
 1&lt;br /&gt;
 4 4&lt;br /&gt;
 16 13 15 9 10 1 5 2 6 14 3 7 11 4 8 12&lt;br /&gt;
 1 2 3 4 5 6 7 8 12 11 10 9 13 14 15 16&lt;br /&gt;
 1 5 9 6 2 7 3 8 4 10 11 12 13 14 15 16&lt;br /&gt;
 1 2 3 4 8 7 6 5 12 11 10 9 16 15 14 13&lt;br /&gt;
; joc7.out&lt;br /&gt;
 2 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Ilustrarea rundelor de joc până la momentul identificării unui câștigător este următoarea:&lt;br /&gt;
&lt;br /&gt;
* Runda 1 (începe Teodora): Runda este câștigată de Teodora după 7 marcări. Se completează semidiagonala situată sub diagonala principală.&lt;br /&gt;
* Runda 2 (începe Ştefan): Runda este câştigată de Teodora după 14 marcări. Se completează semidiagonala situată sub diagonala secundară.&lt;br /&gt;
* Runda 3 (începe Teodora): Runda este câştigată de Ștefan după 8 marcări. Se completează linia a doua.&lt;br /&gt;
* Runda 4 (începe Ştefan): Runda nu este câştigată de niciun jucător.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; joc7.in&lt;br /&gt;
 2&lt;br /&gt;
 4 4&lt;br /&gt;
 16 13 15 9 10 1 5 2 6 14 3 7 11 4 8 12&lt;br /&gt;
 1 2 3 4 5 6 7 8 12 11 10 9 13 14 15 16&lt;br /&gt;
 1 5 9 6 2 7 3 8 4 10 11 12 13 14 15 16&lt;br /&gt;
 1 2 3 4 8 7 6 5 12 11 10 9 16 15 14 13&lt;br /&gt;
; joc7.out&lt;br /&gt;
 14&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Doar 3 dintre cele 4 runde jucate au fost câştigate. Până în momentul câştigării în prima rundă s-au făcut 7 marcări, în a doua 14, iar în a treia 8. Deci numărul maxim de marcări făcute până la câştigarea unei runde este 14.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def check_winner(board, N):&lt;br /&gt;
    # Verificăm liniile și coloanele&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        if all(board[i][j] == board[i][0] and board[i][0] != &#039;.&#039; for j in range(N)):&lt;br /&gt;
            return True&lt;br /&gt;
        if all(board[j][i] == board[0][i] and board[0][i] != &#039;.&#039; for j in range(N)):&lt;br /&gt;
            return True&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm diagonala principală&lt;br /&gt;
    if all(board[i][i] == board[0][0] and board[0][0] != &#039;.&#039; for i in range(N)):&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm diagonala secundară&lt;br /&gt;
    if all(board[i][N-1-i] == board[0][N-1] and board[0][N-1] != &#039;.&#039; for i in range(N)):&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def max_marks_per_round(rounds):&lt;br /&gt;
    max_marks = 0&lt;br /&gt;
    for round in rounds:&lt;br /&gt;
        max_marks = max(max_marks, len(round))&lt;br /&gt;
    return max_marks&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    C = int(input().strip())&lt;br /&gt;
    N, K = map(int, input().strip().split())&lt;br /&gt;
    rounds = [input().strip().split() for _ in range(K)]&lt;br /&gt;
    &lt;br /&gt;
    if C == 1:&lt;br /&gt;
        # Numărăm câte runde a câștigat fiecare copil&lt;br /&gt;
        teodora_wins = 0&lt;br /&gt;
        stefan_wins = 0&lt;br /&gt;
        for round in rounds:&lt;br /&gt;
            board = [[&#039;.&#039; for _ in range(N)] for _ in range(N)]&lt;br /&gt;
            for i, mark in enumerate(round):&lt;br /&gt;
                row = (int(mark) - 1) // N&lt;br /&gt;
                col = (int(mark) - 1) % N&lt;br /&gt;
                if i % 2 == 0:&lt;br /&gt;
                    board[row][col] = &#039;X&#039;&lt;br /&gt;
                else:&lt;br /&gt;
                    board[row][col] = &#039;O&#039;&lt;br /&gt;
            if check_winner(board, N):&lt;br /&gt;
                if len(round) % 2 == 1:&lt;br /&gt;
                    teodora_wins += 1&lt;br /&gt;
                else:&lt;br /&gt;
                    stefan_wins += 1&lt;br /&gt;
        &lt;br /&gt;
        print(teodora_wins, stefan_wins)&lt;br /&gt;
    elif C == 2:&lt;br /&gt;
        # Determinăm cel mai mare număr de marcați efectuate până la câștigarea unei runde&lt;br /&gt;
        max_marks = max_marks_per_round(rounds)&lt;br /&gt;
        print(max_marks)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3187_-_RATC2&amp;diff=9959</id>
		<title>3187 - RATC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3187_-_RATC2&amp;diff=9959"/>
		<updated>2024-06-03T15:14:25Z</updated>

		<summary type="html">&lt;p&gt;AjM: /* Exemplul 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau două numere n p și o listă de n elemente cu urcările în autobuz a mai multor persoane a căror structura este prenume nume bilet_platit, fiecare intrare fiind plasată pe câte o linie. Câmpurile prenume și nume sunt șiruri de caractere, iar bilet_platit este un număr care poate fi 0 sau 1; 0 dacă persoana respectivă nu a plătit biletul sau 1 dacă a plătit biletul. Pentru fiecare bilet neplătit se va contoriza o penalizare persoanei.&lt;br /&gt;
&lt;br /&gt;
Se cere :&lt;br /&gt;
&lt;br /&gt;
a) Prenumele, numele și numărul de penalizări al persoanei care are număr maxim de penalizări. Dacă există mai multe persoane cu număr maxim de penalizări se cere afișarea persoanei care apare prima în ordine alfabetică.&lt;br /&gt;
b) Ordonarea listei de persoane descrescător după numărul de penalizări, la număr de penalizări egale, crescător după prenume, la prenume identice, crescător după nume.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ratc2.in conține pe prima linie numerele n p, iar pe următoarele n linii datele despre fiecare urcare în autobuz separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă p = 1 se va rezolva cerința a). În acest caz, fișierul ratc2.out va conține pe prima linie datele cu semnificația din enunț separate printr-un spațiu.&lt;br /&gt;
Dacă p = 2 se va rezolva cerința b). În acest caz, fișierul ratc2.out va conține pe câte o linie datele cu semnificația din enunț separate printr-un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
șirurile de caractere vor avea maxim 50 de caractere&lt;br /&gt;
Atenție, persoanele care urcă în autobuz se pot repeta!&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; ratc2.in&lt;br /&gt;
 5 1&lt;br /&gt;
 Jotaro Kujo 1&lt;br /&gt;
 Dio Brando 0&lt;br /&gt;
 Joseph Joestar 1&lt;br /&gt;
 Dio Brando 1&lt;br /&gt;
 Andreescu Ionel 0&lt;br /&gt;
; ratc2.out&lt;br /&gt;
 Andreescu Ionel 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Dio Brando și Andreescu Ionel au același număr de penalizări dar Andreescu Ionel e primul în ordine alfabetică.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; ratc2.in&lt;br /&gt;
 5 2&lt;br /&gt;
 Jotaro Kujo 1&lt;br /&gt;
 Dio Brando 0&lt;br /&gt;
 Joseph Joestar 1&lt;br /&gt;
 Dio Brando 1&lt;br /&gt;
 Andreescu Ionel 0&lt;br /&gt;
; ratc2.out&lt;br /&gt;
 Andreescu Ionel 1&lt;br /&gt;
 Dio Brando 1&lt;br /&gt;
 Joseph Joestar 0&lt;br /&gt;
 Jotaro Kujo 0&lt;br /&gt;
 &amp;lt;br&amp;gt;&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Listă a fost ordonată dupa criteriile precizate la cerința b).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        data = [tuple(file.readline().split()) for _ in range(n)]&lt;br /&gt;
    return p, data&lt;br /&gt;
&lt;br /&gt;
def calculate_penalties(data):&lt;br /&gt;
    penalties = {}&lt;br /&gt;
    for entry in data:&lt;br /&gt;
        name = entry[0] + &amp;quot; &amp;quot; + entry[1]&lt;br /&gt;
        if entry[2] == &#039;0&#039;:&lt;br /&gt;
            penalties[name] = penalties.get(name, 0) + 1&lt;br /&gt;
    return penalties&lt;br /&gt;
&lt;br /&gt;
def find_max_penalties(penalties):&lt;br /&gt;
    max_penalties = max(penalties.values())&lt;br /&gt;
    max_penalty_names = [name for name, penalty in penalties.items() if penalty == max_penalties]&lt;br /&gt;
    max_penalty_names.sort()&lt;br /&gt;
    return max_penalty_names[0], max_penalties&lt;br /&gt;
&lt;br /&gt;
def sort_people(data):&lt;br /&gt;
    return sorted(data, key=lambda x: (-penalties.get(x[0] + &amp;quot; &amp;quot; + x[1], 0), x[0], x[1]))&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, result):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as file:&lt;br /&gt;
        for line in result:&lt;br /&gt;
            file.write(&amp;quot; &amp;quot;.join(line) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    p, data = read_input(&#039;ratc2.in&#039;)&lt;br /&gt;
    penalties = calculate_penalties(data)&lt;br /&gt;
    &lt;br /&gt;
    if p == 1:&lt;br /&gt;
        max_name, max_penalty = find_max_penalties(penalties)&lt;br /&gt;
        write_output(&#039;ratc2.out&#039;, [(max_name, str(max_penalty))])&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        sorted_data = sort_people(data)&lt;br /&gt;
        write_output(&#039;ratc2.out&#039;, sorted_data)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3187_-_RATC2&amp;diff=9958</id>
		<title>3187 - RATC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3187_-_RATC2&amp;diff=9958"/>
		<updated>2024-06-03T15:14:02Z</updated>

		<summary type="html">&lt;p&gt;AjM: /* Exemplul 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau două numere n p și o listă de n elemente cu urcările în autobuz a mai multor persoane a căror structura este prenume nume bilet_platit, fiecare intrare fiind plasată pe câte o linie. Câmpurile prenume și nume sunt șiruri de caractere, iar bilet_platit este un număr care poate fi 0 sau 1; 0 dacă persoana respectivă nu a plătit biletul sau 1 dacă a plătit biletul. Pentru fiecare bilet neplătit se va contoriza o penalizare persoanei.&lt;br /&gt;
&lt;br /&gt;
Se cere :&lt;br /&gt;
&lt;br /&gt;
a) Prenumele, numele și numărul de penalizări al persoanei care are număr maxim de penalizări. Dacă există mai multe persoane cu număr maxim de penalizări se cere afișarea persoanei care apare prima în ordine alfabetică.&lt;br /&gt;
b) Ordonarea listei de persoane descrescător după numărul de penalizări, la număr de penalizări egale, crescător după prenume, la prenume identice, crescător după nume.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ratc2.in conține pe prima linie numerele n p, iar pe următoarele n linii datele despre fiecare urcare în autobuz separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă p = 1 se va rezolva cerința a). În acest caz, fișierul ratc2.out va conține pe prima linie datele cu semnificația din enunț separate printr-un spațiu.&lt;br /&gt;
Dacă p = 2 se va rezolva cerința b). În acest caz, fișierul ratc2.out va conține pe câte o linie datele cu semnificația din enunț separate printr-un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
șirurile de caractere vor avea maxim 50 de caractere&lt;br /&gt;
Atenție, persoanele care urcă în autobuz se pot repeta!&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; ratc2.in&lt;br /&gt;
 5 1&lt;br /&gt;
 Jotaro Kujo 1&lt;br /&gt;
 Dio Brando 0&lt;br /&gt;
 Joseph Joestar 1&lt;br /&gt;
 Dio Brando 1&lt;br /&gt;
 Andreescu Ionel 0&lt;br /&gt;
; ratc2.out&lt;br /&gt;
 Andreescu Ionel 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Dio Brando și Andreescu Ionel au același număr de penalizări dar Andreescu Ionel e primul în ordine alfabetică.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; ratc2.in&lt;br /&gt;
 5 2&lt;br /&gt;
Jotaro Kujo 1&lt;br /&gt;
Dio Brando 0&lt;br /&gt;
Joseph Joestar 1&lt;br /&gt;
Dio Brando 1&lt;br /&gt;
Andreescu Ionel 0&lt;br /&gt;
; ratc2.out&lt;br /&gt;
 Andreescu Ionel 1&lt;br /&gt;
 Dio Brando 1&lt;br /&gt;
 Joseph Joestar 0&lt;br /&gt;
 Jotaro Kujo 0&lt;br /&gt;
 &amp;lt;br&amp;gt;&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Listă a fost ordonată dupa criteriile precizate la cerința b).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        data = [tuple(file.readline().split()) for _ in range(n)]&lt;br /&gt;
    return p, data&lt;br /&gt;
&lt;br /&gt;
def calculate_penalties(data):&lt;br /&gt;
    penalties = {}&lt;br /&gt;
    for entry in data:&lt;br /&gt;
        name = entry[0] + &amp;quot; &amp;quot; + entry[1]&lt;br /&gt;
        if entry[2] == &#039;0&#039;:&lt;br /&gt;
            penalties[name] = penalties.get(name, 0) + 1&lt;br /&gt;
    return penalties&lt;br /&gt;
&lt;br /&gt;
def find_max_penalties(penalties):&lt;br /&gt;
    max_penalties = max(penalties.values())&lt;br /&gt;
    max_penalty_names = [name for name, penalty in penalties.items() if penalty == max_penalties]&lt;br /&gt;
    max_penalty_names.sort()&lt;br /&gt;
    return max_penalty_names[0], max_penalties&lt;br /&gt;
&lt;br /&gt;
def sort_people(data):&lt;br /&gt;
    return sorted(data, key=lambda x: (-penalties.get(x[0] + &amp;quot; &amp;quot; + x[1], 0), x[0], x[1]))&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, result):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as file:&lt;br /&gt;
        for line in result:&lt;br /&gt;
            file.write(&amp;quot; &amp;quot;.join(line) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    p, data = read_input(&#039;ratc2.in&#039;)&lt;br /&gt;
    penalties = calculate_penalties(data)&lt;br /&gt;
    &lt;br /&gt;
    if p == 1:&lt;br /&gt;
        max_name, max_penalty = find_max_penalties(penalties)&lt;br /&gt;
        write_output(&#039;ratc2.out&#039;, [(max_name, str(max_penalty))])&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        sorted_data = sort_people(data)&lt;br /&gt;
        write_output(&#039;ratc2.out&#039;, sorted_data)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3187_-_RATC2&amp;diff=9957</id>
		<title>3187 - RATC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3187_-_RATC2&amp;diff=9957"/>
		<updated>2024-06-03T15:13:23Z</updated>

		<summary type="html">&lt;p&gt;AjM: Pagină nouă: == Cerinţa == Se dau două numere n p și o listă de n elemente cu urcările în autobuz a mai multor persoane a căror structura este prenume nume bilet_platit, fiecare intrare fiind plasată pe câte o linie. Câmpurile prenume și nume sunt șiruri de caractere, iar bilet_platit este un număr care poate fi 0 sau 1; 0 dacă persoana respectivă nu a plătit biletul sau 1 dacă a plătit biletul. Pentru fiecare bilet neplătit se va contoriza o penalizare persoanei.  Se c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau două numere n p și o listă de n elemente cu urcările în autobuz a mai multor persoane a căror structura este prenume nume bilet_platit, fiecare intrare fiind plasată pe câte o linie. Câmpurile prenume și nume sunt șiruri de caractere, iar bilet_platit este un număr care poate fi 0 sau 1; 0 dacă persoana respectivă nu a plătit biletul sau 1 dacă a plătit biletul. Pentru fiecare bilet neplătit se va contoriza o penalizare persoanei.&lt;br /&gt;
&lt;br /&gt;
Se cere :&lt;br /&gt;
&lt;br /&gt;
a) Prenumele, numele și numărul de penalizări al persoanei care are număr maxim de penalizări. Dacă există mai multe persoane cu număr maxim de penalizări se cere afișarea persoanei care apare prima în ordine alfabetică.&lt;br /&gt;
b) Ordonarea listei de persoane descrescător după numărul de penalizări, la număr de penalizări egale, crescător după prenume, la prenume identice, crescător după nume.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ratc2.in conține pe prima linie numerele n p, iar pe următoarele n linii datele despre fiecare urcare în autobuz separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă p = 1 se va rezolva cerința a). În acest caz, fișierul ratc2.out va conține pe prima linie datele cu semnificația din enunț separate printr-un spațiu.&lt;br /&gt;
Dacă p = 2 se va rezolva cerința b). În acest caz, fișierul ratc2.out va conține pe câte o linie datele cu semnificația din enunț separate printr-un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
șirurile de caractere vor avea maxim 50 de caractere&lt;br /&gt;
Atenție, persoanele care urcă în autobuz se pot repeta!&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; ratc2.in&lt;br /&gt;
 5 1&lt;br /&gt;
Jotaro Kujo 1&lt;br /&gt;
Dio Brando 0&lt;br /&gt;
Joseph Joestar 1&lt;br /&gt;
Dio Brando 1&lt;br /&gt;
Andreescu Ionel 0&lt;br /&gt;
; ratc2.out&lt;br /&gt;
 Andreescu Ionel 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Dio Brando și Andreescu Ionel au același număr de penalizări dar Andreescu Ionel e primul în ordine alfabetică.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; ratc2.in&lt;br /&gt;
 5 2&lt;br /&gt;
Jotaro Kujo 1&lt;br /&gt;
Dio Brando 0&lt;br /&gt;
Joseph Joestar 1&lt;br /&gt;
Dio Brando 1&lt;br /&gt;
Andreescu Ionel 0&lt;br /&gt;
; ratc2.out&lt;br /&gt;
 Andreescu Ionel 1&lt;br /&gt;
Dio Brando 1&lt;br /&gt;
Joseph Joestar 0&lt;br /&gt;
Jotaro Kujo 0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Listă a fost ordonată dupa criteriile precizate la cerința b).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        data = [tuple(file.readline().split()) for _ in range(n)]&lt;br /&gt;
    return p, data&lt;br /&gt;
&lt;br /&gt;
def calculate_penalties(data):&lt;br /&gt;
    penalties = {}&lt;br /&gt;
    for entry in data:&lt;br /&gt;
        name = entry[0] + &amp;quot; &amp;quot; + entry[1]&lt;br /&gt;
        if entry[2] == &#039;0&#039;:&lt;br /&gt;
            penalties[name] = penalties.get(name, 0) + 1&lt;br /&gt;
    return penalties&lt;br /&gt;
&lt;br /&gt;
def find_max_penalties(penalties):&lt;br /&gt;
    max_penalties = max(penalties.values())&lt;br /&gt;
    max_penalty_names = [name for name, penalty in penalties.items() if penalty == max_penalties]&lt;br /&gt;
    max_penalty_names.sort()&lt;br /&gt;
    return max_penalty_names[0], max_penalties&lt;br /&gt;
&lt;br /&gt;
def sort_people(data):&lt;br /&gt;
    return sorted(data, key=lambda x: (-penalties.get(x[0] + &amp;quot; &amp;quot; + x[1], 0), x[0], x[1]))&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, result):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as file:&lt;br /&gt;
        for line in result:&lt;br /&gt;
            file.write(&amp;quot; &amp;quot;.join(line) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    p, data = read_input(&#039;ratc2.in&#039;)&lt;br /&gt;
    penalties = calculate_penalties(data)&lt;br /&gt;
    &lt;br /&gt;
    if p == 1:&lt;br /&gt;
        max_name, max_penalty = find_max_penalties(penalties)&lt;br /&gt;
        write_output(&#039;ratc2.out&#039;, [(max_name, str(max_penalty))])&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        sorted_data = sort_people(data)&lt;br /&gt;
        write_output(&#039;ratc2.out&#039;, sorted_data)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3111_-_Hotar&amp;diff=9955</id>
		<title>3111 - Hotar</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3111_-_Hotar&amp;diff=9955"/>
		<updated>2024-06-03T15:03:33Z</updated>

		<summary type="html">&lt;p&gt;AjM: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Proprietatea trebuie împărțită fraților în mod egal. Zona are forma unui poligon convex cu vârfurile numerotate începând cu 1. Hotarul trebuie să fie un segment care are unul dintre capete în vârful 1 al poligonului. Trebuie să determinați celălalt capăt al segmentului care stabilește hotarul, așa încât ariile celor două suprafețe formate să fie egale. Punctul determinat trebuie să se afle pe poligon.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare hotar.in conține pe prima linie numărul de vârfuri ale poligonului, notat cu n. Pe fiecare dintre următoarele n linii se află coordonatele vârfurilor, date în ordine trigonometrică (invers acelor de ceasornic), mai întâi ordonata, apoi abscisa, separate printr-un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire hotar.out mai întâi abscisa, apoi ordonata pentru punctul calculat. Aceste două valori se scriu trunchiate la primele trei zecimale și se separă printr-un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
3 ≤ n ≤ 15&lt;br /&gt;
Coordonatele vârfurilor sunt numere întregi cuprinse între -50 și 50&lt;br /&gt;
Pentru 30% din punctaj, punctul de afișat este unul dintre vârfurile poligonului;&lt;br /&gt;
Pentru 60% din punctaj, punctul de afișat are coordonatele numere întregi;&lt;br /&gt;
Nu există trei puncte coliniare pe conturul poligonului dat;&lt;br /&gt;
Valorile de la ieșire se scriu cu exact trei zecimale, de exemplu, dacă ar trebui afișat 3 4.231867, se va scrie în fișier 3.000 4.231&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; hotar.in&lt;br /&gt;
 3&lt;br /&gt;
 0 0&lt;br /&gt;
 1 0&lt;br /&gt;
 0 1&lt;br /&gt;
; hotar.out&lt;br /&gt;
 0.500 0.500&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
        vertices = [tuple(map(float, file.readline().split())) for _ in range(n)]&lt;br /&gt;
    return n, vertices&lt;br /&gt;
&lt;br /&gt;
def calculate_area(vertices):&lt;br /&gt;
    area = 0&lt;br /&gt;
    n = len(vertices)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x1, y1 = vertices[i]&lt;br /&gt;
        x2, y2 = vertices[(i + 1) % n]&lt;br /&gt;
        area += x1 * y2 - x2 * y1&lt;br /&gt;
    return abs(area) / 2&lt;br /&gt;
&lt;br /&gt;
def find_equal_areas(n, vertices):&lt;br /&gt;
    total_area = calculate_area(vertices)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x1, y1 = vertices[i]&lt;br /&gt;
        x2, y2 = vertices[(i + 1) % n]&lt;br /&gt;
        x3, y3 = vertices[(i + 2) % n]&lt;br /&gt;
        area1 = abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2&lt;br /&gt;
        area2 = total_area - area1&lt;br /&gt;
        if abs(area1 - area2) &amp;lt; 1e-6:  # Verificăm egalitatea ariilor cu o toleranță mică&lt;br /&gt;
            return (x2 + x3) / 2, (y2 + y3) / 2  # Returnăm coordonatele celui de-al doilea vârf&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, result):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(&amp;quot;{:.3f} {:.3f}\n&amp;quot;.format(*result))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, vertices = read_input(&#039;hotar.in&#039;)&lt;br /&gt;
    result = find_equal_areas(n, vertices)&lt;br /&gt;
    write_output(&#039;hotar.out&#039;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AjM</name></author>
	</entry>
</feed>