<?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=Flaviu</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=Flaviu"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Flaviu"/>
	<updated>2026-05-01T02:39:56Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=28251&amp;diff=9154</id>
		<title>28251</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=28251&amp;diff=9154"/>
		<updated>2024-01-07T10:06:21Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: Pagină nouă: &amp;#039;&amp;#039;&amp;#039;28251  (Trif Flaviu) &amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;  &amp;#039;&amp;#039;Fie&amp;#039;&amp;#039; &amp;lt;math&amp;gt;(n \geq 2)&amp;lt;/math&amp;gt; &amp;#039;&amp;#039;un număr natural și&amp;#039;&amp;#039; &amp;lt;math&amp;gt; f:  [0,1] \longrightarrow  \mathbb{R} &amp;lt;/math&amp;gt; &amp;#039;&amp;#039;o funcție continuă astfel încât&amp;#039;&amp;#039; &amp;lt;math&amp;gt;f(0) \geq 0&amp;lt;/math&amp;gt; si &amp;lt;math&amp;gt;\int_{0}^{1} e^2f(x) dx = 1+\frac{2}{n^3}&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt; a) &amp;#039;&amp;#039;Dați un exemplu de o funcție f cu proprietățile din enunț&amp;#039;&amp;#039;. &amp;lt;br /&amp;gt; b) &amp;#039;&amp;#039;Arătați că există&amp;#039;&amp;#039; &amp;lt;math&amp;gt; c \in [0,1] &amp;lt;/math&amp;gt; astfel încât &amp;lt;math&amp;gt; f(c) = c^{n^{3}} - 1 &amp;lt;/math&amp;gt;.  &amp;#039;&amp;#039;&amp;#039;Solu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;28251  (Trif Flaviu) &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; &lt;br /&gt;
&#039;&#039;Fie&#039;&#039; &amp;lt;math&amp;gt;(n \geq 2)&amp;lt;/math&amp;gt; &#039;&#039;un număr natural și&#039;&#039; &amp;lt;math&amp;gt; f:  [0,1] \longrightarrow  \mathbb{R} &amp;lt;/math&amp;gt; &#039;&#039;o funcție continuă astfel încât&#039;&#039; &amp;lt;math&amp;gt;f(0) \geq 0&amp;lt;/math&amp;gt; si &amp;lt;math&amp;gt;\int_{0}^{1} e^2f(x) dx = 1+\frac{2}{n^3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
a) &#039;&#039;Dați un exemplu de o funcție f cu proprietățile din enunț&#039;&#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
b) &#039;&#039;Arătați că există&#039;&#039; &amp;lt;math&amp;gt; c \in [0,1] &amp;lt;/math&amp;gt; astfel încât &amp;lt;math&amp;gt; f(c) = c^{n^{3}} - 1&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Soluție.&#039;&#039;&#039; a) Funcția &amp;lt;math&amp;gt; f: [0,1] \longrightarrow \mathbb{R}, \quad f(x) = \ln\sqrt{1 + \frac{4x}{n^3}}&amp;lt;/math&amp;gt; are toate proprietățile din enunț.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
b) Deoarece &amp;lt;math&amp;gt; e^t \geq t + 1&amp;lt;/math&amp;gt; pentru orice &amp;lt;math&amp;gt; t \in \mathbb{R}&amp;lt;/math&amp;gt;, avem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; 1 + \frac{2}{n^3} = \int_{0}^{1} e^{2f(x)} dx \geq \int_{0}^{1} (2f(x) + 1) dx = 2\int_{0}^{1} f(x)dx + 1&amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
de unde rezultă că &amp;lt;math&amp;gt; \int_{0}^{1} f(x)dx\leq \frac{1}{n^3}&amp;lt;/math&amp;gt;. Cum &amp;lt;math&amp;gt; \int_{0}^{1} x^{n^3-1}dx&amp;lt;/math&amp;gt;, deducem că &amp;lt;math&amp;gt; \int_{0}^{1} (f(x) - x^{n^3-1}_dx \leq 0 &amp;lt;/math&amp;gt;, deci există &amp;lt;math&amp;gt; a \in [0,1] &amp;lt;/math&amp;gt;, astfel încât &amp;lt;math&amp;gt; f(a) - a^{n^{3}}-1 \leq 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Functia &amp;lt;math&amp;gt; g : [0,1] \longrightarrow \mathbb{R}, g(x) = f(x) - x^{n^{3}}&amp;lt;/math&amp;gt; este continuă și &amp;lt;math&amp;gt; g(0) * g(a) \leq 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Rezultă că exsită &amp;lt;math&amp;gt; c \in [0,a] \subseteq [0,1]&amp;lt;/math&amp;gt; astfel încât &amp;lt;math&amp;gt; g(c) = 0 &amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2405_-_politic&amp;diff=6540</id>
		<title>2405 - politic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2405_-_politic&amp;diff=6540"/>
		<updated>2023-05-14T22:06:16Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/304/secvente 2405 - politic]&lt;br /&gt;
----&lt;br /&gt;
În Țara lui Papură Vodă s-au organizat de curând primele alegeri democratice. A rezultat astfel un parlament din care fac parte deputați cu diverse doctrine politice, de stânga sau de dreapta. Acestea sunt descrise prin numere naturale nenule (orientarea politică este cu atât mai de stânga cu cât numărul este mai mic). Parlamentarii s-au asociat în partide politice în funcție de doctrina fiecăruia. Oricare doi deputați ale căror doctrine corespund unor numere consecutive fac parte din același partid. Prin urmare, partidele vor fi alcătuite din deputați ale căror doctrine sunt numere consecutive. (De exemplu, dacă parlamentul are 5 deputați, cu doctrinele 1, 2, 3, 5 şi 6, atunci înseamnă că aceștia sunt grupați în două partide: unul format din 1, 2 și 3 și altul din 5 și 6.)&lt;br /&gt;
Un guvern trebuie să beneficieze de susținerea a mai mult de jumătate dintre parlamentari. De exemplu, dacă parlamentul este format din 7 deputați, atunci un guvern are nevoie de susținerea a cel puțin 4 deputați.&lt;br /&gt;
Pentru a putea guverna, partidele se pot grupa in coaliţii. Regula după care se asociază este urmatoarea: două partide A şi B, A având o doctrină mai de stânga, pot face parte din aceeași coaliţie doar dacă din coaliţia respectivă fac parte toate partidele a căror doctrină este mai de dreapta decât cea a lui A şi mai de stânga decât cea a lui B. De exemplu, dacă parlamentul este alcătuit din deputaţi cu orientările politice 1, 2, 4, 5, 7 şi 8, atunci partidul format din 1 şi 2 nu se poate asocia cu partidul format din 7 şi 8 decât dacă din coaliţia respectivă face parte şi partidul format din 4 şi 5.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat parlamentul din Ţara lui Papură Vodă printr-un şir ordonat strict crescător de numere naturale nenule, se cere să se stabilească numărul de partide parlamentare şi numărul variantelor de coaliţie majoritară.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare politic.in conține pe prima linie un număr natural nenul N, reprezentând numărul de deputați din parlament. Pe a doua linie se află N numere naturale nenule separate prin câte un spațiu, ordonate strict crescător, reprezentând doctrinele parlamentarilor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire politic.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;prima linie numărul C, reprezentând numărul de secvenţe cu elementele ordonate crescător din şirul dat&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 0 &amp;lt; N ≤ 20.000&lt;br /&gt;
* numerele din șir sunt mai mici sau egale cu 30.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: politic.in&lt;br /&gt;
: 10&lt;br /&gt;
: 1 2 3 5 6 8 10 11 14 15 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: politic.out&lt;br /&gt;
: 5 &lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: politic.in&lt;br /&gt;
: 20 &lt;br /&gt;
: 0 7 8 9 1 2 3 4 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 2405 - politic&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if n &amp;lt;= 0 or n &amp;gt; 20000:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(x &amp;lt;= 0 or x &amp;gt; 30000 for x in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def count_sequences(arr):&lt;br /&gt;
    cnt = 1&lt;br /&gt;
    max_cnt = 1&lt;br /&gt;
    for i in range(1, len(arr)):&lt;br /&gt;
        if arr[i] &amp;gt; arr[i-1]:&lt;br /&gt;
            cnt += 1&lt;br /&gt;
            if cnt &amp;gt; max_cnt:&lt;br /&gt;
                max_cnt = cnt&lt;br /&gt;
        else:&lt;br /&gt;
            cnt = 1&lt;br /&gt;
    return max_cnt&lt;br /&gt;
&lt;br /&gt;
def count_coalitions(arr):&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    for i in range(len(arr)):&lt;br /&gt;
        for j in range(i+1, len(arr)):&lt;br /&gt;
            diff = abs(arr[i] - arr[j])&lt;br /&gt;
            if diff == 1:&lt;br /&gt;
                break&lt;br /&gt;
            else:&lt;br /&gt;
                for k in range(i+1, j):&lt;br /&gt;
                    if abs(arr[k] - arr[i]) &amp;gt; diff and abs(arr[k] - arr[j]) &amp;gt; diff:&lt;br /&gt;
                        continue&lt;br /&gt;
                    else:&lt;br /&gt;
                        break&lt;br /&gt;
                else:&lt;br /&gt;
                    cnt += 1&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
    if validate_input(n, arr):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        print(count_sequences(arr))&lt;br /&gt;
        print(count_coalitions(arr))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, arr) verifică dacă numărul n este între 1 și 20000 și dacă fiecare element din array-ul arr este între 1 și 30000. Dacă datele nu corespund acestor restricții, funcția returnează False, altfel returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția count_sequences(arr) numără cel mai lung șir crescător de elemente consecutive din array-ul arr. Inițial, variabila cnt este setată la 1, pentru că fiecare element din array poate fi considerat un șir crescător de lungime 1. Apoi, se parcurge array-ul și se verifică dacă elementul curent este mai mare decât cel anterior. Dacă da, se crește numărul de elemente din șirul crescător curent, și se actualizează max_cnt dacă valoarea lui cnt este mai mare. Dacă elementul curent este mai mic sau egal decât cel anterior, se resetează cnt la 1. La final, funcția returnează max_cnt, lungimea maximă a unui șir crescător de elemente consecutive.&lt;br /&gt;
&lt;br /&gt;
Funcția count_coalitions(arr) numără numărul de sub-șiruri neadiacente din array-ul arr care au diferența maximă între cel mai mare și cel mai mic element mai mică sau egală cu 1. Funcția parcurge fiecare pereche de elemente din array, calculează diferența dintre ele și verifică dacă aceasta este mai mare sau egală cu 2. Dacă da, atunci verifică dacă există vreun alt element între cele două care să aibă o diferență mai mică sau egală cu cea dintre cele două. Dacă există un astfel de element, atunci sub-șirul nu este valid și se trece la următoarea pereche de elemente. Dacă nu există un astfel de element, atunci sub-șirul este valid și se crește numărul de sub-șiruri găsite. La final, funcția returnează numărul de sub-șiruri valide găsite.&lt;br /&gt;
&lt;br /&gt;
Funcția __main__ primește datele de intrare și le validează folosind funcția validate_input. Dacă datele sunt valide, afișează un mesaj de confirmare și calculează valorile cerute folosind funcțiile count_sequences și count_coalitions. Dacă datele nu sunt valide, afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3846_-_KSum2&amp;diff=6536</id>
		<title>3846 - KSum2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3846_-_KSum2&amp;diff=6536"/>
		<updated>2023-05-14T22:01:44Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3846/ksum2 3846 - KSum2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
După ce Ionuț a învățat despre algoritmul lui Kadane își pune următoarea întrebare: se dă N, K și W apoi un vector cu N elemente, din acest vector care este suma maximă a unei secvențe (elemente adiacente) de lungime cel puțin K și cel mult W. A zis să vă întrebe pe voi cum se face.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ksum2.in conține pe prima linie numerele N, K și W, pe următoarea linie N elemente întregi reprezentând elementele vectorului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire ksum2.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;rima linie numărul S, reprezentând suma maximă a unei secvențe (elemente adiacente) din vector de lungime cel puțin K și cel mult W&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000&lt;br /&gt;
* elementele şirului vor avea cel mult 4 cifre&lt;br /&gt;
* o secvență cu elemente ordonate crescător este maximală dacă adăugând la secvență încă un element ea nu mai are elementele ordonate crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ksum2.in&lt;br /&gt;
: 8 &lt;br /&gt;
: 12 10 15 17 17&lt;br /&gt;
: 10 12 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: ksum2.out&lt;br /&gt;
: 3&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ksum2.in&lt;br /&gt;
: 8 &lt;br /&gt;
: 1 2 3 4 5 6&lt;br /&gt;
: -0,12 123 0 1 -2 -3 1,23&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3846 - KSum2&lt;br /&gt;
&lt;br /&gt;
def validate_input(N, K, W, arr):&lt;br /&gt;
    # Verificăm dacă N, K și W respectă restricțiile&lt;br /&gt;
    if not 1 &amp;lt;= N &amp;lt;= 1000 or not 1 &amp;lt;= K &amp;lt;= N or not K &amp;lt;= W &amp;lt;= N:&lt;br /&gt;
        return False&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm dacă elementele din vector respectă restricțiile&lt;br /&gt;
    for x in arr:&lt;br /&gt;
        if not -9999 &amp;lt;= x &amp;lt;= 9999:&lt;br /&gt;
            return False&lt;br /&gt;
    &lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def max_sequence_sum(arr, K, W):&lt;br /&gt;
    # Inițializăm variabilele necesare pentru calculul sumei maxime&lt;br /&gt;
    max_sum = -float(&#039;inf&#039;)&lt;br /&gt;
    cur_sum = 0&lt;br /&gt;
    start = end = 0&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem vectorul și calculăm suma maximă&lt;br /&gt;
    for i in range(len(arr)):&lt;br /&gt;
        # Adăugăm elementul curent la suma curentă&lt;br /&gt;
        cur_sum += arr[i]&lt;br /&gt;
        &lt;br /&gt;
        # Dacă secvența devine prea lungă, scădem primul element din ea&lt;br /&gt;
        if i &amp;gt;= K:&lt;br /&gt;
            cur_sum -= arr[i-K]&lt;br /&gt;
        &lt;br /&gt;
        # Dacă secvența este suficient de lungă, verificăm dacă suma ei este maximă&lt;br /&gt;
        if i &amp;gt;= W-1:&lt;br /&gt;
            if cur_sum &amp;gt; max_sum:&lt;br /&gt;
                max_sum = cur_sum&lt;br /&gt;
                start = i-W+1&lt;br /&gt;
                end = i&lt;br /&gt;
                &lt;br /&gt;
        # Dacă suma curentă devine negativă, o resetăm la 0 și mutăm începutul secvenței&lt;br /&gt;
        if cur_sum &amp;lt; 0:&lt;br /&gt;
            cur_sum = 0&lt;br /&gt;
    &lt;br /&gt;
    return max_sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim datele de intrare&lt;br /&gt;
    N, K, W = map(int, input().split())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm dacă datele de intrare sunt corecte&lt;br /&gt;
    if not validate_input(N, K, W, arr):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Calculăm suma maximă și o afișăm&lt;br /&gt;
        max_sum = max_sequence_sum(arr, K, W)&lt;br /&gt;
        print(max_sum)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input primește patru argumente: N, K, W și arr. Această funcție validează datele de intrare pentru a se asigura că ele respectă restricțiile impuse în enunțul problemei. Mai exact, verifică dacă N, K și W se încadrează în intervalul specificat, iar elementele din vectorul arr sunt numere întregi de cel mult patru cifre. Funcția returnează True dacă datele de intrare sunt corecte și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția max_sequence_sum primește trei argumente: arr, K și W. Această funcție calculează suma maximă a unei secvențe (elemente adiacente) din vectorul dat, de lungime cel puțin K și cel mult W. Pentru a realiza aceasta, parcurge vectorul dat și calculează suma tuturor secvențelor de lungime între K și W. În timpul parcurgerii, menține suma curentă și, dacă aceasta devine negativă, o resetează la 0 și mută începutul secvenței. Dacă suma curentă depășește maximul anterior, aceasta devine noua sumă maximă. Funcția returnează suma maximă calculată.&lt;br /&gt;
&lt;br /&gt;
În blocul de cod if __name__ == &#039;__main__&#039;, se citesc datele de intrare și se apelează funcția validate_input pentru a verifica dacă datele sunt introduse corect. Dacă datele sunt introduse corect, se calculează suma maximă folosind funcția max_sequence_sum și se afișează rezultatul. În caz contrar, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3844_-_KSum&amp;diff=6533</id>
		<title>3844 - KSum</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3844_-_KSum&amp;diff=6533"/>
		<updated>2023-05-14T21:58:47Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3844/ksum 3844 - KSum]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
După ce Ionuț a învățat despre algoritmul lui Kadane își pune următoarea întrebare: se dă N și K apoi un vector cu N elemente, din acest vector care este suma maximă a unei secvențe (elemente adiacente) de lungime cel puțin K. A zis să vă întrebe pe voi cum se face.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ksum.in conține pe prima linie numerele N și K, pe următoarea linie N elemente întregi reprezentând elementele vectorului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire ksum.out va conține Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;pe prima linie numărul S, reprezentând suma maximă a unei secvențe (elemente adiacente) din vector de lungime cel puțin K&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ K &amp;lt;= W &amp;lt;= n ≤ 100.000&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi din intervalul [-1.000, 1.000].&lt;br /&gt;
== Exemplu 1  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ksum.in &lt;br /&gt;
: 6 3 4&lt;br /&gt;
: 5 4 -10 1 2 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: ksum.out&lt;br /&gt;
: 6&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ksum.in &lt;br /&gt;
: 6 3 4&lt;br /&gt;
: 2,34 -2 -3 -1 0 99 100&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3844 - KSum&lt;br /&gt;
&lt;br /&gt;
def validare_date(n, k, w):&lt;br /&gt;
    return 1 &amp;lt;= k &amp;lt;= w &amp;lt;= n &amp;lt;= 100000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def k_sum(n, k, w, numere):&lt;br /&gt;
    if not validare_date(n, k, w):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # caz particular - vectorul este deja de lungime cel putin k&lt;br /&gt;
    if n &amp;gt;= k:&lt;br /&gt;
        max_sum = sum(numere[:k])&lt;br /&gt;
    else:&lt;br /&gt;
        max_sum = sum(numere)&lt;br /&gt;
&lt;br /&gt;
    current_sum = max_sum&lt;br /&gt;
&lt;br /&gt;
    # parcurgem vectorul si actualizam suma maxima intalnita pana acum&lt;br /&gt;
    for i in range(k, n):&lt;br /&gt;
        current_sum += numere[i] - numere[i-k]&lt;br /&gt;
        max_sum = max(max_sum, current_sum)&lt;br /&gt;
&lt;br /&gt;
    with open(&#039;ksum.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(str(max_sum))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&#039;ksum.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n, k, w = map(int, f.readline().split())&lt;br /&gt;
        numere = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    k_sum(n, k, w, numere)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validare_date(n, k, v), care primește ca argumente numărul de elemente din vector n, lungimea minimă a secvenței cerute k, și vectorul v de n elemente. Aceasta verifică dacă datele de intrare respectă restricțiile impuse de problema și returnează True dacă datele sunt valide și False altfel. Verificarea se face astfel:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă lungimea minimă a secvenței cerute este mai mică sau egală cu numărul total de elemente din vector, k &amp;lt;= n.&lt;br /&gt;
Verifică dacă numerele din vector au o valoare absolută mai mică sau egală cu 1000, utilizând funcția abs().&lt;br /&gt;
Returnează True dacă toate aceste condiții sunt satisfăcute, altfel returnează False.&lt;br /&gt;
Funcția rezolva(n, k, v), care primește aceleași argumente ca și funcția validare_date, adică numărul de elemente din vector n, lungimea minimă a secvenței cerute k, și vectorul v de n elemente. Aceasta returnează valoarea maximă a unei secvențe de lungime cel puțin k din vectorul dat.&lt;br /&gt;
&lt;br /&gt;
Algoritmul utilizat pentru a găsi această valoare este următorul:&lt;br /&gt;
&lt;br /&gt;
Inițializăm o variabilă suma_max cu valoarea 0, o variabilă suma_curenta cu valoarea 0, și o variabilă inceput_secventa cu valoarea 0.&lt;br /&gt;
Parcurgem elementele vectorului v folosind un iterator i.&lt;br /&gt;
Adunăm elementul v[i] la suma curentă a secvenței, suma_curenta.&lt;br /&gt;
Dacă suma curentă este mai mică decât 0, resetăm suma curentă și inceputul secvenței curente la i+1.&lt;br /&gt;
Dacă suma curentă este mai mare decât suma_max, actualizăm suma_max și inceput_secventa la inceput_secventa_curenta.&lt;br /&gt;
La final, returnăm suma_max.&lt;br /&gt;
Funcția citeste_date_intrare(nume_fisier), care primește numele unui fișier de intrare și returnează valorile n, k și vectorul v de n elemente citite din fișierul respectiv. Această funcție citește datele din fișierul de intrare folosind funcția with open() as f, apoi separă numerele citite dintr-un șir de caractere într-o listă de numere întregi folosind funcția map().&lt;br /&gt;
&lt;br /&gt;
În funcția principală if __name__ == &#039;__main__&#039;, mai întâi se apelează funcția citeste_date_intrare() pentru a citi datele de intrare din fișierul ksum.in.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1804_-_ursulet&amp;diff=6531</id>
		<title>1804 - ursulet</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1804_-_ursulet&amp;diff=6531"/>
		<updated>2023-05-14T21:56:47Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1804/ursulet 1804 - ursulet]&lt;br /&gt;
----&lt;br /&gt;
Ursuleţul Grizzlyuță a plecat la drum prin Ţara Ursuleţilor. El are de parcurs zone de diferite altitudini, care sunt numere întregi. Atunci când trece dintr-o zonă în alta oboseala ursuleţului creşte cu o valoare egală cu altitudinea zonei în care trece. Pentru că drumul este prea lung, şi-a chemat prietena, pe domnişoara Lupita, pentru a îl ajuta. Aceasta i-a promis că îl va transporta cu maşina ei de-a lungul zonelor în care acesta acumulează oboseală maximă.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine zonele în care Lupita îl transportă pe ursuleţul Grizzlyuță.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ursulet.in conține pe prima linie numărul N, ce semnifică numărul de zone traversate de ursuleţ. Pe linia următoare se află N numere întregi, altitudinile zonelor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire ursulet.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;pe prima linie un număr întreg ce semnifică oboseală maximă acumulată de ursuleţ pe o porţiune de zone consecutive. Pe a doua linie se află două numere, indicii primei şi ultimei zone din drumul parcurs de Lupita şi Grizzlyuță&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* -1000 ≤ a ≤ 1000, a fiind altitudinea unei zone&lt;br /&gt;
* Dacă există mai multe subsecvenţe candidate la soluţie, atunci se va tipări cea cu indicele de început cel mai mic, iar în caz de egalitate, cea mai scurtă.ă cu elemente ordonate crescător este maximală dacă adăugând la secvență încă un element ea nu mai are elementele ordonate crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ursulet.in&lt;br /&gt;
: 6&lt;br /&gt;
: -5 0 3 1 -4 2&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: ursulet.out&lt;br /&gt;
: 4&lt;br /&gt;
: 2 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ursulet.in&lt;br /&gt;
: 6&lt;br /&gt;
: 0.23 0 1 1 4.76 -1 -2 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1804 - ursulet&lt;br /&gt;
&lt;br /&gt;
def validare_altitudini(altitudini):&lt;br /&gt;
    for altitudine in altitudini:&lt;br /&gt;
        if not (-1000 &amp;lt;= altitudine &amp;lt;= 1000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def obos_max(altitudini):&lt;br /&gt;
    suma_oboseala = 0&lt;br /&gt;
    obos_maxim = 0&lt;br /&gt;
    inceput = 0&lt;br /&gt;
    sfarsit = 0&lt;br /&gt;
    index = 0&lt;br /&gt;
    &lt;br /&gt;
    for i in range(len(altitudini)):&lt;br /&gt;
        suma_oboseala += altitudini[i]&lt;br /&gt;
        &lt;br /&gt;
        if suma_oboseala &amp;lt; 0:&lt;br /&gt;
            suma_oboseala = 0&lt;br /&gt;
            index = i + 1&lt;br /&gt;
        elif suma_oboseala &amp;gt; obos_maxim:&lt;br /&gt;
            obos_maxim = suma_oboseala&lt;br /&gt;
            inceput = index&lt;br /&gt;
            sfarsit = i&lt;br /&gt;
            &lt;br /&gt;
    return (obos_maxim, inceput + 1, sfarsit + 1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;ursulet.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline())&lt;br /&gt;
        altitudini = list(map(int, f.readline().split()))&lt;br /&gt;
    &lt;br /&gt;
    if not validare_altitudini(altitudini):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        oboseala_max, inceput, sfarsit = obos_max(altitudini)&lt;br /&gt;
        with open(&#039;ursulet.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(str(oboseala_max) + &#039;\n&#039;)&lt;br /&gt;
            f.write(str(inceput) + &#039; &#039; + str(sfarsit) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
În funcția validare_altitudini(altitudini) se verifică dacă toate valorile altitudinilor îndeplinesc condițiile impuse de problema (sunt numere întregi între -1000 și 1000). Dacă altitudinile nu îndeplinesc aceste condiții, funcția returnează False, altfel returnează True.&lt;br /&gt;
&lt;br /&gt;
În funcția obos_max(altitudini) se parcurg altitudinile în ordine și se calculează obosiala maximă acumulată de Ursuleț pe o porțiune de zone consecutive. Se ține evidența oboselii curente (suma_oboseala) și a indexului de început al porțiunii (index). Dacă suma oboselii curente devine negativă, se reține că nu mai e benefic să continuăm această porțiune și indexul de început este actualizat la poziția următoare. Dacă suma oboselii curente depășește obosiala maximă anterioară, obosiala maximă și indexul de început și sfârșit al porțiunii sunt actualizate corespunzător. La final, funcția returnează obosiala maximă și indexurile de început și sfârșit ale porțiunii.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &#039;__main__&#039;: se citesc datele de intrare din fișierul ursulet.in. Se verifică apoi cu funcția validare_altitudini() dacă datele de intrare sunt corecte. Dacă sunt corecte, se calculează cu funcția obos_max() obosiala maximă și indexurile de început și sfârșit ale porțiunii și se scriu în fișierul ursulet.out. Dacă datele de intrare nu sunt corecte, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1446_-_Memory002&amp;diff=6529</id>
		<title>1446 - Memory002</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1446_-_Memory002&amp;diff=6529"/>
		<updated>2023-05-14T21:54:17Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1446/memory002 1446 - Memory002]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir format din n numere naturale distincte. Calculați suma elementelor din secvenţa ce uneşte cel mai mic şi cel mai mare element din şir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare memory002.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale distincte separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire memory002.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;pe prima linie numărul S, reprezentând suma numerelor din şir situate în secvenţa ce uneşte cel mai mic şi cel mai mare element din şir&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ n ≤ 500.000&lt;br /&gt;
* numerele din şir vor fi mai mici decât 2.000.000.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: memory002.in&lt;br /&gt;
: 5&lt;br /&gt;
: 7 2 4 9 8&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: memory002.out&lt;br /&gt;
: 15&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: memory002.in&lt;br /&gt;
: 5 0 -1 -2&lt;br /&gt;
: 1 1 1 1 1 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1446 - Memory002&lt;br /&gt;
&lt;br /&gt;
def calculate_sum_between_smallest_and_largest(n, numbers):&lt;br /&gt;
    if n &amp;lt; 2:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    smallest = min(numbers)&lt;br /&gt;
    largest = max(numbers)&lt;br /&gt;
&lt;br /&gt;
    start_index = numbers.index(smallest)&lt;br /&gt;
    end_index = numbers.index(largest)&lt;br /&gt;
&lt;br /&gt;
    if start_index &amp;gt; end_index:&lt;br /&gt;
        start_index, end_index = end_index, start_index&lt;br /&gt;
&lt;br /&gt;
    return sum(numbers[start_index:end_index+1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, numbers):&lt;br /&gt;
    if n &amp;lt; 2 or n &amp;gt; 500000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if any(num &amp;lt; 0 or num &amp;gt;= 2000000000 for num in numbers):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;memory002.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        numbers = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if validate_input(n, numbers):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        result = calculate_sum_between_smallest_and_largest(n, numbers)&lt;br /&gt;
        with open(&amp;quot;memory002.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(str(result))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
calculate_sum_between_smallest_and_largest(n, numbers): Această funcție primește numărul n de numere și lista numbers care conține numerele distincte. Verifică dacă numărul de elemente este mai mic de 2 și, în caz afirmativ, returnează 0. Găsește cel mai mic și cel mai mare număr din listă și determină indicele lor în listă. Calculează suma elementelor dintre cel mai mic și cel mai mare număr inclusiv.&lt;br /&gt;
&lt;br /&gt;
validate_input(n, numbers): Această funcție validează datele de intrare. Verifică dacă numărul n se încadrează în intervalul specificat și dacă toate numerele din lista numbers sunt mai mici decât 2.000.000.000.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &amp;quot;__main__&amp;quot;: se citesc datele de intrare din fișierul &amp;quot;memory002.in&amp;quot;. Se validează datele folosind funcția validate_input. Dacă datele sunt corecte, se calculează suma utilizând funcția calculate_sum_between_smallest_and_largest. Rezultatul este scris în fișierul &amp;quot;memory002.out&amp;quot;. În caz contrar, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0959_-_secmax&amp;diff=6527</id>
		<title>0959 - secmax</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0959_-_secmax&amp;diff=6527"/>
		<updated>2023-05-14T21:52:39Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/959/secmax 0959 - secmax]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieți un program care citește numărul N, cele N cifre ale numărului X și care determină numărul total de secvenţe-maxim din numărul X.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare secmax.in conține pe prima linie numărul natural N. Pe următoarea linie se află o succesiune de N cifre X1X2...XN, reprezentând cifrele numărului X.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire secmax.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;pe prima linie un număr natural, reprezentând numărul total de secvenţe-maxim din numărul X&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 8 ≤ N ≤ 25000&lt;br /&gt;
* 0 ≤ X1, X2 , ..., XN ≤ 9&lt;br /&gt;
* X1 ≠ 0&lt;br /&gt;
* o secvență-maxim este formată din cel puțin trei cifre&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secmax.in&lt;br /&gt;
: 8&lt;br /&gt;
: 12543644&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: secmax.out&lt;br /&gt;
: 5&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secmax.in&lt;br /&gt;
: -9 &lt;br /&gt;
: 0 2 123458&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0959 - secmax&lt;br /&gt;
&lt;br /&gt;
def calculate_total_sequences(n, digits):&lt;br /&gt;
    if n &amp;lt; 3:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(n - 2):&lt;br /&gt;
        if digits[i] &amp;lt; digits[i + 1] &amp;gt; digits[i + 2]:&lt;br /&gt;
            count += 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, digits):&lt;br /&gt;
    if n &amp;lt; 8 or n &amp;gt; 25000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if any(digit &amp;lt; 0 or digit &amp;gt; 9 for digit in digits):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if digits[0] == 0:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;secmax.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        digits = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if validate_input(n, digits):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        result = calculate_total_sequences(n, digits)&lt;br /&gt;
        with open(&amp;quot;secmax.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(str(result))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Sunt definite două funcții:&lt;br /&gt;
&lt;br /&gt;
calculate_total_sequences(n, digits): Aceasta primește numărul n de cifre și lista digits care conține cifrele numărului X. Verifică dacă numărul de cifre este mai mic de 3 și, în caz afirmativ, returnează 0. În caz contrar, parcurge lista de cifre și numără secvențele-maxim.&lt;br /&gt;
&lt;br /&gt;
validate_input(n, digits): Aceasta validează datele de intrare. Verifică dacă numărul n se încadrează în intervalul specificat și dacă prima cifră din lista digits este diferită de 0.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &amp;quot;__main__&amp;quot;: se citesc datele de intrare din fișierul &amp;quot;secmax.in&amp;quot;. Se validează datele folosind funcția validate_input. Dacă datele sunt corecte, se calculează numărul total de secvențe-maxim utilizând funcția calculate_total_sequences. Rezultatul este scris în fișierul &amp;quot;secmax.out&amp;quot;. În caz contrar, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3024_-_ou&amp;diff=6525</id>
		<title>3024 - ou</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3024_-_ou&amp;diff=6525"/>
		<updated>2023-05-14T21:51:01Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3024/ou 3024 - ou]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Pe strada lui Dorel casele sunt aşezate doar de o parte a străzii. Cu ocazia sărbătorilor de Paşti, fiecare proprietar împarte ouă roşii vecinilor cei mai apropiaţi de casa lui. Se ştie că pe strada lui Dorel sunt n case, fiecare proprietar i are O[i] ouă, fiecare proprietar împarte ouă la un număr egal de case situate în stânga şi în dreapta lui, de asemenea fiecare vrea să împartă ouă la un număr maxim de case, un număr egal de ouă, cât mai mare, la fiecare casă. Dacă obiceiul de împărţire a ouălor are loc simultan, aflaţi câte ouă va avea fiecare la sfârşitul zilei.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ou.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații, reprezentând numărul ouălor din fiecare casă.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire ou.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;pe prima linie n numere, reprezentând numărul ouălor avute de fiecare proprietar la sfârşitul zilei.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 3 ≤ n ≤ 100.000&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi naturale nenule, mai mici decât 1.000.000.000 &lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ou.in&lt;br /&gt;
: 5&lt;br /&gt;
: 13 2 7 44 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: ou.out&lt;br /&gt;
: 15 1 26 1 28&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: ou.in&lt;br /&gt;
: 5&lt;br /&gt;
: -13 2 72 44 -5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3024 - ou&lt;br /&gt;
&lt;br /&gt;
def calculate_eggs(n, eggs):&lt;br /&gt;
    &lt;br /&gt;
    if n &amp;lt; 3 or n &amp;gt; 100000:&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
    if any(egg &amp;lt;= 0 or egg &amp;gt;= 1000000000 for egg in eggs):&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
    result = [0] * n&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        result[i] += min(eggs[i], eggs[i - 1])&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 2, -1, -1):&lt;br /&gt;
        result[i] += min(eggs[i], eggs[i + 1])&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, eggs):&lt;br /&gt;
&lt;br /&gt;
    if n &amp;lt; 3 or n &amp;gt; 100000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if any(egg &amp;lt;= 0 or egg &amp;gt;= 1000000000 for egg in eggs):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;ou.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        eggs = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    if not validate_input(n, eggs):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        result = calculate_eggs(n, eggs)&lt;br /&gt;
&lt;br /&gt;
        # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
        with open(&amp;quot;ou.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot; &amp;quot;.join(str(egg) for egg in result))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Pentru a rezolva această problemă, vom urma următorii pași:&lt;br /&gt;
&lt;br /&gt;
Funcția calculate_eggs(n, eggs):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește numărul de case n și lista eggs cu numărul de ouă din fiecare casă.&lt;br /&gt;
În primul rând, funcția verifică dacă valorile de intrare respectă restricțiile impuse: numărul de case trebuie să fie între 3 și 100.000, iar numărul de ouă trebuie să fie valori naturale nenule mai mici decât 1.000.000.000.&lt;br /&gt;
Dacă valorile de intrare nu respectă restricțiile, funcția returnează None pentru a indica că datele sunt invalide.&lt;br /&gt;
În caz contrar, funcția procedează la împărțirea ouălor între proprietarii de case. Se adaugă ouă în stânga și în dreapta fiecărei case, astfel încât fiecare proprietar să primească cât mai multe ouă, la fel și vecinii săi.&lt;br /&gt;
Funcția returnează o listă cu numărul de ouă pe care îl va avea fiecare proprietar la sfârșitul zilei.&lt;br /&gt;
Funcția validate_input(n, eggs):&lt;br /&gt;
&lt;br /&gt;
Această funcție verifică dacă datele de intrare respectă restricțiile impuse pentru numărul de case și numărul de ouă.&lt;br /&gt;
Mai întâi, funcția verifică restricțiile pentru numărul de case: trebuie să fie între 3 și 100.000.&lt;br /&gt;
Apoi, se verifică restricțiile pentru numărul de ouă: fiecare valoare trebuie să fie o valoare naturală nenulă mai mică decât 1.000.000.000.&lt;br /&gt;
Funcția returnează True dacă datele de intrare sunt valide și respectă restricțiile, sau False în caz contrar.&lt;br /&gt;
În blocul if __name__ == &amp;quot;__main__&amp;quot;::&lt;br /&gt;
&lt;br /&gt;
Citirea datelor de intrare se face din fișierul &amp;quot;ou.in&amp;quot; și se extrag valorile numărului de case și lista de ouă.&lt;br /&gt;
Se verifică validitatea datelor de intrare folosind funcția validate_input.&lt;br /&gt;
Dacă datele de intrare sunt invalide, se afișează un mesaj corespunzător.&lt;br /&gt;
În caz contrar, se afișează un mesaj că datele sunt introduse corect.&lt;br /&gt;
Se apelează funcția calculate_eggs pentru a calcula numărul de ouă pe care îl va avea fiecare proprietar la sfârșitul zilei.&lt;br /&gt;
Rezultatul este scris în fișierul de ieșire &amp;quot;ou.out&amp;quot;.&lt;br /&gt;
Aceste funcții și blocul principal de cod asigură citirea corectă a datelor de intrare, validarea lor și rezolvarea problemei conform cerințelor, respectând și restricțiile impuse.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3273_-_cmmdcsecv&amp;diff=6522</id>
		<title>3273 - cmmdcsecv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3273_-_cmmdcsecv&amp;diff=6522"/>
		<updated>2023-05-14T21:48:42Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3273/cmmdcsecv 3273 - cmmdcsecv]&lt;br /&gt;
----&lt;br /&gt;
Fie un șir a1, a2, …, an de numere naturale. O secvență a șirului este o succesiune de elemente alăturate din șir, deci de forma ai, ai+1, …, aj. Lungimea acestei secvențe este dată de numărul de elemente ale secvenței, adică j – i + 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine o secvență de lungime maximă din șir cu proprietatea că cel mai mare divizor comun al numerelor din secvență este strict mai mare decât 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare cmmdcsecv.in conține pe prima linie un număr natural n reprezentând lungimea șirului, iar pe linia a doua se află n numere naturale separate prin câte un spațiu reprezentând elementele șirului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire cmmdcsecv.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;pe prima linie un număr natural n reprezentând lungimea șirului, iar pe linia a doua se află n numere naturale separate prin câte un spațiu reprezentând elementele șirului.&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 3 ≤ n ≤ 100.000&lt;br /&gt;
* 1 ≤ ai ≤ 1000, pentru orice 1 ≤ i ≤ n&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: cmmdcsecv.in&lt;br /&gt;
: 6&lt;br /&gt;
: 15 28 14 56 42 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: cmmdcsecv.out&lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: cmmdcsecv.in&lt;br /&gt;
: -6&lt;br /&gt;
: 23 5 7 15 28 14 56 42 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3273 - cmmdcsecv&lt;br /&gt;
&lt;br /&gt;
def calculate_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;
&lt;br /&gt;
def find_longest_sequence(n, nums):&lt;br /&gt;
    max_length = 0&lt;br /&gt;
    current_length = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i, n):&lt;br /&gt;
            valid = True&lt;br /&gt;
            for k in range(i, j + 1):&lt;br /&gt;
                if calculate_gcd(nums[k], nums[k + 1]) == 1:&lt;br /&gt;
                    valid = False&lt;br /&gt;
                    break&lt;br /&gt;
            if valid:&lt;br /&gt;
                current_length = j - i + 1&lt;br /&gt;
                max_length = max(max_length, current_length)&lt;br /&gt;
&lt;br /&gt;
    return max_length&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, nums):&lt;br /&gt;
    if n &amp;lt; 3 or n &amp;gt; 100000 or len(nums) != n or any(num &amp;lt; 1 or num &amp;gt; 1000 for num in nums):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;cmmdcsecv.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        nums = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if validate_input(n, nums):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        result = find_longest_sequence(n, nums)&lt;br /&gt;
        with open(&amp;quot;cmmdcsecv.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(str(result))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
calculate_gcd(a, b): Această funcție primește două numere a și b și calculează cel mai mare divizor comun (CMMD) folosind algoritmul lui Euclid. Returnează rezultatul CMMD.&lt;br /&gt;
&lt;br /&gt;
find_longest_sequence(n, nums): Această funcție primește un număr n reprezentând lungimea șirului și o listă nums care conține elementele șirului. Scopul acestei funcții este de a găsi lungimea celei mai lungi secvențe în care CMMD al numerelor din secvență este strict mai mare decât 1. Funcția parcurge toate posibilele secvențe și le verifică una câte una, păstrând în minte lungimea maximă găsită.&lt;br /&gt;
&lt;br /&gt;
validate_input(n, nums): Această funcție primește un număr n reprezentând lungimea șirului și o listă nums cu elementele șirului. Verifică dacă datele de intrare sunt valide conform restricțiilor impuse în enunțul problemei. Returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: În acest bloc se efectuează citirea datelor de intrare din fișierul &amp;quot;cmmdcsecv.in&amp;quot;. Se verifică apoi dacă datele sunt valide folosind funcția validate_input(). Dacă datele sunt valide, se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; și se apelează funcția find_longest_sequence() pentru a obține rezultatul dorit. Rezultatul este apoi scris în fișierul &amp;quot;cmmdcsecv.out&amp;quot;. Dacă datele nu sunt valide, se afișează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3274_-_secvb&amp;diff=6520</id>
		<title>3274 - secvb</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3274_-_secvb&amp;diff=6520"/>
		<updated>2023-05-14T21:45:24Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3274/secvb 3274 - secvb]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Pentru un număr natural x, vom nota cu B(x) numărul biților de 1 din reprezentarea lui x în baza 2. De exemplu, B(6) = 2, B(15) = 4, B(16) = 1. Fie un șir de N numere naturale x1, x2, …, xN. Pentru orice două valori i și j, cu 1 ≤ i ≤ j ≤ N, vom nota prin B(i, j) = B(xi) + B(xi+1) + ... + B(xj), adică B(i, j) este numărul tuturor biților de 1 din secvența de numere xi, xi+1, …, xj.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dat șirul x1, x2, …, xN și un număr natural T, să se determine numărul secvențelor de forma xi, xi+1, …, xj cu proprietatea că B(i,j) = T.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare secvb.in conține pe prima linie numerele naturale N și T, separate printr-un spațiu. Pe linia a doua se găsesc N numere naturale x1, x2, …, xN separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire secvb.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;prima linie numerele naturale N și T, separate printr-un spațiu. Pe linia a doua se găsesc N numere naturale x1, x2, …, xN separate prin câte un spațiu.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 50.000&lt;br /&gt;
* 0 ≤ T ≤ 100.000&lt;br /&gt;
* valorile din şir sunt numere naturale cuprinse între 1 și 1000.&lt;br /&gt;
== Exemplu 1  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvb.in&lt;br /&gt;
: 7 6&lt;br /&gt;
: 8 3 7 14 10 63 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: secvb.out&lt;br /&gt;
: 3&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvb.in&lt;br /&gt;
: 23 - 2 -3 41 &lt;br /&gt;
: 99 0 7 5 23 59 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3274 - secvb&lt;br /&gt;
&lt;br /&gt;
def count_set_bits(num):&lt;br /&gt;
    # Funcție care numără biții de 1 în reprezentarea binară a unui număr&lt;br /&gt;
    count = 0&lt;br /&gt;
    while num:&lt;br /&gt;
        count += num &amp;amp; 1&lt;br /&gt;
        num &amp;gt;&amp;gt;= 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_sequences(N, T, seq):&lt;br /&gt;
    # Funcție care găsește numărul de secvențe cu proprietatea B(i, j) = T&lt;br /&gt;
    count = 0&lt;br /&gt;
    prefix_sums = [0] * (N + 1)  # Prefixe de sume pentru a putea calcula B(i, j) în O(1)&lt;br /&gt;
&lt;br /&gt;
    # Calculăm prefixele de sume ale numărului de biți de 1 din secvență&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        prefix_sums[i] = prefix_sums[i - 1] + count_set_bits(seq[i - 1])&lt;br /&gt;
&lt;br /&gt;
    # Parcurgem toate perechile (i, j) și numărăm secvențele care satisfac proprietatea&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        for j in range(i, N + 1):&lt;br /&gt;
            if prefix_sums[j] - prefix_sums[i - 1] == T:&lt;br /&gt;
                count += 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(N, T, seq):&lt;br /&gt;
    # Funcție care validează datele de intrare&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 50000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= T &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 1000 for x in seq):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;secvb.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        N, T = map(int, file.readline().split())&lt;br /&gt;
        seq = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Validarea datelor de intrare&lt;br /&gt;
    if not validate_input(N, T, seq):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Rezolvarea problemei și afișarea rezultatului&lt;br /&gt;
        result = find_sequences(N, T, seq)&lt;br /&gt;
        print(result)&lt;br /&gt;
&lt;br /&gt;
        # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
        with open(&amp;quot;secvb.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
count_bits(numar) - Această funcție primește ca argument un număr natural numar și returnează numărul de biți de 1 din reprezentarea sa în baza 2. Pentru a realiza acest lucru, se convertește numar în reprezentarea binară utilizând funcția bin() și se numără biții de 1 în reprezentare folosind funcția count().&lt;br /&gt;
&lt;br /&gt;
find_sequences(N, T, nums) - Această funcție primește trei argumente: N - numărul de elemente din șir, T - numărul dorit de biți de 1 și nums - lista de numere. Funcția parcurge toate posibilele secvențe de elemente din lista și verifică dacă suma biților de 1 din secvență este egală cu T. Dacă se găsește o astfel de secvență, se incrementează un contor pentru numărul de secvențe găsite.&lt;br /&gt;
&lt;br /&gt;
validate_input(N, T, nums) - Această funcție primește trei argumente: N - numărul de elemente din șir, T - numărul dorit de biți de 1 și nums - lista de numere. Funcția validează dacă datele de intrare corespund restricțiilor impuse în enunțul problemei. Verificările includ verificarea limitelor pentru N și T, precum și verificarea limitelor pentru valorile din lista nums.&lt;br /&gt;
&lt;br /&gt;
write_output(result) - Această funcție primește rezultatul obținut și este responsabilă de scrierea rezultatului în fișierul &amp;quot;secvb.out&amp;quot; conform formatului specificat în cerințe.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: - Acesta este blocul principal al codului și se execută doar atunci când fișierul este rulat direct (nu este importat ca modul în alt script). În interiorul acestui bloc, se apelează funcțiile de citire a datelor de intrare, validare a datelor, rezolvare a problemei și scriere a rezultatului în fișierul de ieșire. Dacă datele de intrare sunt introduse corect, se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; în consolă.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3274_-_secvb&amp;diff=6519</id>
		<title>3274 - secvb</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3274_-_secvb&amp;diff=6519"/>
		<updated>2023-05-14T21:44:46Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3274/secvb 3274 - secvb]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Pentru un număr natural x, vom nota cu B(x) numărul biților de 1 din reprezentarea lui x în baza 2. De exemplu, B(6) = 2, B(15) = 4, B(16) = 1. Fie un șir de N numere naturale x1, x2, …, xN. Pentru orice două valori i și j, cu 1 ≤ i ≤ j ≤ N, vom nota prin B(i, j) = B(xi) + B(xi+1) + ... + B(xj), adică B(i, j) este numărul tuturor biților de 1 din secvența de numere xi, xi+1, …, xj.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dat șirul x1, x2, …, xN și un număr natural T, să se determine numărul secvențelor de forma xi, xi+1, …, xj cu proprietatea că B(i,j) = T.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare secvb.in conține pe prima linie numerele naturale N și T, separate printr-un spațiu. Pe linia a doua se găsesc N numere naturale x1, x2, …, xN separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire secvb.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;prima linie numerele naturale N și T, separate printr-un spațiu. Pe linia a doua se găsesc N numere naturale x1, x2, …, xN separate prin câte un spațiu.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 50.000&lt;br /&gt;
* 0 ≤ T ≤ 100.000&lt;br /&gt;
* valorile din şir sunt numere naturale cuprinse între 1 și 1000.&lt;br /&gt;
== Exemplu 1  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvb.in&lt;br /&gt;
: 7 6&lt;br /&gt;
: 8 3 7 14 10 63 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: secvb.out&lt;br /&gt;
: 3&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvb.in&lt;br /&gt;
: 23 - 2 -3 41 &lt;br /&gt;
: 99 0 7 5 23 59 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3274 - secvb&lt;br /&gt;
&lt;br /&gt;
def count_set_bits(num):&lt;br /&gt;
    # Funcție care numără biții de 1 în reprezentarea binară a unui număr&lt;br /&gt;
    count = 0&lt;br /&gt;
    while num:&lt;br /&gt;
        count += num &amp;amp; 1&lt;br /&gt;
        num &amp;gt;&amp;gt;= 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_sequences(N, T, seq):&lt;br /&gt;
    # Funcție care găsește numărul de secvențe cu proprietatea B(i, j) = T&lt;br /&gt;
    count = 0&lt;br /&gt;
    prefix_sums = [0] * (N + 1)  # Prefixe de sume pentru a putea calcula B(i, j) în O(1)&lt;br /&gt;
&lt;br /&gt;
    # Calculăm prefixele de sume ale numărului de biți de 1 din secvență&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        prefix_sums[i] = prefix_sums[i - 1] + count_set_bits(seq[i - 1])&lt;br /&gt;
&lt;br /&gt;
    # Parcurgem toate perechile (i, j) și numărăm secvențele care satisfac proprietatea&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        for j in range(i, N + 1):&lt;br /&gt;
            if prefix_sums[j] - prefix_sums[i - 1] == T:&lt;br /&gt;
                count += 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(N, T, seq):&lt;br /&gt;
    # Funcție care validează datele de intrare&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 50000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= T &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 1000 for x in seq):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;secvb.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        N, T = map(int, file.readline().split())&lt;br /&gt;
        seq = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Validarea datelor de intrare&lt;br /&gt;
    if not validate_input(N, T, seq):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Rezolvarea problemei și afișarea rezultatului&lt;br /&gt;
        result = find_sequences(N, T, seq)&lt;br /&gt;
        print(result)&lt;br /&gt;
&lt;br /&gt;
        # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
        with open(&amp;quot;secvb.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
count_bits(numar) - Această funcție primește ca argument un număr natural numar și returnează numărul de biți de 1 din reprezentarea sa în baza 2. Pentru a realiza acest lucru, se convertește numar în reprezentarea binară utilizând funcția bin() și se numără biții de 1 în reprezentare folosind funcția count().&lt;br /&gt;
&lt;br /&gt;
find_sequences(N, T, nums) - Această funcție primește trei argumente: N - numărul de elemente din șir, T - numărul dorit de biți de 1 și nums - lista de numere. Funcția parcurge toate posibilele secvențe de elemente din lista și verifică dacă suma biților de 1 din secvență este egală cu T. Dacă se găsește o astfel de secvență, se incrementează un contor pentru numărul de secvențe găsite.&lt;br /&gt;
&lt;br /&gt;
validate_input(N, T, nums) - Această funcție primește trei argumente: N - numărul de elemente din șir, T - numărul dorit de biți de 1 și nums - lista de numere. Funcția validează dacă datele de intrare corespund restricțiilor impuse în enunțul problemei. Verificările includ verificarea limitelor pentru N și T, precum și verificarea limitelor pentru valorile din lista nums.&lt;br /&gt;
&lt;br /&gt;
read_input() - Această funcție este responsabilă de citirea datelor de intrare din fișierul &amp;quot;secvb.in&amp;quot;. Ea returnează valorile citite pentru N, T și lista nums.&lt;br /&gt;
&lt;br /&gt;
write_output(result) - Această funcție primește rezultatul obținut și este responsabilă de scrierea rezultatului în fișierul &amp;quot;secvb.out&amp;quot; conform formatului specificat în cerințe.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: - Acesta este blocul principal al codului și se execută doar atunci când fișierul este rulat direct (nu este importat ca modul în alt script). În interiorul acestui bloc, se apelează funcțiile de citire a datelor de intrare, validare a datelor, rezolvare a problemei și scriere a rezultatului în fișierul de ieșire. Dacă datele de intrare sunt introduse corect, se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; în consolă.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3281_-_sminus&amp;diff=6518</id>
		<title>3281 - sminus</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3281_-_sminus&amp;diff=6518"/>
		<updated>2023-05-14T21:43:25Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3281/sminus 3281 - sminus]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Fie un șir a1, a2, …, aN de numere întregi. În acest șir se alege o pereche de indici (x, y), 1 ≤ x ≤ y ≤ N și se inversează semnul tuturor componentelor secvenței ax, ax+1, …, ay. De exemplu, pentru șirul 3, -5, 4, -1, 6, -8, -5, dacă se alege perechea (3, 5), atunci șirul va deveni 3, -5, -4, 1, -6, -8, -5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine o pereche de indici x y astfel încât după inversarea semnului componentelor secvenței ax, ax+1, …, ay suma elementelor din vector să fie minimă.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare sminus.in conține pe prima linie numărul N. Pe a doua linie, separate prin câte un spațiu, se găsesc numerele întregi a1, a2, …, aN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire sminus.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;Pe prima linie se vor găsi două numere naturale x și y separate printr-un spațiu reprezentând perechea de indici. Pe linia a doua se va găsi un singur număr natural reprezentând suma minimă obținută prin inversarea semnului componentelor din secvența ax, ax+1, …, ay.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ N ≤ 100.000&lt;br /&gt;
* -1000 ≤ ai ≤ 1000 pentru orice i = 1..N&lt;br /&gt;
* Secvența ax, ax+1, …, ay trebuie să conțină cel puțin un element.&lt;br /&gt;
* Dacă există mai multe soluții pentru perechea (x, y), atunci se va alegea aceea care are indicele x minim, iar dacă sunt mai multe secvențe posibile care încep la poziția x, se va alege aceea care are valoarea y maximă.&lt;br /&gt;
* Pentru teste valorând 50 de puncte, N ≤ 2000.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: sminus.in&lt;br /&gt;
: 7&lt;br /&gt;
: 3 -5 4 -1 6 -8 -5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: sminus.out&lt;br /&gt;
: 3 5&lt;br /&gt;
: -24&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: sminus.in&lt;br /&gt;
: 7 2 3 5 0.67&lt;br /&gt;
: 3 -5 4 -1 6 -8 -5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3281 - sminus&lt;br /&gt;
&lt;br /&gt;
def find_min_sum_sequence(n, arr):&lt;br /&gt;
    min_sum = float(&#039;inf&#039;)&lt;br /&gt;
    start_index = 0&lt;br /&gt;
    end_index = 0&lt;br /&gt;
    current_sum = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i, n):&lt;br /&gt;
            current_sum = sum(arr[i:j+1])&lt;br /&gt;
            if current_sum &amp;lt; min_sum:&lt;br /&gt;
                min_sum = current_sum&lt;br /&gt;
                start_index = i&lt;br /&gt;
                end_index = j&lt;br /&gt;
    return start_index, end_index, min_sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(-1000 &amp;lt;= num &amp;lt;= 1000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;sminus.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file, open(&amp;quot;sminus.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        n = int(input_file.readline().strip())&lt;br /&gt;
        arr = list(map(int, input_file.readline().strip().split()))&lt;br /&gt;
        &lt;br /&gt;
        if not validate_input(n, arr):&lt;br /&gt;
            output_file.write(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            start_index, end_index, min_sum = find_min_sum_sequence(n, arr)&lt;br /&gt;
            output_file.write(&amp;quot;Datele sunt introduse correct.\n&amp;quot;)&lt;br /&gt;
            output_file.write(f&amp;quot;{start_index + 1} {end_index + 1}\n&amp;quot;)&lt;br /&gt;
            output_file.write(f&amp;quot;{min_sum}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
read_input(): Această funcție este responsabilă de citirea datelor de intrare. Ea citește valorile din fișierul &amp;quot;sminus.in&amp;quot; și returnează acele valori necesare pentru rezolvarea problemei. În acest caz, citim mai întâi numărul N, apoi citim secvența a1, a2, ..., aN.&lt;br /&gt;
&lt;br /&gt;
solve_problem(N, seq): Această funcție primește ca parametri numărul N și secvența seq. Ea rezolvă problema și returnează o tuplă conținând perechea de indici (x, y) și suma minimă obținută prin inversarea semnului componentelor secvenței. Pentru a rezolva problema, funcția parcurge secvența și calculează suma parțială pe măsură ce inversăm semnul. Pentru a găsi perechea optimă, se țin cont de cerințele enunțului referitoare la ordinea și valoarea minimă/maximă.&lt;br /&gt;
&lt;br /&gt;
validate_input(N, seq): Această funcție primește numărul N și secvența seq și verifică dacă datele de intrare respectă restricțiile impuse. Ea efectuează diverse verificări, cum ar fi verificarea dimensiunii secvenței, verificarea valorilor și formatei acestora, și returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
write_output(indices, min_sum): Această funcție primește perechea de indici indices și suma minimă min_sum și se ocupă de scrierea rezultatelor în fișierul &amp;quot;sminus.out&amp;quot;. Ea formatează rezultatele conform cerințelor și le scrie în fișierul de ieșire.&lt;br /&gt;
&lt;br /&gt;
main(): Aceasta este funcția principală a programului. Ea verifică dacă codul este rulat ca un script principal și, în caz afirmativ, gestionează citirea datelor de intrare, validarea acestora, rezolvarea problemei și scrierea rezultatelor. Ea folosește celelalte funcții menționate mai sus pentru a realiza aceste operaț&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4177_-_livada2&amp;diff=6517</id>
		<title>4177 - livada2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4177_-_livada2&amp;diff=6517"/>
		<updated>2023-05-14T21:41:28Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/4177/livada2 4177 - livada2]&lt;br /&gt;
----&lt;br /&gt;
Fiind un băiat aventurier, călărețul Jonathan obișnuia să umble prin pădurile magice ale împărăției tatălui său. În interiorul meleagurilor lui, împăratul avea o livadă specială, în cadrul căreia se aflau n meri magici, numerotați de la 1 la n, fiecare măr i conținând o cantitate cunoscută m[i] de fructe. Fiind speciali, cantitatea de fructe din acești meri putea fi modificată. Ca în orice poveste, împăratul avea un dușman, pe vrăjitorul Afida, care dorea să-i atace livada. Cunoscând acest fapt, Jonathan, fiul împăratului, dorește să protejeze livada tatălui său. Cei doi se confruntă în livadă, fiecare făcând modificări asupra merilor. Există în total q modificări, fiind de două tipuri:&lt;br /&gt;
&lt;br /&gt;
1 x y p: cantitatea de fructe din merii cu indici cuprinși între x și y crește cu p, fiind o modificare făcută de Jonathan&lt;br /&gt;
&lt;br /&gt;
2 x y p: cantitatea de fructe din merii cu indici cuprinși între x și y scade cu p, fiind o modificare făcută de vrăjitorul Afida&lt;br /&gt;
&lt;br /&gt;
Mai mult: În cadrul livezii împăratului, există câțiva meri extra magici care influențează modificările pe care le fac cei doi. Dacă în cadrul unei modificări a lui Jonathan, după y există un măr extra magic t, astfel încât între y și t nu există alt măr extra magic, interogarea cuprinsă între x și y se va transforma în interogare între x și t. Dacă în cadrul unei modificări a lui Afida, înaintea lui x există un măr extra magic t, astfel încât între t și x nu există alt măr extra magic, interogarea cuprinsă între x și y se va transforma în interogare între t și y.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se afișeze cantitatea de fructe din fiecare măr după cele q modificări.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului livada2.in se găsește numărul n. Pe următoarea linie se găsesc n numere întregi, separate printr-un spațiu, al i-lea număr reprezentând cantitatea de fructe din mărul corespunzător. Pe următoarea linie se găsesc n numere, 0 sau 1, separate printr-un spațiu, valorile 1 indicând faptul că mărul de pe poziția i este extra special. Pe a 4-a linie se află numărul q de modificări. Următoarele q linii vor conține interogările, fiind de forma: c x y p. Dacă c=1, modificarea este făcută de Jonathan. Dacă c=2, modificarea este făcută de vrăjitorul Afida.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
n fișierul livada2.out vor fi afișate:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; n numere întregi separate prin câte un spațiu, reprezentând valorile din m, adică cantitatea de fructe a fiecărui măr&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* 1 ≤ q ≤ 250.000&lt;br /&gt;
* 1 ≤ m[i] ≤ 1000, pentru 1 ≤ i ≤ n&lt;br /&gt;
* Pentru 40 de puncte, q ≤ 1000 și n ≤ 1000&lt;br /&gt;
* Pentru alte 20 de puncte, nu vor exista meri extra speciali&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: livada2.in&lt;br /&gt;
: 10&lt;br /&gt;
: 17 18 2 21 14 6 13 14 8 10 &lt;br /&gt;
: 1 1 0 0 0 0 1 0 0 0 &lt;br /&gt;
: 7&lt;br /&gt;
: 2 4 7 3 &lt;br /&gt;
: 1 8 9 16 &lt;br /&gt;
: 2 8 8 25 &lt;br /&gt;
: 2 4 4 8 &lt;br /&gt;
: 1 2 8 1 &lt;br /&gt;
: 2 8 9 21 &lt;br /&gt;
: 1 5 6 19&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: livada2.out&lt;br /&gt;
: 17 8 -8 11 31 23 -16 -15 3 10&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: livada2.in&lt;br /&gt;
: 10&lt;br /&gt;
: 17 18 2 21 14 6 13 14 8 10 &lt;br /&gt;
: 1 1 0 0 0 0 1 0 0 0 &lt;br /&gt;
: -1 2 3 -78 -23 2.34&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 4177 - livada2&lt;br /&gt;
&lt;br /&gt;
def apply_query(n, m, is_extra, query):&lt;br /&gt;
    c, x, y, p = query&lt;br /&gt;
    x -= 1  # convertim la 0-indexing&lt;br /&gt;
    y -= 1&lt;br /&gt;
    t1, t2 = None, None&lt;br /&gt;
    for i in range(x, y + 1):&lt;br /&gt;
        if is_extra[i]:&lt;br /&gt;
            if i &amp;lt; y and not t1:&lt;br /&gt;
                t1 = i&lt;br /&gt;
            if i &amp;gt; x and not t2:&lt;br /&gt;
                t2 = i&lt;br /&gt;
    if c == 1:  # modificarea lui Jonathan&lt;br /&gt;
        for i in range(x, y + 1):&lt;br /&gt;
            if t1 and i &amp;gt; t1:&lt;br /&gt;
                break&lt;br /&gt;
            m[i] += p&lt;br /&gt;
    else:  # modificarea lui Afida&lt;br /&gt;
        for i in range(y, x - 1, -1):&lt;br /&gt;
            if t2 and i &amp;lt; t2:&lt;br /&gt;
                break&lt;br /&gt;
            m[i] -= p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate(n, m):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        assert m[i] &amp;gt;= 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(m):&lt;br /&gt;
    with open(&amp;quot;livada2.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
        file.write(&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
        file.write(&amp;quot; &amp;quot;.join(map(str, m)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve_problem(n, m, is_extra, q, queries):&lt;br /&gt;
    try:&lt;br /&gt;
        validate(n, m)&lt;br /&gt;
        for query in queries:&lt;br /&gt;
            apply_query(n, m, is_extra, query)&lt;br /&gt;
        write_output(m)&lt;br /&gt;
    except AssertionError:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    m = list(map(int, input().split()))&lt;br /&gt;
    is_extra = list(map(int, input().split()))&lt;br /&gt;
    q = int(input())&lt;br /&gt;
    queries = []&lt;br /&gt;
    for i in range(q):&lt;br /&gt;
        query = list(map(int, input().split()))&lt;br /&gt;
        queries.append(query)&lt;br /&gt;
    solve_problem(n, m, is_extra, q, queries)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
apply_query(n, m, is_extra, query): Această funcție primește parametrii n, m, is_extra și query și aplică modificarea specificată de interogare (query) asupra listei m. Modificările sunt efectuate conform regulilor specificate în cerință. Funcția nu returnează nimic, deoarece modificările sunt aplicate direct asupra listei m.&lt;br /&gt;
&lt;br /&gt;
validate(n, m): Această funcție primește parametrii n și m și verifică dacă valorile din lista m respectă restricțiile impuse. Dacă găsește o valoare negativă, ridică o excepție AssertionError. Dacă nu există excepții, se consideră că datele sunt valide.&lt;br /&gt;
&lt;br /&gt;
write_output(m): Această funcție primește lista m și scrie rezultatul în fișierul &amp;quot;livada2.out&amp;quot;. În fișier, se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; urmat de valorile din lista m separate prin spații.&lt;br /&gt;
&lt;br /&gt;
solve_problem(n, m, is_extra, q, queries): Această funcție primește toți parametrii necesari pentru a rezolva problema. Ea se ocupă de apelarea celorlalte funcții în ordinea corectă. Mai întâi, verifică dacă datele sunt valide utilizând funcția validate. Apoi, aplică fiecare interogare din lista queries utilizând funcția apply_query. La final, scrie rezultatul în fișierul de ieșire utilizând funcția write_output.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: Acest bloc verifică dacă codul este executat direct (nu importat ca modul). În acest caz, se face citirea datelor de intrare utilizând funcția input() și se apelează funcția solve_problem cu parametrii corespunzători.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0300_-_SumaInSecv&amp;diff=6514</id>
		<title>0300 - SumaInSecv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0300_-_SumaInSecv&amp;diff=6514"/>
		<updated>2023-05-14T21:37:14Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/4148/secv10 0300 - SumaInSecv]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector format din n elemente, numere naturale nenule, şi un număr natural S. Determinaţi, dacă există o secvenţă de elemente din şir cu suma elementelor egală cu S.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare sumainsecv.in conţine pe prima linie numerele n şi S; urmează cele n elemente ale vectorului, dispuse pe mai multe linii şi separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;și fișierul secv10.out va conține pe prima linie numerele lmax și c, reprezentând lungimea maximă a unei secvențe de elemente divizibile cu 10, respectiv numărul de secvențe de lungime maximă cu elemente divizibile cu 10&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100&lt;br /&gt;
* elementele vectorului vor avea cel mult 4 cifre şi sunt numerotate de la 1 la n&lt;br /&gt;
* dacă vectorul nu conţine nici o secvenţă cu suma elementelor S, se va afişa 0 0&lt;br /&gt;
* dacă şirul conţine mai multe secvenţe cu suma elementelor egală cu S, se va determina cea mai din stânga&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secv10.in&lt;br /&gt;
: 8 32  &lt;br /&gt;
: 12 10 15 7 17 13 19 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct&lt;br /&gt;
: secv10.out&lt;br /&gt;
: 2 4 &lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secv10.in&lt;br /&gt;
: 0 32 &lt;br /&gt;
: &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0300 - SumaInSecv&lt;br /&gt;
&lt;br /&gt;
def secv_suma(n, S, v):&lt;br /&gt;
    dp = [[0 for j in range(n)] for i in range(n)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        dp[i][i] = v[i]&lt;br /&gt;
        for j in range(i+1, n):&lt;br /&gt;
            dp[i][j] = dp[i][j-1] + v[j]&lt;br /&gt;
&lt;br /&gt;
    lmax = c = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i, n):&lt;br /&gt;
            if dp[i][j] == S:&lt;br /&gt;
                l = j-i+1&lt;br /&gt;
                if l &amp;gt; lmax:&lt;br /&gt;
                    lmax = l&lt;br /&gt;
                    c = 1&lt;br /&gt;
                elif l == lmax:&lt;br /&gt;
                    c += 1&lt;br /&gt;
&lt;br /&gt;
    if lmax == 0:&lt;br /&gt;
        return 0, 0&lt;br /&gt;
    else:&lt;br /&gt;
        return lmax, c&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, S, v):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(v) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if not (1 &amp;lt;= v[i] &amp;lt;= 9999):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;sumainsecv.in&amp;quot;) as f:&lt;br /&gt;
            n, S = map(int, f.readline().split())&lt;br /&gt;
            v = []&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                row = f.readline().split()&lt;br /&gt;
                if len(row) != 1:&lt;br /&gt;
                    raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
                v.append(int(row[0]))&lt;br /&gt;
            if not validate_input(n, S, v):&lt;br /&gt;
                raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        lmax, c = secv_suma(n, S, v)&lt;br /&gt;
        with open(&amp;quot;secv10.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(f&amp;quot;{lmax} {c}&amp;quot;)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
`secv_suma(n, S, v)`: Această funcție primește trei argumente: `n` - lungimea listei `v`, `S` - suma căutată și `v` - lista de numere întregi. Scopul funcției este să găsească cea mai lungă subsecvență continuă a listei `v` a cărei sumă este egală cu `S`. Funcția utilizează o abordare dinamică pentru a calcula matricea `dp` care stochează sumele parțiale ale subsecvențelor. Apoi, se verifică fiecare subsecvență pentru a determina cea mai lungă subsecvență cu suma `S`. Funcția returnează un tuplu `(lmax, c)` unde `lmax` este lungimea celei mai lungi subsecvențe și `c` este numărul de subsecvențe cu aceeași lungime maximă.&lt;br /&gt;
&lt;br /&gt;
 `validate_input(n, S, v)`: Această funcție primește trei argumente: `n` - lungimea listei `v`, `S` - suma căutată și `v` - lista de numere întregi. Scopul funcției este să valideze datele de intrare conform restricțiilor impuse. Verifică dacă lungimea listei `v` este `n`, dacă `n` se încadrează în intervalul permis și dacă fiecare element din `v` se încadrează în intervalul permis. Returnează `True` dacă datele sunt valide și `False` în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția principală `if __name__ == &amp;quot;__main__&amp;quot;` citeste datele de intrare din fișierul &amp;quot;sumainsecv.in&amp;quot;, validează datele folosind funcția `validate_input()`, apoi apelează funcția `secv_suma()` pentru a obține rezultatul dorit. Rezultatul este scris în fișierul &amp;quot;secv10.out&amp;quot;. Dacă apar erori în citirea sau validarea datelor, se afișează un mesaj corespunzător pe ecran.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4233_-_SecvDeSumaS&amp;diff=6509</id>
		<title>4233 - SecvDeSumaS</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4233_-_SecvDeSumaS&amp;diff=6509"/>
		<updated>2023-05-14T21:33:47Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/4233/secvdesumas 4233 - SecvDeSumaS]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir a1, a2, …, an de numere întregi și un număr întreg S. Să se determine numărul secvențelor nevide care au suma egală cu S.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură de pe prima linie numerele n, S, iar de pe a doua linie numerele separate prin spații a1, a2, …, an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul numărul secvențelor nevide care au suma egală cu S&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000&lt;br /&gt;
* -1000 ≤ ai ≤ 1000 pentru orice i=1..n&lt;br /&gt;
* -1.000.000.000 ≤ S ≤ 1.000.000.000&lt;br /&gt;
O secvență nevidă este formată din unul sau mai multe elemente ale șirului aflate pe poziții consecutive.nță cu elemente ordonate crescător este maximală dacă adăugând la secvență încă un element ea nu mai are elementele ordonate crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 13 -10&lt;br /&gt;
: 2 3 -11 1 -11 4 -8 10 -14 10 -5 4 -17&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 22 3 5 9 2 &lt;br /&gt;
: 1 2 3 5 0 0 -1 0 2 -76 23&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 4233 - SecvDeSumaS&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, S, arr):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;lt; -1000 or num &amp;gt; 1000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (-1000000000 &amp;lt;= S &amp;lt;= 1000000000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_sequences(n, S, arr):&lt;br /&gt;
    if not validate_input(n, S, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    count = 0&lt;br /&gt;
    current_sum = 0&lt;br /&gt;
    prefix_sum = {0: 1}&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        current_sum += arr[i]&lt;br /&gt;
        diff = current_sum - S&lt;br /&gt;
        if diff in prefix_sum:&lt;br /&gt;
            count += prefix_sum[diff]&lt;br /&gt;
        prefix_sum[current_sum] = prefix_sum.get(current_sum, 0) + 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n, S = map(int, input(&amp;quot;Introduceti n si S: &amp;quot;).split())&lt;br /&gt;
    arr = list(map(int, input(&amp;quot;Introduceti vectorul de numere întregi: &amp;quot;).split()))&lt;br /&gt;
&lt;br /&gt;
    result = count_sequences(n, S, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, S, arr) este responsabilă pentru validarea datelor de intrare. Aceasta verifică dacă valorile îndeplinesc restricțiile impuse în cerință. Verifică următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
n trebuie să fie între 1 și 1.000.000&lt;br /&gt;
lungimea listei arr trebuie să fie n&lt;br /&gt;
fiecare element din arr trebuie să fie între -1000 și 1000&lt;br /&gt;
S trebuie să fie între -1.000.000.000 și 1.000.000.000&lt;br /&gt;
Dacă oricare dintre aceste condiții nu este îndeplinită, funcția returnează False, altfel returnează True.&lt;br /&gt;
Funcția count_sequences(n, S, arr) primește parametrii validați și calculează numărul de secvențe nevide care au suma egală cu S.&lt;br /&gt;
&lt;br /&gt;
Verifică dacă datele de intrare sunt valide folosind funcția validate_input(). Dacă nu sunt valide, returnează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
Inițializează variabila count cu 0 pentru a număra secvențele care îndeplinesc condiția.&lt;br /&gt;
Inițializează variabilele current_sum cu 0 și prefix_sum ca un dicționar cu o singură valoare inițială: {0: 1}. Aceasta înseamnă că avem o sumă curentă de 0 și avem o secvență goală cu sumă 0 (aceasta va fi folosită pentru a număra secvențele care încep de la începutul listei arr și au suma S).&lt;br /&gt;
Parcurge fiecare element num din arr.&lt;br /&gt;
Adaugă num la current_sum.&lt;br /&gt;
Calculează diferența diff dintre current_sum și S.&lt;br /&gt;
Verifică dacă diff există în dicționarul prefix_sum. Dacă există, înseamnă că am găsit o secvență cu suma S. Adaugă valoarea corespunzătoare din prefix_sum la count.&lt;br /&gt;
Incrementăm sau actualizăm valoarea corespunzătoare current_sum în dicționarul prefix_sum.&lt;br /&gt;
La sfârșitul buclei, count va conține numărul total de secvențe care au suma S.&lt;br /&gt;
Returnează valoarea count.&lt;br /&gt;
Blocul if __name__ == &#039;__main__&#039;: este responsabil pentru citirea datelor de intrare și apelarea funcțiilor corespunzătoare.&lt;br /&gt;
&lt;br /&gt;
Citim n și S de la tastatură și le convertim la întregi utilizând map și int.&lt;br /&gt;
Citim vectorul arr de numere întregi de la tastatură, îl splituim într-o listă folosind split&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3937_-_KSum3&amp;diff=6507</id>
		<title>3937 - KSum3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3937_-_KSum3&amp;diff=6507"/>
		<updated>2023-05-14T21:31:31Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3937/ksum3 3937 - KSum3]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă N și un vector de N elemente numere întregi, găsiți suma maximă a unei subsecvențe (elemente adiacente) cu lungimile cuprinse între K și W (K &amp;lt;= lungime &amp;lt;= W).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele N, K, W iar apoi un vector de N numere întregi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând suma maxima a unei subsecvențe care respectă condițiile din enunț&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ K ≤ W ≤ N ≤ 1.000.000&lt;br /&gt;
* cele N numere citite vor fi din intervalul [-1.000.000.000, 1.000.000.000].crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 6 3 4&lt;br /&gt;
: 5 4 -10 1 2 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 6&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 256&lt;br /&gt;
: 5 4 -10 -3 -3 0 0 0 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3937 - KSum3&lt;br /&gt;
&lt;br /&gt;
def validate_input(N, K, W, arr):&lt;br /&gt;
    if not (1 &amp;lt;= K &amp;lt;= W &amp;lt;= N &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != N:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;lt; -1000000000 or num &amp;gt; 1000000000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_max_subsequence_sum(N, K, W, arr):&lt;br /&gt;
    if not validate_input(N, K, W, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    max_sum = float(&amp;quot;-inf&amp;quot;)&lt;br /&gt;
    current_sum = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        current_sum += arr[i]&lt;br /&gt;
        if i &amp;gt;= K - 1:&lt;br /&gt;
            max_sum = max(max_sum, current_sum)&lt;br /&gt;
            current_sum -= arr[i - K + 1]&lt;br /&gt;
&lt;br /&gt;
    return max_sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    N = int(input(&amp;quot;Introduceti N: &amp;quot;))&lt;br /&gt;
    K = int(input(&amp;quot;Introduceti K: &amp;quot;))&lt;br /&gt;
    W = int(input(&amp;quot;Introduceti W: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    arr = list(map(int, input(&amp;quot;Introduceti vectorul de numere întregi: &amp;quot;).split()))&lt;br /&gt;
&lt;br /&gt;
    result = find_max_subsequence_sum(N, K, W, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
validate_input(N, K, W, arr): Această funcție primește patru parametri: N, K, W și arr, reprezentând numărul de elemente, limitele K și W, și lista de numere întregi arr. Scopul acestei funcții este să valideze datele de intrare conform restricțiilor impuse. Verificările includ:&lt;br /&gt;
&lt;br /&gt;
Dacă K și W sunt în intervalul permis, adică 1 &amp;lt;= K &amp;lt;= W &amp;lt;= N &amp;lt;= 1000000.&lt;br /&gt;
Dacă lungimea listei arr este egală cu N.&lt;br /&gt;
Dacă oricare dintre numerele din lista arr depășește limitele [-1000000000, 1000000000].&lt;br /&gt;
Dacă oricare dintre aceste condiții nu este îndeplinită, funcția returnează False, indicând că datele nu corespund restricțiilor. În caz contrar, funcția returnează True, semnificând că datele sunt introduse corect.&lt;br /&gt;
&lt;br /&gt;
find_max_subsequence_sum(N, K, W, arr): Această funcție primește aceiași parametri ca și validate_input: N, K, W și arr. Scopul acestei funcții este să găsească suma maximă a unei subsecvențe cu lungimi cuprinse între K și W în lista arr. Funcția verifică întâi datele de intrare utilizând funcția validate_input. Dacă datele nu sunt valide, funcția returnează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt valide, funcția inițializează max_sum cu o valoare negativă foarte mică și current_sum cu 0. Apoi, utilizează o buclă for pentru a itera prin lista arr. La fiecare pas, adaugă elementul curent la suma curentă current_sum. Dacă indicele curent i este mai mare sau egal cu K - 1, înseamnă că lungimea subsecvenței este cel puțin K, așa că compară current_sum cu max_sum și actualizează max_sum dacă este necesar. În final, se scade elementul din subsecvență care nu mai face parte din fereastra curentă, adică arr[i - K + 1], din current_sum.&lt;br /&gt;
&lt;br /&gt;
La sfârșit, funcția returnează max_sum, care reprezintă suma maximă a subsecvenței.&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;: : Acesta este blocul principal al programului care va fi executat doar atunci când scriptul este rulat direct și nu importat ca modul în altă parte a codului. În acest bloc, se face citirea datelor utilizând funcția input() și map(), apoi se apelează funcția find_max_subsequence_sum&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1364_-_produs3&amp;diff=6506</id>
		<title>1364 - produs3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1364_-_produs3&amp;diff=6506"/>
		<updated>2023-05-14T21:30:46Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1364/produs3 1364 - produs3]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir cu n numere naturale nenule care sunt divizibile doar cu numerele prime 2, 3 sau 5. Determinaţi numărul secvenţelor din şir pentru care produsul elementelor este pătrat perfect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare produs3.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule divizibile doar cu numerele prime 2, 3 sau 5, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire produs3.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând numărul secvenţelor din şir pentru care produsul elementelor este pătrat perfect&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000&lt;br /&gt;
== Exemplu 1  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: produs3.in&lt;br /&gt;
: 5&lt;br /&gt;
: 12 3 4 5 45&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: produs3.out&lt;br /&gt;
: 6&lt;br /&gt;
== Exemplu 2  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: produs3.in&lt;br /&gt;
: 0 0 0 1&lt;br /&gt;
: -2 -3 1 5 0&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1364 - produs3&lt;br /&gt;
&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def solve(n, arr):&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        prod = 1&lt;br /&gt;
        for j in range(i, n):&lt;br /&gt;
            prod *= arr[j]&lt;br /&gt;
            if math.isqrt(prod) ** 2 == prod:&lt;br /&gt;
                cnt += 1&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
def validate(n, arr):&lt;br /&gt;
    primes = [2, 3, 5]&lt;br /&gt;
    for x in arr:&lt;br /&gt;
        for prime in primes:&lt;br /&gt;
            while x % prime == 0:&lt;br /&gt;
                x //= prime&lt;br /&gt;
        if x != 1:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if validate(n, arr):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        result = solve(n, arr)&lt;br /&gt;
        print(result)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
solve(n, arr): Această funcție primește numărul de elemente n și lista de numere arr. Scopul acestei funcții este să determine numărul de secvențe din lista arr pentru care produsul elementelor este un pătrat perfect. Funcția utilizează două bucle for pentru a itera prin toate secvențele posibile și calculează produsul elementelor. Dacă produsul este un pătrat perfect (verificat utilizând funcția math.isqrt()), se incrementează un contor cnt. La final, funcția returnează valoarea contorului cnt.&lt;br /&gt;
&lt;br /&gt;
validate(n, arr): Această funcție primește numărul de elemente n și lista de numere arr. Scopul acestei funcții este să valideze lista arr, verificând dacă fiecare număr din listă este divizibil doar cu numerele prime 2, 3 și 5. Funcția parcurge fiecare număr din listă și îl împarte succesiv la aceste numere prime până când nu mai poate fi împărțit. Dacă la final rămâne un rest diferit de 1, funcția returnează False, semnificând că datele nu corespund restricțiilor impuse. În caz contrar, returnează True.&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;: : Acesta este blocul principal al programului care va fi executat doar atunci când scriptul este rulat direct și nu importat ca modul în altă parte a codului. În acest bloc, se face citirea datelor utilizând funcția input(), se validează datele utilizând funcția validate(), iar dacă datele sunt valide, se apelează funcția solve() pentru a obține rezultatul și se afișează rezultatul. În cazul în care datele nu sunt valide, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3937_-_KSum3&amp;diff=6502</id>
		<title>3937 - KSum3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3937_-_KSum3&amp;diff=6502"/>
		<updated>2023-05-14T21:28:01Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3937/ksum3 3937 - KSum3]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă N și un vector de N elemente numere întregi, găsiți suma maximă a unei subsecvențe (elemente adiacente) cu lungimile cuprinse între K și W (K &amp;lt;= lungime &amp;lt;= W).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele N, K, W iar apoi un vector de N numere întregi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând suma maxima a unei subsecvențe care respectă condițiile din enunț&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ K ≤ W ≤ N ≤ 1.000.000&lt;br /&gt;
* cele N numere citite vor fi din intervalul [-1.000.000.000, 1.000.000.000].crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 6 3 4&lt;br /&gt;
: 5 4 -10 1 2 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 6&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 256&lt;br /&gt;
: 5 4 -10 -3 -3 0 0 0 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3937 - KSum3&lt;br /&gt;
&lt;br /&gt;
def validate_input(N, K, W, arr):&lt;br /&gt;
    if not (1 &amp;lt;= K &amp;lt;= W &amp;lt;= N &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != N:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;lt; -1000000000 or num &amp;gt; 1000000000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_max_subsequence_sum(N, K, W, arr):&lt;br /&gt;
    if not validate_input(N, K, W, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    max_sum = float(&amp;quot;-inf&amp;quot;)&lt;br /&gt;
    current_sum = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        current_sum += arr[i]&lt;br /&gt;
        if i &amp;gt;= K - 1:&lt;br /&gt;
            max_sum = max(max_sum, current_sum)&lt;br /&gt;
            current_sum -= arr[i - K + 1]&lt;br /&gt;
&lt;br /&gt;
    return max_sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    N = int(input(&amp;quot;Introduceti N: &amp;quot;))&lt;br /&gt;
    K = int(input(&amp;quot;Introduceti K: &amp;quot;))&lt;br /&gt;
    W = int(input(&amp;quot;Introduceti W: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    arr = list(map(int, input(&amp;quot;Introduceti vectorul de numere întregi: &amp;quot;).split()))&lt;br /&gt;
&lt;br /&gt;
    result = find_max_subsequence_sum(N, K, W, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
validate_input(n, k, w, arr): Această funcție validează datele de intrare. Verifică dacă valorile N, K și W respectă restricțiile impuse și dacă dimensiunea vectorului este în concordanță cu N. Returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
find_max_subsequence_sum(n, k, w, arr): Această funcție calculează suma maximă a unei subsecvențe care respectă condițiile date. Verifică mai întâi validitatea datelor de intrare utilizând funcția validate_input(). Apoi, parcurge vectorul de la stânga la dreapta și, pentru fiecare poziție, calculează suma maximă a unei subsecvențe de lungime cuprinsă între K și W. Returnează suma maximă calculată.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: este locul în care se face citirea datelor de intrare și apelarea funcțiilor pentru rezolvarea problemei.&lt;br /&gt;
&lt;br /&gt;
Se deschide fișierul &amp;quot;ksum3.in&amp;quot; pentru citire și se citesc valorile N, K, W de pe prima linie și elementele vectorului de pe a doua linie.&lt;br /&gt;
Se apelează funcția find_max_subsequence_sum() cu datele citite.&lt;br /&gt;
Dacă rezultatul returnat este o sumă validă, se afișează &amp;quot;Datele sunt introduse corect.&amp;quot; și suma calculată. Altfel, se afișează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2142_-_easy_sum&amp;diff=6499</id>
		<title>2142 - easy sum</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2142_-_easy_sum&amp;diff=6499"/>
		<updated>2023-05-14T21:25:30Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/2142/easy-sum 2142 - easy sum]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se consideră un vector cu n elemente numere naturale. Calculați suma sumelor tuturor subsecvențelor ce se pot forma cu elementele vectorului. Pentru că suma poate fi foarte mare, afișați suma modulo 1.000.000.007.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare easy_sum.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire easy_sum.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând suma sumelor tuturor subsecvențelor modulo 1.000.000.007&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi cuprinse în intervalul [1,1.000.000]&lt;br /&gt;
* prin subsecvență înțelegem orice înșiruire de elemente din vector aflate pe poziții consecutive.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: easy_sum.in&lt;br /&gt;
: 3&lt;br /&gt;
: 1 2 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: easy_sum.out&lt;br /&gt;
: 20&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: easy_sum.in&lt;br /&gt;
: 21&lt;br /&gt;
: 1 2 3 4 2 7 -8&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 2142 - easy sum&lt;br /&gt;
&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;lt; 1 or num &amp;gt; 1000000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_subsequence_sum(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    MOD = 1000000007&lt;br /&gt;
    total_sum = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        total_sum = (total_sum + (arr[i] * (i + 1) * (n - i)) % MOD) % MOD&lt;br /&gt;
&lt;br /&gt;
    return total_sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_name = &amp;quot;easy_sum.in&amp;quot;&lt;br /&gt;
    with open(file_name, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        arr = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = calculate_subsequence_sum(n, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește doi parametri: n - numărul de elemente din vector și arr - lista de numere.&lt;br /&gt;
Verifică dacă valoarea n se încadrează în intervalul specificat în cerință și dacă lungimea listei arr este egală cu n.&lt;br /&gt;
Verifică, de asemenea, dacă există vreun număr din lista arr care este mai mic decât 1 sau mai mare decât 1000000. Dacă da, se returnează False, semnalând că datele nu corespund restricțiilor impuse.&lt;br /&gt;
Dacă toate verificările sunt trecute cu succes, înseamnă că datele de intrare sunt valide, astfel că se returnează True.&lt;br /&gt;
Funcția calculate_subsequence_sum(n, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește doi parametri: n - numărul de elemente din vector și arr - lista de numere.&lt;br /&gt;
Verifică mai întâi validitatea datelor de intrare folosind funcția validate_input(n, arr). Dacă datele nu sunt valide, returnează un mesaj corespunzător.&lt;br /&gt;
Inițializează variabila total_sum cu valoarea 0, care va fi utilizată pentru a calcula suma subsecvențelor.&lt;br /&gt;
Parcurge lista arr și pentru fiecare element, adaugă la total_sum valoarea elementului înmulțită cu (i + 1) * (n - i). Aceasta reprezintă numărul de subsecvențe în care elementul curent apare.&lt;br /&gt;
Se aplică modularitatea cu MOD pentru a menține suma subsecvențelor într-un interval valid.&lt;br /&gt;
La final, se returnează total_sum calculat modulo MOD.&lt;br /&gt;
În funcția if __name__ == &amp;quot;__main__&amp;quot;, se realizează citirea datelor de intrare din fișierul&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1350_-_produs2&amp;diff=6498</id>
		<title>1350 - produs2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1350_-_produs2&amp;diff=6498"/>
		<updated>2023-05-14T21:24:38Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1350/produs2 1350 - produs2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir cu n numere naturale nenule. Aflaţi câte secvenţe din şir au produsul mai mic decât un număr natural p dat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare produs2.in conține pe prima linie numerele n şi p, iar pe a doua linie n numere naturale nenule separate prin spații, reprezentând elementele şirului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire produs2.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând numărul secvenţelor din şir având produsul mai mic decât p&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000&lt;br /&gt;
* 1 &amp;lt; p ≤ 2.000.000.000&lt;br /&gt;
* numerele din şir vor fi mai mici decât 1.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: produs2.in&lt;br /&gt;
: 5 10&lt;br /&gt;
: 1 2 3 4 2&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: produs2.out&lt;br /&gt;
: 9&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: produs2.in&lt;br /&gt;
: 1 2 3 4 5&lt;br /&gt;
: 21 57 44 90&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1350 - produs2&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, p, arr):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt; p &amp;lt;= 2000000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;gt;= 1000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_sequences(n, p, arr):&lt;br /&gt;
    if not validate_input(n, p, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    count = 0&lt;br /&gt;
    product = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        product *= arr[i]&lt;br /&gt;
&lt;br /&gt;
        if product &amp;lt; p:&lt;br /&gt;
            count += 1&lt;br /&gt;
        else:&lt;br /&gt;
            product //= arr[i - count]&lt;br /&gt;
            count -= 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_name = &amp;quot;produs2.in&amp;quot;&lt;br /&gt;
    with open(file_name, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        arr = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = count_sequences(n, p, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, p, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește trei parametri: n - numărul de elemente din șir, p - limita produsului și arr - lista de numere.&lt;br /&gt;
Verifică dacă valorile n și p se încadrează în intervalele valide specificate în cerință și dacă lungimea listei arr este egală cu n.&lt;br /&gt;
Verifică, de asemenea, dacă există vreun număr din lista arr care este mai mare sau egal cu 1000. Dacă da, se returnează False, semnalând că datele nu corespund restricțiilor impuse.&lt;br /&gt;
Dacă toate verificările sunt trecute cu succes, înseamnă că datele de intrare sunt valide, astfel că se returnează True.&lt;br /&gt;
Funcția count_sequences(n, p, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește trei parametri: n - numărul de elemente din șir, p - limita produsului și arr - lista de numere.&lt;br /&gt;
Verifică mai întâi validitatea datelor de intrare folosind funcția validate_input(n, p, arr). Dacă datele nu sunt valide, returnează un mesaj corespunzător.&lt;br /&gt;
Inițializează variabila count cu valoarea 0, care va fi utilizată pentru a număra secvențele cu produs mai mic decât p.&lt;br /&gt;
Inițializează variabila product cu valoarea 1, care reprezintă produsul curent al secvenței.&lt;br /&gt;
Parcurge lista arr și în fiecare pas înmulțește product cu elementul curent.&lt;br /&gt;
Functia if __name__ == &#039;__main__&#039; se dechisde fisierul din care se citesc datele pentru a se rezolva problema&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1350_-_produs2&amp;diff=6496</id>
		<title>1350 - produs2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1350_-_produs2&amp;diff=6496"/>
		<updated>2023-05-14T21:23:44Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1350/produs2 1350 - produs2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir cu n numere naturale nenule. Aflaţi câte secvenţe din şir au produsul mai mic decât un număr natural p dat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare produs2.in conține pe prima linie numerele n şi p, iar pe a doua linie n numere naturale nenule separate prin spații, reprezentând elementele şirului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire produs2.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând numărul secvenţelor din şir având produsul mai mic decât p&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000&lt;br /&gt;
* 1 &amp;lt; p ≤ 2.000.000.000&lt;br /&gt;
* numerele din şir vor fi mai mici decât 1.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: produs2.in&lt;br /&gt;
: 5 10&lt;br /&gt;
: 1 2 3 4 2&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: produs2.out&lt;br /&gt;
: 9&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: produs2.in&lt;br /&gt;
: 1 2 3 4 5&lt;br /&gt;
: 21 57 44 90&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1350 - produs2&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, p, arr):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt; p &amp;lt;= 2000000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;gt;= 1000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_sequences(n, p, arr):&lt;br /&gt;
    if not validate_input(n, p, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    count = 0&lt;br /&gt;
    product = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        product *= arr[i]&lt;br /&gt;
&lt;br /&gt;
        if product &amp;lt; p:&lt;br /&gt;
            count += 1&lt;br /&gt;
        else:&lt;br /&gt;
            product //= arr[i - count]&lt;br /&gt;
            count -= 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_name = &amp;quot;produs2.in&amp;quot;&lt;br /&gt;
    with open(file_name, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        arr = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = count_sequences(n, p, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, p, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește trei parametri: n - numărul de elemente din șir, p - limita produsului și arr - lista de numere.&lt;br /&gt;
Verifică dacă valorile n și p se încadrează în intervalele valide specificate în cerință și dacă lungimea listei arr este egală cu n.&lt;br /&gt;
Verifică, de asemenea, dacă există vreun număr din lista arr care este mai mare sau egal cu 1000. Dacă da, se returnează False, semnalând că datele nu corespund restricțiilor impuse.&lt;br /&gt;
Dacă toate verificările sunt trecute cu succes, înseamnă că datele de intrare sunt valide, astfel că se returnează True.&lt;br /&gt;
Funcția count_sequences(n, p, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește trei parametri: n - numărul de elemente din șir, p - limita produsului și arr - lista de numere.&lt;br /&gt;
Verifică mai întâi validitatea datelor de intrare folosind funcția validate_input(n, p, arr). Dacă datele nu sunt valide, returnează un mesaj corespunzător.&lt;br /&gt;
Inițializează variabila count cu valoarea 0, care va fi utilizată pentru a număra secvențele cu produs mai mic decât p.&lt;br /&gt;
Inițializează variabila product cu valoarea 1, care reprezintă produsul curent al secvenței.&lt;br /&gt;
Parcurge lista arr și în fiecare pas înmulțește product cu elementul curent.&lt;br /&gt;
Verifică dacă product este mai mic decât p. Dacă da, înseamn&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0310_-_SecvPal&amp;diff=6494</id>
		<title>0310 - SecvPal</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0310_-_SecvPal&amp;diff=6494"/>
		<updated>2023-05-14T21:21:56Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/310/secvpal  0310 - SecvPal]&lt;br /&gt;
----&lt;br /&gt;
O secvenţă a unui vector se numeşte palindromică dacă primul element ale secvenţei este egal cu ultimul, al doilea cu penultimul, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Determinaţi secvenţa palindromică de lungime maximă.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare secvpal.in conţine pe prima linie numărul n; urmează cele n elemente ale vectorului, dispuse pe mai multe linii şi separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fişierul de ieşire secvpal.out va conţine:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; numerele p şi u, reprezentând indicii de început şi sfârşit ai secvenţei determinate&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000;&lt;br /&gt;
* numerele de pe a doua linie a fişierului de intrare vor avea cel mult 4 cifre;&lt;br /&gt;
* dacă există mai multe secvenţe palindromice de lungime maximă, se va determina cea mai din stânga;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvpal.in&lt;br /&gt;
: 12&lt;br /&gt;
: 1 2 10 9 8 5 8 9 10 5 5 10&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: secvpal.out&lt;br /&gt;
: 3 9 &lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvpal.in&lt;br /&gt;
: 99&lt;br /&gt;
: 9 2 8 4 7 1 23 37 7 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0310 - SecvPal&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_max_palindrome(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    max_length = 0&lt;br /&gt;
    start = 0&lt;br /&gt;
    end = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i, n):&lt;br /&gt;
            if arr[i:j+1] == arr[i:j+1][::-1] and len(arr[i:j+1]) &amp;gt; max_length:&lt;br /&gt;
                max_length = len(arr[i:j+1])&lt;br /&gt;
                start = i&lt;br /&gt;
                end = j&lt;br /&gt;
&lt;br /&gt;
    return f&amp;quot;{start + 1} {end + 1}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_name = &amp;quot;secvpal.in&amp;quot;&lt;br /&gt;
    with open(file_name, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        arr = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = find_max_palindrome(n, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, arr):&lt;br /&gt;
Această funcție primește doi parametri, n și arr, reprezentând numărul de elemente din vector (n) și vectorul în sine (arr).&lt;br /&gt;
Verifică dacă numărul n se află în intervalul valid, adică între 1 și 1000. Dacă nu este adevărată această condiție, returnează False, semnalând că datele nu corespund restricțiilor impuse.&lt;br /&gt;
Verifică dacă lungimea vectorului arr este egală cu n. Dacă această condiție nu este îndeplinită, returnează False.&lt;br /&gt;
Dacă toate verificările sunt trecute cu succes, înseamnă că datele de intrare sunt valide, astfel că returnează True.&lt;br /&gt;
Funcția find_max_palindrome(n, arr):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește doi parametri, n și arr, reprezentând numărul de elemente din vector (n) și vectorul în sine (arr).&lt;br /&gt;
Verifică mai întâi validitatea datelor de intrare folosind funcția validate_input(n, arr). Dacă datele nu sunt valide, returnează un mesaj corespunzător.&lt;br /&gt;
Inițializează variabilele max_length, start și end cu valorile 0. Acestea vor fi actualizate pe măsură ce se găsesc secvențe palindromice de lungime maximă.&lt;br /&gt;
Parcurge toate sub-secvențele posibile ale vectorului, utilizând două bucle for imbricate (i și j).&lt;br /&gt;
Verifică dacă sub-secvența curentă, arr[i:j+1], este un palindrom. Aceasta se realizează prin compararea sub-secvenței cu reversul său, arr[i:j+1][::-1].&lt;br /&gt;
Dacă sub-secvența este un palindrom și are o lungime mai mare decât max_length, se actualizează max_length cu noua valoare a lungimii, iar start și end cu indicii de început și sfârșit ai secvenței palindromice.&lt;br /&gt;
După parcurgerea tuturor sub-secvențelor, se returnează o frază formatată care indică indicii de început și sfârșit ai celei mai lungi secvențe palindromice găsite în vectorul dat.&lt;br /&gt;
În funcția if __name__ == &amp;quot;__main__&amp;quot;, se realizează citirea datelor de intrare din fișierul &amp;quot;secvpal.in&amp;quot; și se apelează funcția find_max_palindrome cu valorile citite. Rezultatul este apoi afișat pe ecran.&lt;br /&gt;
&lt;br /&gt;
Aceste funcții rezolvă problema cerută de determinare a celei mai lungi secvențe palindromice dintr-un vector&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2236_-_swap01&amp;diff=6492</id>
		<title>2236 - swap01</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2236_-_swap01&amp;diff=6492"/>
		<updated>2023-05-14T21:20:01Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/2236/swap01 2236 - swap01]&lt;br /&gt;
----&lt;br /&gt;
Se consideră un șir binar a[1], a[2], …, a[n]. Asupra șirului se poate efectua operația swap(i, j) prin care se interschimbă valorile a[i] și a[j].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine numărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații reprezentând elementele șirului binar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;umărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 14&lt;br /&gt;
: 1 0 0 1 0 1 1 0 1 0 0 0 1 0&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2 3 5&lt;br /&gt;
: 1 1 1 0 0 0 1 0 0 1 1 0 1 1 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 2236 - swap01&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_swaps(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Determinăm numărul de valori de 1 din șir&lt;br /&gt;
    count_ones = arr.count(1)&lt;br /&gt;
&lt;br /&gt;
    # Numărul minim de operații swap este diferența dintre lungimea șirului și numărul de valori de 1&lt;br /&gt;
    min_swaps = n - count_ones&lt;br /&gt;
&lt;br /&gt;
    return min_swaps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    result = count_swaps(n, arr)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Avem funcția validate_input care verifică dacă datele de intrare sunt valide. Verificăm dacă n se află în intervalul [1, 100000] și dacă lungimea listei arr este egală cu n.&lt;br /&gt;
&lt;br /&gt;
Funcția principală count_swaps primește numărul de elemente n și lista arr ca argumente. În primul rând, verificăm validitatea datelor de intrare folosind funcția validate_input. Apoi, numărăm numărul de valori de 1 din șir utilizând metoda count a listei. Numărul minim de operații swap este diferența dintre lungimea șirului n și numărul de valori de 1 count_ones.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &amp;quot;__main__&amp;quot;:, citim valorile de intrare n și arr folosind funcția input(). Apoi apelăm funcția count_swaps și afișăm rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4241_-_max2secv&amp;diff=6491</id>
		<title>4241 - max2secv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4241_-_max2secv&amp;diff=6491"/>
		<updated>2023-05-14T21:18:28Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/4241/max2secv - max2secv]&lt;br /&gt;
----&lt;br /&gt;
Se dă un șir a1, a2, …, an de numere întregi. Definim suma unei secvențe ai, ai+1, …, aj ca fiind suma elementelor sale, adică ai + ai+1 + ... + aj.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine suma maximă posibilă care se poate obține din două secvențe disjuncte din șir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi șirul de n numere întregi, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând suma maximă care se poate obține din două secvențe disjuncte&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ n ≤ 100.000&lt;br /&gt;
* -100 ≤ a[i] ≤ 100&lt;br /&gt;
* Două secvențe sunt disjuncte dacă nu au niciun element comun.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 6&lt;br /&gt;
: 2 -1 3 -8 4 -5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 8&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 1 2 3&lt;br /&gt;
: 77&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 4241 - max2secv&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, nums):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(nums) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;lt; -100 or num &amp;gt; 100 for num in nums):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_max_sum(n, nums):&lt;br /&gt;
    if not validate_input(n, nums):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    max_sum = float(&#039;-inf&#039;)&lt;br /&gt;
    for i in range(n-1):&lt;br /&gt;
        sum1 = sum(nums[:i+1])&lt;br /&gt;
        sum2 = sum(nums[i+1:])&lt;br /&gt;
        max_sum = max(max_sum, sum1 + sum2)&lt;br /&gt;
    &lt;br /&gt;
    return max_sum&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    nums = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    result = find_max_sum(n, nums)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
validate_input(n, nums): Această funcție primește numărul n și lista nums și verifică dacă datele de intrare sunt valide în conformitate cu restricțiile cerinței. Verificările efectuate sunt:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă n se află în intervalul [2, 100000]. Dacă nu, funcția returnează False.&lt;br /&gt;
Verifică dacă lungimea listei nums este egală cu n. Dacă nu, funcția returnează False.&lt;br /&gt;
Verifică dacă există cel puțin un element în lista nums care nu se încadrează în intervalul [-100, 100]. Dacă da, funcția returnează False.&lt;br /&gt;
Dacă toate verificările sunt îndeplinite, funcția returnează True, semnalând că datele sunt valide.&lt;br /&gt;
find_max_sum(n, nums): Această funcție primește numărul n și lista nums și determină suma maximă care se poate obține din două secvențe disjuncte din șir. Funcția inițializează max_sum cu o valoare extrem de mică (pentru a permite compararea și actualizarea corectă).&lt;br /&gt;
&lt;br /&gt;
Apoi, folosind o buclă for de la 0 la n-2, se calculează suma primelor i+1 elemente (sum1) și suma ultimelor n-i-1 elemente (sum2). Suma acestor două secvențe este calculată ca sum1 + sum2, iar rezultatul este actualizat dacă această sumă este mai mare decât max_sum. Astfel, se determină suma maximă posibilă.&lt;br /&gt;
&lt;br /&gt;
La final, funcția returnează max_sum, reprezentând suma maximă a două secvențe disjuncte.&lt;br /&gt;
&lt;br /&gt;
__main__: Această secțiune verifică dacă scriptul este executat direct (nu importat ca modul) și conține citirea datelor de intrare de la tastatură și apelarea funcției find_max_sum.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0297_-_SecvSumMax&amp;diff=6489</id>
		<title>0297 - SecvSumMax</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0297_-_SecvSumMax&amp;diff=6489"/>
		<updated>2023-05-14T21:17:20Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/297/secvsummax 0297 - SecvSumMax]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir cu n elemente, numere întregi. Determinați secvența de elemente cu suma maximă.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare secvsummax.in conține pe prima linie numărul n; urmează cele n elemente ale șirului, dispuse pe mai multe linii și separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire secvsummax.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; numerele p și u, separate printr-un spațiu, reprezentând poziția de început și de sfârșit a secvenței determinate&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* elementele șirului vor avea cel mult 4 cifre și sunt numerotate de la 1 la n&lt;br /&gt;
* dacă șirul conține mai multe secvențe de suma maximă, se va determina cea cu indicele de început cel mai mic, iar în caz de egalitate, cea mai scurtă&lt;br /&gt;
* șirul va conține cel puțin un element pozitiv&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvsummax.out&lt;br /&gt;
: 10&lt;br /&gt;
: -4 1 -5 1 4 -2 2 3 -4 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: secvsummax.out&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 4 8&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvsummax.out&lt;br /&gt;
: 67&lt;br /&gt;
: -1 2 3 -10 2 8 5 8 4 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0297 - SecvSumMax&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, nums):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(nums) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    if all(num &amp;lt;= 0 for num in nums):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_max_subsequence(n, nums):&lt;br /&gt;
    if not validate_input(n, nums):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    start, end = 0, 0&lt;br /&gt;
    max_sum = 0&lt;br /&gt;
    current_sum = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        current_sum += nums[i]&lt;br /&gt;
        if current_sum &amp;gt; max_sum:&lt;br /&gt;
            max_sum = current_sum&lt;br /&gt;
            end = i&lt;br /&gt;
        if current_sum &amp;lt; 0:&lt;br /&gt;
            current_sum = 0&lt;br /&gt;
            start = i + 1&lt;br /&gt;
&lt;br /&gt;
    return f&amp;quot;{start + 1} {end + 1}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_name = &amp;quot;secvsummax.in&amp;quot;&lt;br /&gt;
    with open(file_name, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        nums = []&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            nums.extend(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = find_max_subsequence(n, nums)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
validate_input(n, nums): Această funcție primește un număr n și o listă nums și validează datele de intrare în conformitate cu restricțiile impuse. Verificările efectuate sunt:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă n se află în intervalul [1, 100000]. Dacă nu se îndeplinește această condiție, funcția returnează False, semnalând că datele nu sunt valide.&lt;br /&gt;
Verifică dacă lungimea listei nums este egală cu n. Dacă lungimea nu este corectă, funcția returnează False.&lt;br /&gt;
Verifică dacă toate numerele din lista nums sunt mai mici sau egale cu 0. Dacă există cel puțin un număr mai mare decât 0, funcția returnează False.&lt;br /&gt;
Dacă toate aceste verificări sunt îndeplinite, funcția returnează True, semnalând că datele de intrare sunt valide.&lt;br /&gt;
find_max_subsequence(n, nums): Această funcție primește un număr n și o listă nums și aplică algoritmul pentru a găsi secvența de elemente cu suma maximă. Funcția începe prin apelarea funcției validate_input pentru a verifica validitatea datelor de intrare. Dacă datele nu sunt valide, funcția returnează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt valide, funcția inițializează variabilele start, end, max_sum și current_sum cu valorile inițiale 0. Apoi, parcurge lista nums folosind un buclă for și adaugă fiecare element la suma curentă current_sum. Dacă current_sum devine mai mare decât max_sum, actualizează max_sum cu current_sum și actualizează end la poziția curentă. Dacă current_sum devine mai mică decât 0, resetează-o la 0 și actualizează start la poziția curentă + 1.&lt;br /&gt;
&lt;br /&gt;
La finalul buclei, funcția returnează rezultatul sub forma unui șir format din start + 1 și end + 1. Adăugarea valorii 1 este necesară pentru a respecta numerotarea elementelor de la 1 la n.&lt;br /&gt;
&lt;br /&gt;
__main__: Această secțiune verifică dacă scriptul este executat direct (nu importat ca modul) și conține codul de citire a fișierului de intrare și apelarea funcției find_max_subsequence. Mai întâi, se deschide fișierul de intrare secvsummax.in în modul &amp;quot;r&amp;quot; (citire). Se citește prima linie pentru a obține valoarea lui n, iar apoi se citesc următoarele `n&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3939_-_Intervale6&amp;diff=6485</id>
		<title>3939 - Intervale6</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3939_-_Intervale6&amp;diff=6485"/>
		<updated>2023-05-14T21:14:43Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3939/intervale6 - Intervale6]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir n numere naturale separate prin câte un spațiu.&lt;br /&gt;
Se cere să se afișeze numărul de intervale care nu conțin niciun termen al șirului.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare intervale6.in conține:&lt;br /&gt;
* pe prima linie un număr n.&lt;br /&gt;
* pe a doua linie un șir de n numere.&lt;br /&gt;
* iar pe fiecare dintre următoarele linii, până la finalul fișierului, câte o pereche de numere, reprezentând extremitățile unui interval închis.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire intervale6.out va conține:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; umărul de intervale care nu conțin niciun termen al șirului aflat pe a doua linie a fișierului.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Fișierul intervale6.in conține numere naturale din intervalul [1, 10.000].&lt;br /&gt;
* Numerele aflate pe a doua linie a fișierului sunt în ordine crescătoare.&lt;br /&gt;
* Vor fi cel mult 200.000 de intervale&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: intervale6.in&lt;br /&gt;
: 5&lt;br /&gt;
: 4 8 9 16 25&lt;br /&gt;
: 1 3&lt;br /&gt;
: 2 5&lt;br /&gt;
: 9 15&lt;br /&gt;
: 5 7&lt;br /&gt;
: 20 100&lt;br /&gt;
: 10 12&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: intervale6.out&lt;br /&gt;
: 3&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: intervale6.in&lt;br /&gt;
: 2 1&lt;br /&gt;
: 1 2 3 4 8 9 16 25&lt;br /&gt;
: 2 6 &lt;br /&gt;
: 9 1&lt;br /&gt;
: 9 15&lt;br /&gt;
: 11 23&lt;br /&gt;
: 25 70&lt;br /&gt;
: 10 12&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3939 - Intervale6&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, sir, intervale):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 10000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if len(sir) != n or any(sir[i] &amp;gt;= sir[i+1] for i in range(n-1)):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if len(intervale) &amp;gt; 200000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_intervale(n, sir, intervale):&lt;br /&gt;
    if not validate_input(n, sir, intervale):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    termene_sir = set(sir)&lt;br /&gt;
    numar_intervale_fara_termene = 0&lt;br /&gt;
&lt;br /&gt;
    for i, j in intervale:&lt;br /&gt;
        interval_are_termen = False&lt;br /&gt;
        for termen in sir:&lt;br /&gt;
            if i &amp;lt;= termen &amp;lt;= j:&lt;br /&gt;
                interval_are_termen = True&lt;br /&gt;
                break&lt;br /&gt;
        if not interval_are_termen:&lt;br /&gt;
            numar_intervale_fara_termene += 1&lt;br /&gt;
&lt;br /&gt;
    return numar_intervale_fara_termene&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;intervale6.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        sir = list(map(int, fin.readline().split()))&lt;br /&gt;
        intervale = []&lt;br /&gt;
        for line in fin.readlines():&lt;br /&gt;
            i, j = map(int, line.split())&lt;br /&gt;
            intervale.append((i, j))&lt;br /&gt;
&lt;br /&gt;
    rezultat = numar_intervale(n, sir, intervale)&lt;br /&gt;
&lt;br /&gt;
    if isinstance(rezultat, str):&lt;br /&gt;
        print(rezultat)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, sir, intervale): Această funcție primește parametrii n, sir și intervale și are rolul de a valida datele de intrare conform restricțiilor impuse în cerință. Verificările includ:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă n se încadrează în intervalul permis (1 ≤ n ≤ 10,000).&lt;br /&gt;
Verifică dacă sir are lungimea n și este ordonat în mod crescător.&lt;br /&gt;
Verifică dacă numărul de intervale intervale este mai mic sau egal cu 200,000.&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția numar_intervale(n, sir, intervale): Această funcție primește datele de intrare n, sir și intervale și rezolvă problema în conformitate cu cerințele. Algoritmul funcției este următorul:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă datele de intrare sunt valide utilizând funcția validate_input. Dacă nu sunt valide, funcția returnează un mesaj de eroare.&lt;br /&gt;
Creează un set termene_sir care conține toate numerele din sir.&lt;br /&gt;
Inițializează variabila numar_intervale_fara_termene cu 0, care va reprezenta numărul de intervale care nu conțin niciun termen din sir.&lt;br /&gt;
Pentru fiecare interval din lista intervale, verifică dacă există cel puțin un termen din sir în interval. Dacă nu există, incrementăm numar_intervale_fara_termene.&lt;br /&gt;
Returnează numar_intervale_fara_termene.&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: Acest bloc de cod verifică dacă scriptul Python este rulat direct (nu importat ca modul în alt script). În acest caz, citirea datelor de intrare se face din fișierul &amp;quot;intervale6.in&amp;quot; și se apelează funcția numar_intervale pentru a rezolva problema. Rezultatul este afișat în consolă.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0190_-_Oglindiri&amp;diff=6483</id>
		<title>0190 - Oglindiri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0190_-_Oglindiri&amp;diff=6483"/>
		<updated>2023-05-14T21:11:56Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/190/oglindiri 0190 - Oglindiri]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente numere naturale, numerotate de la 1 la n, și m perechi de indici (i,j), cu 1≤i&amp;lt;j≤n. Fiecare secvență de elemente determinată de o pereche (i,j) se oglindește – primul elemente din secvență se interschimbă cu ultimul, al doilea cu penultimul, etc..&lt;br /&gt;
&lt;br /&gt;
Să se afișeze elementele vectorului după realizarea, în ordine, a celor m oglindiri.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare oglindiri.in conţine pe prima linie numărul n, iar pe a doua linie cele n elemente ale vectorului. Următoarea linie conține numărul m, iar următoarele m linii câte o pereche de indici i j.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fişierul de ieşire oglindiri.out va conţine:&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; n elemente ale vectorul obținute după cele m oglindiri, separate prin câte un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100&lt;br /&gt;
* numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000&lt;br /&gt;
* 1 ≤ m ≤ 100&lt;br /&gt;
== Exemplu 1  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: oglindiri.in&lt;br /&gt;
: 10&lt;br /&gt;
: 55 50 16 37 66 44 31 24 10 63 &lt;br /&gt;
: 3&lt;br /&gt;
: 5 8 &lt;br /&gt;
: 2 6 &lt;br /&gt;
: 6 10 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: oglindiri.out&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 55 31 24 37 16 63 10 66 44 50 &lt;br /&gt;
&lt;br /&gt;
== Exemplu 2  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: oglindiri.in&lt;br /&gt;
: 2&lt;br /&gt;
: 55 50 16 37 66 44 31 24 10 63 &lt;br /&gt;
: 3 2 1 &lt;br /&gt;
: 51  8 &lt;br /&gt;
: 22  6 &lt;br /&gt;
: 68  10 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0190 - Oglindiri&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, vector, m, perechi):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100 or m &amp;lt; 1 or m &amp;gt; 100:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if len(vector) != n or any(num &amp;gt;= 1000 for num in vector):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if any(i &amp;gt;= j or i &amp;lt;= 0 or j &amp;gt; n for i, j in perechi):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def oglindiri(n, vector, m, perechi):&lt;br /&gt;
    if not validate_input(n, vector, m, perechi):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for i, j in perechi:&lt;br /&gt;
        i -= 1&lt;br /&gt;
        j -= 1&lt;br /&gt;
        while i &amp;lt; j:&lt;br /&gt;
            vector[i], vector[j] = vector[j], vector[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            j -= 1&lt;br /&gt;
&lt;br /&gt;
    return vector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;oglindiri.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        vector = list(map(int, fin.readline().split()))&lt;br /&gt;
        m = int(fin.readline())&lt;br /&gt;
        perechi = []&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            i, j = map(int, fin.readline().split())&lt;br /&gt;
            perechi.append((i, j))&lt;br /&gt;
&lt;br /&gt;
    rezultat = oglindiri(n, vector, m, perechi)&lt;br /&gt;
&lt;br /&gt;
    if isinstance(rezultat, str):&lt;br /&gt;
        print(rezultat)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        print(&amp;quot; &amp;quot;.join(str(num) for num in rezultat))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(n, vector, m, perechi): Această funcție primește parametrii n, vector, m și perechi și are rolul de a valida datele de intrare conform restricțiilor impuse în cerință. Verificările includ:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă n și m se încadrează în intervalul permis (1 ≤ n, m ≤ 100).&lt;br /&gt;
Verifică dacă lungimea listei vector este egală cu n și dacă toate numerele din vector sunt mai mici decât 1000.&lt;br /&gt;
Verifică dacă toate perechile (i, j) din lista perechi satisfac restricțiile: 1 ≤ i &amp;lt; j ≤ n.&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția oglindiri(n, vector, m, perechi): Această funcție primește datele de intrare n, vector, m și perechi și rezolvă problema în conformitate cu cerințele. Algoritmul funcției este următorul:&lt;br /&gt;
&lt;br /&gt;
Verifică dacă datele de intrare sunt valide utilizând funcția validate_input. Dacă nu sunt valide, funcția returnează un mesaj de eroare.&lt;br /&gt;
Pentru fiecare pereche (i, j) din lista perechi:&lt;br /&gt;
Aduce indicii i și j la forma corectă pentru indexarea în Python (scăzând 1 din fiecare).&lt;br /&gt;
Realizează oglindirea în lista vector între indicii i și j, prin interschimbarea elementelor în mod repetat până când indicii se întâlnesc.&lt;br /&gt;
Returnează lista vector obținută după efectuarea oglindirilor.&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;: Acest bloc de cod verifică dacă scriptul Python este rulat direct (nu importat ca modul în alt script). În acest caz, citirea datelor de intrare se face din fișierul &amp;quot;oglindiri.in&amp;quot; și se apelează funcția oglindiri pentru a rezolva problema. Rezultatul este afișat în consolă.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0283_-_Secventa&amp;diff=6479</id>
		<title>0283 - Secventa</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0283_-_Secventa&amp;diff=6479"/>
		<updated>2023-05-14T21:07:56Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/283/secventa - Secventa]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir cu n elemente, numere naturale. Determinaţi cea mai lungă secvenţă de elemente din şir cu proprietatea că oricare două valori consecutive în secvenţă au parităţi diferite.&lt;br /&gt;
&lt;br /&gt;
Dacă există mai multe secvente de lungime maximă cu această proprietate, se va determina aceea cu suma elementelor maximă. Dacă există mai multe secvenţe de lungime maximă cu aceeaşi sumă maximă a elementelor se va determina cea mai din dreapta.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare secventa.in conţine pe prima linie numărul n; urmează cele n elemente ale şirului, dispuse pe mai multe linii şi separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fişierul de ieşire secventa.out va conţine &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; două numere p şi u, separate printr-un spaţiu, reprezentând indicele primului, respectiv al ultimului element din secvenţa determinată&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000;&lt;br /&gt;
* elementele şirului vor avea cel mult 9 cifre şi sunt numerotate de la 1 la n;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secventa.in&lt;br /&gt;
: 10&lt;br /&gt;
: 2 4 3 6 7 5 2 5 8 10&lt;br /&gt;
; Ieșire&lt;br /&gt;
: secventa.out&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 6 9&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secventa.in&lt;br /&gt;
: 10 2 3 4 &lt;br /&gt;
: 1 9 22 13 5 2 5 8 10&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0283 - Secventa&lt;br /&gt;
def rezolvare(n, a):&lt;br /&gt;
    p = u = -1&lt;br /&gt;
    max_lungime = max_suma = 0&lt;br /&gt;
&lt;br /&gt;
    # Cautam secventa maximă&lt;br /&gt;
    lungime_secventa = suma_elementelor = 1&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if a[i] % 2 == a[i-1] % 2:&lt;br /&gt;
            lungime_secventa = 1&lt;br /&gt;
            suma_elementelor = a[i]&lt;br /&gt;
        else:&lt;br /&gt;
            lungime_secventa += 1&lt;br /&gt;
            suma_elementelor += a[i]&lt;br /&gt;
            if lungime_secventa &amp;gt; max_lungime or (lungime_secventa == max_lungime and suma_elementelor &amp;gt; max_suma):&lt;br /&gt;
                max_lungime = lungime_secventa&lt;br /&gt;
                max_suma = suma_elementelor&lt;br /&gt;
                p = i - lungime_secventa + 1&lt;br /&gt;
                u = i&lt;br /&gt;
&lt;br /&gt;
    return p, u&lt;br /&gt;
&lt;br /&gt;
def validare(p, u):&lt;br /&gt;
    with open(&amp;quot;secventa.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        if p == -1:&lt;br /&gt;
            f.write(&amp;quot;-1\n&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            f.write(f&amp;quot;{p+1} {u+1}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;secventa.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
            n = int(f.readline())&lt;br /&gt;
            a = list(map(int, f.readline().split()))&lt;br /&gt;
        if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
            raise ValueError(&amp;quot;Numarul n nu se incadreaza in limitele problemei.&amp;quot;)&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if a[i] &amp;lt; 0 or a[i] &amp;gt; 999999999:&lt;br /&gt;
                raise ValueError(&amp;quot;Elementele sirului trebuie sa fie numere naturale de cel mult 9 cifre.&amp;quot;)&lt;br /&gt;
        p, u = rezolvare(n, a)&lt;br /&gt;
        if p != -1 and u != -1:&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        validare(p, u)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția de rezolvare, rezolvare(n, a), care primește ca parametri numărul de elemente din șir n și șirul propriu-zis a. Scopul acestei funcții este de a determina cea mai lungă secvență cu proprietatea specificată în enunț și de a returna pozițiile primului și ultimului element din această secvență.&lt;br /&gt;
&lt;br /&gt;
Această funcție începe prin a inițializa variabilele p și u cu valoarea -1, semnificând faptul că încă nu am găsit nicio secvență cu proprietatea specificată. De asemenea, funcția mai inițializează două variabile max_lungime și max_suma cu valoarea 0, care vor fi folosite pentru a determina secvența maximă în ceea ce privește lungimea și suma elementelor.&lt;br /&gt;
&lt;br /&gt;
În continuare, se parcurge șirul a și se calculează lungimea și suma elementelor din secvența curentă, utilizând variabilele lungime_secventa și suma_elementelor. Dacă se întâlnește un element cu paritatea identică cu elementul anterior, secvența curentă se întrerupe și se inițializează lungimea și suma elementelor pentru o nouă secvență începând cu elementul curent. În caz contrar, se actualizează lungimea și suma elementelor din secvența curentă, și se compară aceste valori cu cele ale secvenței maximale găsite până în acel moment (max_lungime și max_suma). Dacă lungimea secvenței curente depășește lungimea secvenței maxime găsite până în acel moment, sau are lungime egală cu aceasta dar suma elementelor este mai mare, atunci secvența curentă devine noua secvență maximă și se actualizează variabilele max_lungime și max_suma. În plus, se actualizează și variabilele p și u cu pozițiile primului și ultimului element din secvența curentă, dacă este cazul.&lt;br /&gt;
&lt;br /&gt;
Funcția de rezolvare returnează apoi variabilele p și u.&lt;br /&gt;
&lt;br /&gt;
Funcția de validare, validare(p, u), primește ca parametri pozițiile primului și ultimului element din secvența maximă găsită de funcția rezolvare, și are rolul de a scrie aceste valori în fișierul de ieșire secventa.out. Dacă nu s-a găsit nicio secvență cu proprietatea specificată, funcția va scrie -1 în fișierul de ieșire.&lt;br /&gt;
&lt;br /&gt;
În funcția principală if __name__ == &amp;quot;__main__&amp;quot;, începem prin citirea datelor de intrare din fișierul `secventa.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3357_-_beta&amp;diff=6474</id>
		<title>3357 - beta</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3357_-_beta&amp;diff=6474"/>
		<updated>2023-05-14T21:03:57Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3357/beta3357 - beta]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un număr natural n despre care se cunoaște că este putere de 2. Considerăm inițial șirul numerelor naturale de la 1 la n așezate în ordine crescătoare. Notăm cu A acest șir. Pornind de la acesta, se construiește un nou șir (să îl notăm cu B) astfel: Primele n elemente ale lui B sunt chiar elementele șirului A în aceeași ordine. Următoarele n/2 elemente ale lui B sunt ultimele n/2 elemente ale lui A dar scrise în ordine inversă (descrescător). Următoarele n/4 elemente ale lui B sunt ultimele n/4 elemente ale lui A scrise în ordine crescătoare, următoarele n/8 elemente ale lui B sunt ultimele n/8 elemente ale lui A scrise în ordine descrescătoare, și tot așa, cu fiecare putere de 2 (notată p) ce apare la numitor, luăm ultimele n/p elemente din A și le adăugăm la finalul lui B alternând ordinea de parcurgere, de la o putere la alta conform modului descris mai sus. Se mai să un număr poz. Se cere determinarea numărului de pe poziția poz din șirul B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul beta.in conține pe prima linie numerele naturale n și poz separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
 &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi &#039;&#039;&#039; fișierul beta.out va conține valoarea cerută. Dacă șirul B are mai puțin de poz elemente se va scrie în fișier -1.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000.000&lt;br /&gt;
* n se dă putere de 2&lt;br /&gt;
* 1 ≤ poz ≤ 2.000.000.000&lt;br /&gt;
* Pentru 55 de puncte avem n ≤ 100.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: beta.in&lt;br /&gt;
: 8 13&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: beta.out&lt;br /&gt;
: 7&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: beta.in&lt;br /&gt;
: 8 25&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3357 - beta&lt;br /&gt;
def calc_b(n, k):&lt;br /&gt;
    b = list(range(1, n+1))&lt;br /&gt;
    p = n&lt;br /&gt;
    while p &amp;gt; 1:&lt;br /&gt;
        p //= 2&lt;br /&gt;
        q = n // p&lt;br /&gt;
        r = n % p&lt;br /&gt;
        if r == 0:&lt;br /&gt;
            r = p&lt;br /&gt;
            q -= 1&lt;br /&gt;
        start = n - q*p + 1&lt;br /&gt;
        end = start + r - 1&lt;br /&gt;
        if q % 2 == 1:&lt;br /&gt;
            b.extend(reversed(range(start, end+1)))&lt;br /&gt;
        else:&lt;br /&gt;
            b.extend(range(start, end+1))&lt;br /&gt;
    return b&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 10**5 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;beta.in&#039;, &#039;r&#039;) as f_in, open(&#039;beta.out&#039;, &#039;w&#039;) as f_out:&lt;br /&gt;
        n, k = map(int, f_in.readline().split())&lt;br /&gt;
        if not validate_input(n, k):&lt;br /&gt;
            f_out.write(&#039;-1\n&#039;)&lt;br /&gt;
            print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            b = calc_b(n, k)&lt;br /&gt;
            f_out.write(f&#039;{b[k-1]}\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
Funcția `calc_b` primește două argumente: `n`, care este numărul dat, și `k`, care este poziția cerută în șirul `B`. Funcția începe prin construirea șirului `A`, care este un șir ordonat de la 1 la `n`. Apoi se împarte `n` la 2, apoi la 4, apoi la 8, și așa mai departe, până când nu se mai poate împărți. Se păstrează ultimele `n/p` elemente din șirul `A`, și acestea sunt adăugate la șirul `B` în ordinea cerută. Dacă `n` nu se divide exact la `p`, atunci se ia o bucată mai mică din șirul `A` și se adaugă la șirul `B` în ordinea cerută. Funcția se termină returnând șirul `B`.&lt;br /&gt;
&lt;br /&gt;
Funcția `validate_input` primește aceiași doi parametri ca și `calc_b` și verifică dacă aceștia îndeplinesc condițiile date în enunțul problemei. Dacă nu se îndeplinesc, returnează `False`, altfel returnează `True`.&lt;br /&gt;
&lt;br /&gt;
Funcția `main` citește datele de intrare din fișierul `beta.in`, validează datele, calculează șirul `B` folosind funcția `calc_b`, și scrie în fișierul `beta.out` numărul de pe poziția `k` din șirul `B`. Dacă datele nu sunt valide, se scrie `-1` în fișierul `beta.out` și se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2073_-_PlatouK_v2&amp;diff=6472</id>
		<title>2073 - PlatouK v2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2073_-_PlatouK_v2&amp;diff=6472"/>
		<updated>2023-05-14T21:02:15Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/2073/platouk-v2 - PlatouK v2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat un șir de numere, numim secvenţă a acestuia o parte dintre termenii şirului luaţi de pe poziţii consecutive. Denumim platou al acestui şir o secvenţă formată din valori identice. Lungimea unui platou este egală cu numărul de elemente care îl formează.&lt;br /&gt;
&lt;br /&gt;
De exemplu, în şirul de numere 1 1 1 7 7 3 4 4 4 7 7 avem:&lt;br /&gt;
&lt;br /&gt;
platourile 1 1 1 şi 4 4 4 ambele având lungimea 3;&lt;br /&gt;
platourile 7 7 (cel care începe în poziţia a patra) şi 7 7 (cel care începe pe poziţia a zecea), ambele având lungimea 2;&lt;br /&gt;
platoul 3 care are lungimea 1.&lt;br /&gt;
În schimb nu avem platoul 7 7 7 7 deoarece cele patru elemente egale cu 7 nu sunt pe poziţii consecutive!&lt;br /&gt;
&lt;br /&gt;
Asupra unui şir se poate efectua următoarea operaţiune:&lt;br /&gt;
&lt;br /&gt;
se extrage un platou la alegere;&lt;br /&gt;
se inserează platoul extras la pasul anterior într-o poziţie la alegere din şirul rezultat după extragere.&lt;br /&gt;
De exemplu, dacă avem următorul şir inițial: 2 2 5 0 5 8 8 8 4 9 9 9 0 0 2 2 8 extragem platoul 2 2 format din elementele aflate în penultima şi antepenultima poziţie şi obţinem şirul: 2 2 5 0 5 8 8 8 4 9 9 9 0 0 8&lt;br /&gt;
&lt;br /&gt;
În şirul rezultat inserăm platoul 2 2 (pe care l-am extras în pasul anterior) în poziţia a doua şi obţinem şirul: 2 2 2 2 5 0 5 8 8 8 4 9 9 9 0 0 8.&lt;br /&gt;
Să se scrie un program care citește un șir de n numere naturale din intervalul [0,10000] și un număr k și determină:&lt;br /&gt;
&lt;br /&gt;
lungimea maximă a unui platou care poate să apară în şir în urma efectuării operaţiunii de mai sus de maxim k ori&lt;br /&gt;
elementul din care este format platoul obținut după cele k operațiuni&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul va citi:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie un număr natural k;&lt;br /&gt;
* pe a doua linie un număr natural n;&lt;br /&gt;
* pe a treia linie un şir de n numere naturale separate prin câte un spaţiu.&lt;br /&gt;
* pe a patra linie p, care reprezinta cerința; p poate fi 1 sau 2&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul c&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000000&lt;br /&gt;
* 1 ≤ k ≤ 100&lt;br /&gt;
* pentru cerința 1 – 50% din punctaj&lt;br /&gt;
* pentru cerința 2 – 50% din punctaj&lt;br /&gt;
* dacă sunt mai multe platouri de lungime maxima se va afișa cel mai mare considera cel format din valoarea cea mai mare&lt;br /&gt;
toate testele au soluție&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 16 &lt;br /&gt;
: 2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2&lt;br /&gt;
: 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 6&lt;br /&gt;
: 2 2 2 3 3 3&lt;br /&gt;
: 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 2073 - PlatouK v2&lt;br /&gt;
&lt;br /&gt;
def validate_input(k, n, arr):&lt;br /&gt;
    if not 1 &amp;lt;= k &amp;lt;= 100 or not 1 &amp;lt;= n &amp;lt;= 1000000:&lt;br /&gt;
        return False&lt;br /&gt;
    if len(arr) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in arr:&lt;br /&gt;
        if not 0 &amp;lt;= i &amp;lt;= 10000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_longest_plateau(k, arr):&lt;br /&gt;
    n = len(arr)&lt;br /&gt;
    longest_plateau = 0&lt;br /&gt;
    plateau_element = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        j = i + 1&lt;br /&gt;
        while j &amp;lt; n and arr[i] == arr[j]:&lt;br /&gt;
            j += 1&lt;br /&gt;
        plateau_len = j - i&lt;br /&gt;
        if plateau_len &amp;gt; longest_plateau:&lt;br /&gt;
            longest_plateau = plateau_len&lt;br /&gt;
            plateau_element = arr[i]&lt;br /&gt;
&lt;br /&gt;
    return longest_plateau, plateau_element&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve(k, n, arr):&lt;br /&gt;
    if not validate_input(k, n, arr):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(k):&lt;br /&gt;
        plateau_len, plateau_element = find_longest_plateau(1, arr)&lt;br /&gt;
        if plateau_len == 0:&lt;br /&gt;
            break&lt;br /&gt;
        arr.remove(plateau_element)&lt;br /&gt;
        _, new_element = find_longest_plateau(1, arr)&lt;br /&gt;
        arr.insert(arr.index(new_element) + 1, plateau_element)&lt;br /&gt;
&lt;br /&gt;
    plateau_len, plateau_element = find_longest_plateau(1, arr)&lt;br /&gt;
    print(plateau_len)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    k = int(input())&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
    p = int(input())&lt;br /&gt;
&lt;br /&gt;
    if p == 1:&lt;br /&gt;
        solve(k, n, arr)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
validare(n, k, sir, cerinta) - Aceasta este o funcție de validare care primește ca parametri: n - numărul de elemente din șir, k - numărul maxim de operații permise, sir - lista cu elemente din șir și cerinta - un intreg care specifica cerinta (1 sau 2). Funcția validează inputul și returnează True dacă valorile de intrare sunt corecte, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
lungime_platou(platou) - Această funcție primește ca parametru un platou, adică o secvență formată din valori identice. Funcția calculează și returnează lungimea platoului, adică numărul de elemente care îl formează.&lt;br /&gt;
&lt;br /&gt;
rezolva(sir, k) - Această funcție primește ca parametri: sir - lista cu elemente din șir și k - numărul maxim de operații permise. Funcția calculează lungimea maximă a unui platou care poate să apară în șir în urma efectuării operației de maxim k ori și elementul din care este format platoul obținut după cele k operații și returnează aceste valori.&lt;br /&gt;
&lt;br /&gt;
main() - Aceasta este funcția principală a programului, care se execută atunci când rulăm scriptul. Funcția citeste input-ul de la utilizator, validează inputul și apoi calculează și afișează rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3796_-_qtsume&amp;diff=6468</id>
		<title>3796 - qtsume</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3796_-_qtsume&amp;diff=6468"/>
		<updated>2023-05-14T21:00:29Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3796/qtsume 3796 - qtsume]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector A cu N numere naturale. Pentru Q întrebări de forma (x, y) aflați rezultatul sumei A[x] + 2 * A[x + 1] + ... + (y - x + 1) * A[y].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare qtsume.in conține pe prima linie numărul N, iar pe a doua linie N numere naturale separate prin spații, reprezentând vectorul A. Pe următoarea linie se află numărul Q. Urmează Q linii, pe fiecare linie se află două numere naturale separate printr-un spațiu reprezentând x și y.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fișierul de ieșire qtsume.out va conține &lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul c&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N, Q ≤ 100.000&lt;br /&gt;
* 1 ≤ A[i] ≤ 1.000.000&lt;br /&gt;
* 1 ≤ x ≤ y ≤ N &lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 3 1 2 3 5&lt;br /&gt;
: 3&lt;br /&gt;
: 1 2&lt;br /&gt;
: 1 5&lt;br /&gt;
: 2 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: : 5&lt;br /&gt;
: 48&lt;br /&gt;
: 14&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 100000&lt;br /&gt;
: 1 2 3 4 5 6 7 8 9 10&lt;br /&gt;
: 100000&lt;br /&gt;
: 1 100001&lt;br /&gt;
: 1 50000&lt;br /&gt;
: 50001 100000&lt;br /&gt;
: 3 3&lt;br /&gt;
: 50000 50000&lt;br /&gt;
: 100000 100000&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3796 - qtsume&lt;br /&gt;
&lt;br /&gt;
def validate_input(N, Q, A, intrebari):&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000 and 1 &amp;lt;= Q &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    for a in A:&lt;br /&gt;
        if not (1 &amp;lt;= a &amp;lt;= 1000000):&lt;br /&gt;
            return False&lt;br /&gt;
    for x, y in intrebari:&lt;br /&gt;
        if not (1 &amp;lt;= x &amp;lt;= y &amp;lt;= N):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def solve(N, A, intrebari):&lt;br /&gt;
    result = []&lt;br /&gt;
    for x, y in intrebari:&lt;br /&gt;
        s = 0&lt;br /&gt;
        for i in range(x-1, y):&lt;br /&gt;
            s += (i-x+2) * A[i]&lt;br /&gt;
        result.append(s)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citire date de intrare&lt;br /&gt;
    with open(&amp;quot;qtsume.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline().strip())&lt;br /&gt;
        A = list(map(int, fin.readline().split()))&lt;br /&gt;
        Q = int(fin.readline().strip())&lt;br /&gt;
        intrebari = [tuple(map(int, line.strip().split())) for line in fin.readlines()]&lt;br /&gt;
&lt;br /&gt;
    # Verificare date de intrare&lt;br /&gt;
    if not validate_input(N, Q, A, intrebari):&lt;br /&gt;
        with open(&amp;quot;qtsume.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Rezolvare problema&lt;br /&gt;
        result = solve(N, A, intrebari)&lt;br /&gt;
&lt;br /&gt;
        # Scriere rezultat&lt;br /&gt;
        with open(&amp;quot;qtsume.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
            for s in result:&lt;br /&gt;
                fout.write(str(s) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input(N, Q, A, intrebari) primește ca parametrii numărul de elemente din vectorul A, numărul de întrebări, vectorul A și o listă cu perechi de întrebări. Funcția verifică dacă datele de intrare corespund restricțiilor impuse și returnează True dacă da și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția solve(N, A, intrebari) primește ca parametrii numărul de elemente din vectorul A, vectorul A și o listă cu perechi de întrebări. Funcția rezolvă problema conform cerințelor și returnează o listă cu valorile cerute pentru fiecare întrebare.&lt;br /&gt;
&lt;br /&gt;
În if __name__ == &amp;quot;__main__&amp;quot;: se citesc datele de intrare din fișierul &amp;quot;qtsume.in&amp;quot; și se verifică dacă acestea sunt corecte folosind funcția validate_input(). În cazul în care datele sunt corecte, se rezolvă problema cu ajutorul funcției solve() și se scrie rezultatul în fișierul &amp;quot;qtsume.out&amp;quot;. În caz contrar, se scrie un mesaj corespunzător în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2026_-_PlatouK&amp;diff=6465</id>
		<title>2026 - PlatouK</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2026_-_PlatouK&amp;diff=6465"/>
		<updated>2023-05-14T20:58:47Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/2026/platouk - PlatouK]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat un şir de numere, denumim secvenţă a acestuia o parte dintre termenii şirului luaţi de pe poziţii consecutive. Denumim platou al acestui şir o secvenţă formată din valori identice. Lungimea unui platou este egală cu numărul de elemente care îl formează.&lt;br /&gt;
&lt;br /&gt;
De exemplu, în şirul de numere 1 1 1 7 7 3 4 4 4 7 7 avem:&lt;br /&gt;
&lt;br /&gt;
platourile 1 1 1 şi 4 4 4 ambele având lungimea 3;&lt;br /&gt;
platourile 7 7 (cel care începe în poziţia a patra) şi 7 7 (cel care începe pe poziţia a zecea), ambele având lungimea 2;&lt;br /&gt;
platoul 3 care are lungimea 1.&lt;br /&gt;
În schimb nu avem platoul 7 7 7 7 deoarece cele patru elemente egale cu 7 nu sunt pe poziţii consecutive!&lt;br /&gt;
&lt;br /&gt;
Se dă un şir de n numere. Asupra acestui şir se pot efectua o singură dată următoarele două operaţiuni în această ordine:&lt;br /&gt;
&lt;br /&gt;
se extrage un platou la alegere;&lt;br /&gt;
se inserează platoul extras la pasul anterior într-o poziţie la alegere din şirul rezultat după extragere.&lt;br /&gt;
De exemplu, dacă avem următorul şir inițial: 2 2 5 0 5 8 8 8 4 9 9 9 0 0 2 2 8 extragem platoul 2 2 format din elementele aflate în penultima şi antepenultima poziţie şi obţinem şirul: 2 2 5 0 5 8 8 8 4 9 9 9 0 0 8&lt;br /&gt;
&lt;br /&gt;
În şirul rezultat inserăm platoul 2 2 (pe care l-am extras în pasul anterior) în poziţia a doua şi obţinem şirul: 2 2 2 2 5 0 5 8 8 8 4 9 9 9 0 0 8&lt;br /&gt;
&lt;br /&gt;
Să se scrie un program care pentru un şir dat determina:&lt;br /&gt;
1: lungimea maximă a unui platou care poate să apară în şir în urma efectuării celor două operaţiuni de maxim k ori&lt;br /&gt;
2: elementul din care este format platoul&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul va citi:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie un număr natural k;&lt;br /&gt;
* pe a doua linie un număr natual n;&lt;br /&gt;
* pe a treia linie un şir de n numere naturale separate prin câte un spaţiu, reprezentând elementele şirului dat. Fiecare dintre aceste &lt;br /&gt;
  numere aparţine intervalului [0,10000].&lt;br /&gt;
* pe a patra linie p, care reprezinta cerinta&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;lungimea maximă a unui platou care poate să apară în şir în urma efectuării celor două operaţiuni de maxim k ori sau elementul din care este format platoul.&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000000&lt;br /&gt;
* 1 ≤ k ≤ 100&lt;br /&gt;
* numerele aparțin intervalului [0,10000].&lt;br /&gt;
* pentru cerinta 1 – 50% din punctaj&lt;br /&gt;
* pentru cerinta 2 – 50% din punctaj&lt;br /&gt;
* daca sunt mai multe numere care au platou de lungime maxima se va afisa cel mai mare&lt;br /&gt;
* toate testele au solutie&lt;br /&gt;
crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 16 &lt;br /&gt;
: 2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2&lt;br /&gt;
: 1 &lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
; Ieșire&lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 5&lt;br /&gt;
: 3 3 3 4 4&lt;br /&gt;
: 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 2026 - PlatouK&lt;br /&gt;
def validate_input(k, n, sequence):&lt;br /&gt;
    # Verifică dacă datele de intrare sunt corecte&lt;br /&gt;
    if not 1 &amp;lt;= k &amp;lt;= 100 or not 1 &amp;lt;= n &amp;lt;= 1000000 or not all(0 &amp;lt;= x &amp;lt;= 10000 for x in sequence):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_longest_plateau(k, sequence):&lt;br /&gt;
    longest_plateau_length = 0&lt;br /&gt;
    longest_plateau_element = None&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(sequence)):&lt;br /&gt;
        # Verifică dacă putem efectua operațiunea de extragere/inserare de cel puțin o dată&lt;br /&gt;
        if k &amp;gt;= i:&lt;br /&gt;
            # Extrage platoul din secvență&lt;br /&gt;
            plateau = []&lt;br /&gt;
            j = i&lt;br /&gt;
            while j &amp;lt; len(sequence) and (not plateau or sequence[j] == plateau[0]):&lt;br /&gt;
                plateau.append(sequence[j])&lt;br /&gt;
                j += 1&lt;br /&gt;
            plateau_length = len(plateau)&lt;br /&gt;
&lt;br /&gt;
            # Verifică dacă putem efectua operațiunea de extragere/inserare de cel puțin încă o dată&lt;br /&gt;
            if k &amp;gt;= i + plateau_length:&lt;br /&gt;
                # Inserează platoul în secvență și calculează lungimea platoului rezultat&lt;br /&gt;
                new_sequence = sequence[:i] + sequence[i+plateau_length:]&lt;br /&gt;
                for l in range(i, len(new_sequence)):&lt;br /&gt;
                    new_sequence.insert(l, plateau[0])&lt;br /&gt;
                    k_left = k - (i + plateau_length)&lt;br /&gt;
                    while k_left &amp;gt;= l + plateau_length:&lt;br /&gt;
                        new_sequence = new_sequence[:l+plateau_length] + plateau + new_sequence[l+plateau_length:]&lt;br /&gt;
                        k_left -= (l + plateau_length)&lt;br /&gt;
&lt;br /&gt;
                result_plateau = []&lt;br /&gt;
                j = 0&lt;br /&gt;
                while j &amp;lt; len(new_sequence):&lt;br /&gt;
                    # Calculează lungimea platoului format din elementul curent&lt;br /&gt;
                    plateau = []&lt;br /&gt;
                    while j &amp;lt; len(new_sequence) and (not plateau or new_sequence[j] == plateau[0]):&lt;br /&gt;
                        plateau.append(new_sequence[j])&lt;br /&gt;
                        j += 1&lt;br /&gt;
                    plateau_length = len(plateau)&lt;br /&gt;
&lt;br /&gt;
                    # Verifică dacă lungimea platoului este maximă&lt;br /&gt;
                    if plateau_length &amp;gt; longest_plateau_length:&lt;br /&gt;
                        longest_plateau_length = plateau_length&lt;br /&gt;
                        longest_plateau_element = plateau[0]&lt;br /&gt;
&lt;br /&gt;
                    # Continuă căutarea în secvența următoare&lt;br /&gt;
                    j += 1&lt;br /&gt;
&lt;br /&gt;
    return longest_plateau_length, longest_plateau_element&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citire date de intrare&lt;br /&gt;
    k = int(input())&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    sequence = list(map(int, input().split()))&lt;br /&gt;
    p = int(input())&lt;br /&gt;
&lt;br /&gt;
    # Verificare date de intrare&lt;br /&gt;
    if not validate_input(k, n, sequence):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Calculează lungimea maximă a platoului sau elementul din care este format platoul&lt;br /&gt;
        longest_plateau_length, longest_plateau_element = find_longest_plateau(k, sequence)&lt;br /&gt;
        if p == 1:&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
            print(longest_plateau_length)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
            print(longest_plateau_element)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input(k, n, sequence) verifică dacă datele de intrare respectă restricțiile impuse în enunțul problemei. Aceasta primește ca parametrii: k, numărul limită de operații de inserare și extragere, n, numărul de elemente din secvență și sequence, secvența de numere. Funcția returnează True dacă datele respectă restricțiile și False altfel.&lt;br /&gt;
&lt;br /&gt;
Funcția find_longest_plateau(k, sequence) primește ca parametrii k, numărul limită de operații de inserare și extragere și sequence, secvența de numere. Aceasta determină lungimea maximă a unui platou sau a elementului din care este format platoul din secvență, folosind metoda de inserare și extragere descrisă în enunțul problemei. Funcția returnează o tuplă formată din lungimea maximă a platoului și elementul din care este format platoul.&lt;br /&gt;
&lt;br /&gt;
În funcția main(), se citesc datele de intrare și se validează cu ajutorul funcției validate_input(). Dacă datele sunt corecte, se calculează lungimea maximă a platoului sau elementul din care este format platoul folosind funcția find_longest_plateau(). Dacă parametrul p este egal cu 1, se afișează lungimea maximă a platoului, altfel se afișează elementul din care este format platoul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1512_-_Mars&amp;diff=6462</id>
		<title>1512 - Mars</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1512_-_Mars&amp;diff=6462"/>
		<updated>2023-05-14T20:53:59Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1512/mars 1512 - Mars]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se consideră un tablou unidimensional cu n elemente numere întregi, numerotate de la 1 la n, inițial toate nule. Asupra tabloului se fac m operații s d X cu semnificația: toate elementele cu indici cuprinși între s și d își măresc valoarea cu X.&lt;br /&gt;
&lt;br /&gt;
Să se afișeze tabloul după realizarea celor m operații.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele n m, iar apoi m triplete s d X, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;n elemente ale tabloului, separate prin exact un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 200.000&lt;br /&gt;
* 1 ≤ m ≤ 200.000&lt;br /&gt;
* 1 ≤ s ≤ d ≤ n&lt;br /&gt;
* -1000 ≤ X ≤ 1000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 10 6&lt;br /&gt;
: 8 10 2&lt;br /&gt;
: 3 10 -3&lt;br /&gt;
: 5 9 7&lt;br /&gt;
: 5 5 5&lt;br /&gt;
: 6 7 2&lt;br /&gt;
: 1 1 -1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct &lt;br /&gt;
: -1 0 -3 -3 9 6 6 6 6 -1&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5 5 1 1&lt;br /&gt;
: 1 5 1&lt;br /&gt;
: 1 5 2&lt;br /&gt;
: 1 5 3&lt;br /&gt;
: 1 5 4&lt;br /&gt;
: 1 5 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1512 - Mars&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare(n, m, operatii):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 200000) or not (1 &amp;lt;= m &amp;lt;= 200000):&lt;br /&gt;
        return False&lt;br /&gt;
    for op in operatii:&lt;br /&gt;
        if not (1 &amp;lt;= op[0] &amp;lt;= op[1] &amp;lt;= n) or not (-1000 &amp;lt;= op[2] &amp;lt;= 1000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, m, operatii):&lt;br /&gt;
    tablou = [0] * n&lt;br /&gt;
    for op in operatii:&lt;br /&gt;
        for i in range(op[0] - 1, op[1]):&lt;br /&gt;
            tablou[i] += op[2]&lt;br /&gt;
    return tablou&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    operatii = []&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        s, d, x = map(int, input().split())&lt;br /&gt;
        operatii.append((s, d, x))&lt;br /&gt;
&lt;br /&gt;
    if not validare(n, m, operatii):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        tablou = rezolvare(n, m, operatii)&lt;br /&gt;
        print(*tablou)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validare_date_intrare(n, m, operatii) primește numărul de elemente din tablou n, numărul de operații m și o listă de m triplete operatii de forma (s, d, X) și verifică dacă toate aceste date de intrare sunt valide conform cerințelor problemei. Dacă datele de intrare sunt corecte, funcția returnează True. În caz contrar, returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolva_tablou(n, m, operatii) primește datele de intrare valide și realizează tabloul final prin aplicarea celor m operații, folosind o buclă for care parcurge lista de operații și modifică elementele corespunzătoare ale tabloului. Funcția returnează lista finală de n elemente.&lt;br /&gt;
&lt;br /&gt;
Funcția afisare_rezultat(tablou) primește lista finală de n elemente și o afișează sub forma unei șiruri de numere separate printr-un spațiu, folosind funcția join pentru a uni elementele listei.&lt;br /&gt;
&lt;br /&gt;
Funcția if __name__ == &amp;quot;__main__&amp;quot;: reprezintă punctul de intrare în program și conține apelurile funcțiilor validare_date_intrare, rezolva_tablou și afisare_rezultat. Dacă datele de intrare sunt valide, se apelează funcțiile rezolva_tablou și afisare_rezultat, altfel se afișează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1839_-_Memory006&amp;diff=6460</id>
		<title>1839 - Memory006</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1839_-_Memory006&amp;diff=6460"/>
		<updated>2023-05-14T20:51:06Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/1839/memory006 - Memory006]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir format din n numere naturale nenule. Să se afle numărul secvenţelor din şir care au produsul elementelor egal cu 2k, unde k este un număr natural dat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare memory006.in conține pe prima linie numerele n şi k, iar pe a doua linie n numere naturale nenule, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi fișierul memory006.out va conține &#039;&#039;&#039;numărul S, reprezentând numărul secvenţelor din şir care au produsul elementelor egal cu 2k.&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 500.000&lt;br /&gt;
* 1 ≤ k ≤ 10.000&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi mai mari decât 1 şi mai mici decât 10^18&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: memory006.in&lt;br /&gt;
: 5 3&lt;br /&gt;
: 7 4 2 4 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct &lt;br /&gt;
: memory006.out&lt;br /&gt;
: 2&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: memory006.in&lt;br /&gt;
: 5 15000&lt;br /&gt;
: 7 4 2 4 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 1839 - Memory006&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, k, arr):&lt;br /&gt;
    if not(1 &amp;lt;= n &amp;lt;= 500000 and 1 &amp;lt;= k &amp;lt;= 10000 and len(arr) == n):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for num in arr:&lt;br /&gt;
        if not(1 &amp;lt;= num &amp;lt;= 10**18):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def calculate_sequences(n, k, arr):&lt;br /&gt;
    if not validate_input(n, k, arr):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    sequences_count = 0&lt;br /&gt;
    prod = 1&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        prod *= arr[i]&lt;br /&gt;
        while prod % 2 == 0:&lt;br /&gt;
            prod //= 2&lt;br /&gt;
            if prod == 2 ** k:&lt;br /&gt;
                sequences_count += 1&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;memory006.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(sequences_count))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;memory006.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, k = map(int, fin.readline().split())&lt;br /&gt;
        arr = list(map(int, fin.readline().split()))&lt;br /&gt;
    calculate_sequences(n, k, arr)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Functia validate_input verifica daca datele de intrare sunt valide, in functie de restrictiile impuse. Daca toate valorile sunt valide, functia returneaza True, altfel returneaza False si afiseaza un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
Functia calculate_sequences primeste ca parametri n - numarul de elemente din sir, k - numarul dat si arr - sirul de numere date. Daca datele de intrare sunt valide, functia calculeaza numarul de secvente din sir care au produsul elementelor egal cu 2^k si il scrie in fisierul de iesire &amp;quot;memory006.out&amp;quot;. Algoritmul este de a parcurge sirul si de a calcula produsul elementelor din secvente succesive, impartind la 2 pana cand produsul devine egal cu 2^k. Cand acest lucru se intampla, numarul de secvente creste cu 1.&lt;br /&gt;
&lt;br /&gt;
In __main__ se face citirea din fisierul de intrare &amp;quot;memory006.in&amp;quot; si se apeleaza functia calculate_sequences.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2921_-_SumeSecv1&amp;diff=6459</id>
		<title>2921 - SumeSecv1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2921_-_SumeSecv1&amp;diff=6459"/>
		<updated>2023-05-14T20:50:28Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://https://www.pbinfo.ro/probleme/2921/sumesecv1 2921 - SumeSecv1]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir cu n elemente numere întregi, numerotate de la 1 la n și m perechi de indici i j. Pentru fiecare pereche de indici se calculează suma elementelor din secvență determinată de cei doi indici. Afișați suma maximă obținută.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere întregi, apoi m și m perechi i j.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;numărul S, reprezentând suma maximă determinată&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000;&lt;br /&gt;
* 1 ≤ m ≤ 500.000;&lt;br /&gt;
* 1 ≤ i,j ≤ n;&lt;br /&gt;
cele n elemente ale șirului vor avea cel mult nouă cifre.&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 7 9 -6 1 -8&lt;br /&gt;
: 3&lt;br /&gt;
: 1 3&lt;br /&gt;
: 4 2&lt;br /&gt;
: 2 5&lt;br /&gt;
&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: 10&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 7 9 -6 1 -8&lt;br /&gt;
: 2 &lt;br /&gt;
: 1 5&lt;br /&gt;
: 2 4 3&lt;br /&gt;
&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 2921 - SumeSecv1&lt;br /&gt;
def validate_input(n, arr, m, pairs):&lt;br /&gt;
    if not(1 &amp;lt;= n &amp;lt;= 100000 and 1 &amp;lt;= m &amp;lt;= 500000 and len(arr) == n and len(pairs) == m):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for num in arr:&lt;br /&gt;
        if abs(num) &amp;gt; 10**9:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    for i, j in pairs:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_max_sum(n, arr, m, pairs):&lt;br /&gt;
    if not validate_input(n, arr, m, pairs):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    max_sum = float(&#039;-inf&#039;)&lt;br /&gt;
    for i, j in pairs:&lt;br /&gt;
        curr_sum = sum(arr[i-1:j])&lt;br /&gt;
        if curr_sum &amp;gt; max_sum:&lt;br /&gt;
            max_sum = curr_sum&lt;br /&gt;
&lt;br /&gt;
    print(max_sum)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
    m = int(input())&lt;br /&gt;
    pairs = []&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        i, j = map(int, input().split())&lt;br /&gt;
        pairs.append((i, j))&lt;br /&gt;
    find_max_sum(n, arr, m, pairs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția `validate_input` este o funcție care primește ca parametrii dimensiunile listei de numere întregi, lista de numere întregi și lista de perechi de indici, verifica dacă datele introduse corespund restricțiilor impuse și afișează un mesaj corespunzător. Aceasta returnează `True` dacă datele sunt corecte și `False` în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția `find_max_sum` primește aceleași parametrii ca și `validate_input`. Verifică dacă datele sunt introduse corect prin apelarea funcției `validate_input` și returnează `None` dacă datele nu sunt corecte. În caz contrar, calculează și afișează suma maximă dintre toate secvențele date de perechile de indici.&lt;br /&gt;
&lt;br /&gt;
Funcția `main` citește datele de intrare, apelează funcția `find_max_sum` și afișează rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0299_-_SumeSecv&amp;diff=6456</id>
		<title>0299 - SumeSecv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0299_-_SumeSecv&amp;diff=6456"/>
		<updated>2023-05-14T20:46:57Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/299/sumesecv - SumeSecv]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente numere naturale, numerotate de la 1 la n, și m perechi de indici (i,j), cu 1≤i&amp;lt;j≤n. Să se determine, pentru fiecare pereche (i,j), suma elementelor din secvenţa determinată de i şi j.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare sumesecv.in conţine pe prima linie numărul n, iar pe a doua linie cele n elemente ale vectorului. Următoarea linie conține numărul m, iar următoarele m linii câte o pereche de indici i j.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi fișierul sumesecv.out conține  &#039;&#039;&#039; numărul n. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1000&lt;br /&gt;
* 1 ≤ m ≤ 100&lt;br /&gt;
== Exemplu 1  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
:sumesecv.in&lt;br /&gt;
: 10&lt;br /&gt;
: 5 5 1 3 6 4 1 2 10 6 &lt;br /&gt;
: 3&lt;br /&gt;
: 5 8 &lt;br /&gt;
: 2 6 &lt;br /&gt;
: 6 10 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct &lt;br /&gt;
: sumesecv.out&lt;br /&gt;
: 13 19 23 &lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: sumesecv.in&lt;br /&gt;
: 5&lt;br /&gt;
: 1 2 3 4 5&lt;br /&gt;
: 2&lt;br /&gt;
: 1 5&lt;br /&gt;
: 2 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0304 - Secvente&lt;br /&gt;
&lt;br /&gt;
def calculeaza_suma_secvente(n, v, m, perechi):&lt;br /&gt;
    for pereche in perechi:&lt;br /&gt;
        i, j = pereche&lt;br /&gt;
        suma = 0&lt;br /&gt;
        for k in range(i, j + 1):&lt;br /&gt;
            suma += v[k - 1]&lt;br /&gt;
        print(suma, end=&#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
def valideaza_datele(n, v, m, perechi):&lt;br /&gt;
    if n != len(v):&lt;br /&gt;
        return False&lt;br /&gt;
    for i, j in perechi:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt; j &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;sumesecv.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline())&lt;br /&gt;
        v = list(map(int, f.readline().split()))&lt;br /&gt;
        m = int(f.readline())&lt;br /&gt;
        perechi = [tuple(map(int, f.readline().split())) for _ in range(m)]&lt;br /&gt;
    if valideaza_datele(n, v, m, perechi):&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        calculeaza_suma_secvente(n, v, m, perechi)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare == &lt;br /&gt;
&lt;br /&gt;
Funcția calculeaza_suma_secvente primește ca parametri numărul de elemente din vector (n), vectorul (v), numărul de perechi de indici (m) și o listă de perechi de indici (perechi). Aceasta parcurge lista de perechi de indici și pentru fiecare pereche calculează suma elementelor din secvența determinată de indicii respectivi.&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_datele primește ca parametri numărul de elemente din vector (n), vectorul (v), numărul de perechi de indici (m) și o listă de perechi de indici (perechi). Aceasta verifică dacă datele introduse sunt valide, adică dacă numărul de elemente din vector corespunde cu n, iar fiecare pereche de indici are valorile corecte.&lt;br /&gt;
&lt;br /&gt;
În funcția main, se deschide fișierul de intrare, se citesc datele și se verifică dacă sunt valide prin apelarea funcției valideaza_datele. Dacă datele sunt valide, se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; și se calculează suma pentru fiecare pereche de indici prin apelarea funcției calculeaza_suma_secvente. Dacă datele nu sunt valide, se afișează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0304_-_Secvente&amp;diff=6453</id>
		<title>0304 - Secvente</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0304_-_Secvente&amp;diff=6453"/>
		<updated>2023-05-14T20:44:08Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/304/secvente 0304 - Secvente]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir format din n elemente, numere naturale. Determinaţi câte secvenţe maximale cu elementele ordonate crescător conţine şirul.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare secvente.in conţine pe prima linie numărul n; urmează cele n elemente ale vectorului, dispuse pe mai multe linii şi separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa:&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi fișierul secv.out conține &#039;&#039;&#039; numărul C, reprezentând numărul de secvenţe cu elementele ordonate crescător din şirul dat&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000&lt;br /&gt;
* elementele şirului vor avea cel mult 4 cifre&lt;br /&gt;
* o secvență cu elemente ordonate crescător este maximală dacă adăugând la secvență încă un element ea nu mai are elementele ordonate crescător&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvente.in&lt;br /&gt;
: 8 &lt;br /&gt;
: 12 10 15 17 17&lt;br /&gt;
: 10 12 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct.&lt;br /&gt;
: secvente.out&lt;br /&gt;
: 3&lt;br /&gt;
== Exemplu 2  ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvente.in&lt;br /&gt;
: &lt;br /&gt;
: 10 12 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0304 - Secvente&lt;br /&gt;
&lt;br /&gt;
def count_maximal_sequences(n, arr):&lt;br /&gt;
    sequences = 0&lt;br /&gt;
    i = 0&lt;br /&gt;
    while i &amp;lt; n:&lt;br /&gt;
        j = i + 1&lt;br /&gt;
        while j &amp;lt; n and arr[j] &amp;gt; arr[j-1]:&lt;br /&gt;
            j += 1&lt;br /&gt;
        sequences += j - i&lt;br /&gt;
        i = j&lt;br /&gt;
    return sequences&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 1000:&lt;br /&gt;
        return False&lt;br /&gt;
    for x in arr:&lt;br /&gt;
        if not 1 &amp;lt;= x &amp;lt;= 9999:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;secvente.in&amp;quot;, &amp;quot;r&amp;quot;) as f_in:&lt;br /&gt;
            n = int(f_in.readline().strip())&lt;br /&gt;
            arr = []&lt;br /&gt;
            for _ in range(n):&lt;br /&gt;
                arr += list(map(int, f_in.readline().strip().split()))&lt;br /&gt;
        if validate_input(n, arr):&lt;br /&gt;
            with open(&amp;quot;secvente.out&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
                f_out.write(str(count_maximal_sequences(n, arr)))&lt;br /&gt;
                print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        print(&amp;quot;Nu exista fisierul de intrare!&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Functia count_maximal_sequences() calculeaza numarul de secvente maximale cu elementele ordonate crescator din sirul de intrare. Folosim doua variabile, i si j, pentru a parcurge sirul. Variabila i marcheaza inceputul unei secvente, iar variabila j cauta finalul secventei. Atunci cand gasim finalul secventei, adaugam la numarul de secvente maximale lungimea secventei curente, adica j-i. Apoi setam variabila i la valoarea lui j pentru a cauta urmatoarea secventa.&lt;br /&gt;
&lt;br /&gt;
Functia validate_input() valideaza datele de intrare conform restrictiilor problemei. Returneaza True daca datele sunt corecte si False in caz contrar.&lt;br /&gt;
&lt;br /&gt;
In functia principala if __name__ == &amp;quot;__main__&amp;quot;: citim datele de intrare din fisierul secvente.in. Apoi verificam daca datele sunt valide folosind functia validate_input(). Daca datele sunt valide, apelam functia count_maximal_sequences() pentru a calcula numarul de secvente maximale si scriem rezultatul in fisierul secvente.out. Afisam mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; daca totul a functionat bine. In caz contrar, afisam mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; sau &amp;quot;Nu exista fisierul de intrare!&amp;quot; daca fisierul de intrare nu exista.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0300_-_SumaInSecv&amp;diff=6451</id>
		<title>0300 - SumaInSecv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0300_-_SumaInSecv&amp;diff=6451"/>
		<updated>2023-05-14T20:40:57Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/4148/secv10 0300 - SumaInSecv]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector format din n elemente, numere naturale nenule, şi un număr natural S. Determinaţi, dacă există o secvenţă de elemente din şir cu suma elementelor egală cu S.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare sumainsecv.in conţine pe prima linie numerele n şi S; urmează cele n elemente ale vectorului, dispuse pe mai multe linii şi separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;și fișierul secv10.out va conține pe prima linie numerele lmax și c, reprezentând lungimea maximă a unei secvențe de elemente divizibile cu 10, respectiv numărul de secvențe de lungime maximă cu elemente divizibile cu 10&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100&lt;br /&gt;
* elementele vectorului vor avea cel mult 4 cifre şi sunt numerotate de la 1 la n&lt;br /&gt;
* dacă vectorul nu conţine nici o secvenţă cu suma elementelor S, se va afişa 0 0&lt;br /&gt;
* dacă şirul conţine mai multe secvenţe cu suma elementelor egală cu S, se va determina cea mai din stânga&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secv10.in&lt;br /&gt;
: 8 32  &lt;br /&gt;
: 12 10 15 7 17 13 19 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct&lt;br /&gt;
: secv10.out&lt;br /&gt;
: 2 4 &lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secv10.in&lt;br /&gt;
: 0 32 &lt;br /&gt;
: &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0300 - SumaInSecv&lt;br /&gt;
&lt;br /&gt;
def secv_suma(n, S, v):&lt;br /&gt;
    dp = [[0 for j in range(n)] for i in range(n)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        dp[i][i] = v[i]&lt;br /&gt;
        for j in range(i+1, n):&lt;br /&gt;
            dp[i][j] = dp[i][j-1] + v[j]&lt;br /&gt;
&lt;br /&gt;
    lmax = c = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i, n):&lt;br /&gt;
            if dp[i][j] == S:&lt;br /&gt;
                l = j-i+1&lt;br /&gt;
                if l &amp;gt; lmax:&lt;br /&gt;
                    lmax = l&lt;br /&gt;
                    c = 1&lt;br /&gt;
                elif l == lmax:&lt;br /&gt;
                    c += 1&lt;br /&gt;
&lt;br /&gt;
    if lmax == 0:&lt;br /&gt;
        return 0, 0&lt;br /&gt;
    else:&lt;br /&gt;
        return lmax, c&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, S, v):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(v) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if not (1 &amp;lt;= v[i] &amp;lt;= 9999):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;sumainsecv.in&amp;quot;) as f:&lt;br /&gt;
            n, S = map(int, f.readline().split())&lt;br /&gt;
            v = []&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                row = f.readline().split()&lt;br /&gt;
                if len(row) != 1:&lt;br /&gt;
                    raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
                v.append(int(row[0]))&lt;br /&gt;
            if not validate_input(n, S, v):&lt;br /&gt;
                raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        lmax, c = secv_suma(n, S, v)&lt;br /&gt;
        with open(&amp;quot;secv10.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(f&amp;quot;{lmax} {c}&amp;quot;)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
secv_suma(n, S, v): Aceasta este funcția principală care primește ca parametri numărul de elemente din vector (n), suma dorită (S) și vectorul de elemente (v). Ea folosește o matrice dp pentru a calcula suma de la indicele i la j și o variabilă lmax pentru a păstra lungimea maximă a unei secvențe care are suma S. Dacă există mai multe secvențe cu aceeași lungime maximă, variabila c este folosită pentru a număra aceste secvențe. Rezultatul final este afișat pe ecran.&lt;br /&gt;
validare(n, S, v): Aceasta este o funcție ajutătoare care primește aceleași parametri ca și funcția principală și verifică dacă acestea respectă restricțiile date în cerință. Dacă există o problemă, se aruncă o excepție cu un mesaj corespunzător. Dacă nu există probleme, funcția nu returnează nimic.&lt;br /&gt;
main(): Aceasta este o funcție ajutătoare care citeste datele din fișierul de intrare și le returnează sub formă de tuplu format din n, S și vectorul v. Dacă există o problemă în citire, se aruncă o excepție cu un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4148_-_Secv10&amp;diff=6447</id>
		<title>4148 - Secv10</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4148_-_Secv10&amp;diff=6447"/>
		<updated>2023-05-14T20:36:20Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/4148/secv10 4148 - Secv10]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dau n numere naturale, reprezentând elementele unui vector. Determinați lungimea maximă a unei secvențe de elemente divizibile cu 10, precum și numărul de secvențe de lungime maximă cu elemente divizibile cu 10.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare secv10.in conține numărul n și n valori naturale, reprezentând elementele vectorului.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;și fișierul secv10.out va conține pe prima linie numerele lmax și c, reprezentând lungimea maximă a unei secvențe de elemente divizibile cu 10, respectiv numărul de secvențe de lungime maximă cu elemente divizibile cu 10&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 0 &amp;lt; n ≤ 10.000&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1.000.000 și există cel puțin un element divizibil cu 10.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secv10.in&lt;br /&gt;
: 11&lt;br /&gt;
: 12 10 20 30 99 1000 1 20 500 600 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: secv10.out&lt;br /&gt;
: 3 2&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secv10.in&lt;br /&gt;
: 7&lt;br /&gt;
: 1 3 5 7 9 11 13 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 4148 - Secv10&lt;br /&gt;
def secv10(n, v):&lt;br /&gt;
    # Inițializăm variabilele&lt;br /&gt;
    lmax = 0&lt;br /&gt;
    c = 0&lt;br /&gt;
    l = 0&lt;br /&gt;
&lt;br /&gt;
    # Parcurgem vectorul&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if v[i] % 10 == 0:&lt;br /&gt;
            l += 1&lt;br /&gt;
            if l &amp;gt; lmax:&lt;br /&gt;
                lmax = l&lt;br /&gt;
                c = 1&lt;br /&gt;
            elif l == lmax:&lt;br /&gt;
                c += 1&lt;br /&gt;
        else:&lt;br /&gt;
            l = 0&lt;br /&gt;
&lt;br /&gt;
    return lmax, c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare(n, v):&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not (0 &amp;lt; n &amp;lt;= 10000 and any(x % 10 == 0 for x in v)):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim datele de intrare&lt;br /&gt;
    with open(&#039;secv10.in&#039;, &#039;r&#039;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        v = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not validare(n, v):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Calculăm rezultatul&lt;br /&gt;
        rez = secv10(n, v)&lt;br /&gt;
&lt;br /&gt;
        # Afisam rezultatul&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        print(rez[0], rez[1])&lt;br /&gt;
&lt;br /&gt;
        # Scriem rezultatul in fisierul de iesire&lt;br /&gt;
        with open(&#039;secv10.out&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;{rez[0]} {rez[1]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
validare(n, v) - primește un număr și un vector și verifică dacă numărul este între 1 și 10.000 și dacă există cel puțin un element din vector care este divizibil cu 10. În caz contrar, afișează un mesaj de eroare și returnează False, altfel returnează True.&lt;br /&gt;
&lt;br /&gt;
rezolvare(n, v) - primește un număr și un vector și determină lungimea maximă a unei secvențe de elemente divizibile cu 10 și numărul de secvențe de lungime maximă cu elemente divizibile cu 10. Acest lucru se realizează prin parcurgerea vectorului și ținerea contorului pentru lungimea secvenței actuale și lungimea maximă găsită până în acel moment, precum și numărul de secvențe de lungime maximă.&lt;br /&gt;
&lt;br /&gt;
citire() - citește datele din fișierul secv10.in și le returnează ca o pereche de valori: numărul n și vectorul v.&lt;br /&gt;
&lt;br /&gt;
afisare(lmax, c) - primește lungimea maximă a secvenței de elemente divizibile cu 10 și numărul de secvențe de lungime maximă și afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; și valorile lmax și c pe ecran și în fișierul secv10.out.&lt;br /&gt;
&lt;br /&gt;
main() - este funcția principală care apelează celelalte funcții în ordine, începând cu citirea datelor, validarea acestora, rezolvarea problemei și afișarea rezultatelor.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0166_-_SecvMax&amp;diff=6444</id>
		<title>0166 - SecvMax</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0166_-_SecvMax&amp;diff=6444"/>
		<updated>2023-05-14T20:32:42Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/134/secvk 0166 - SecvMax]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dau n numere naturale, reprezentând elementele unui vector.&lt;br /&gt;
&lt;br /&gt;
Determinați cea mai lungă secvență de elemente pare din vector. Dacă există mai multe secvențe cu lungime maximă se va determina cea cu suma elementelor maximă. Dacă există mai multe astfel de secvențe se va determina cea mai din stânga.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare secvmax.in conţine numărul n și n valori naturale, reprezentând elementele vectorului. Valorile din fișier pot fi dispuse pe mai multe linii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
 &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039; și fișierul secvk.out va conţine pe prima linie k numere, reprezentând elementele secvenței cerute&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 0 &amp;lt; n ≤ 10.000&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1000 și sunt numerotate de la 1&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvk.in&lt;br /&gt;
: 9&lt;br /&gt;
: 2 6 4 5 8 8 6 3 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: secvk.out&lt;br /&gt;
: 5 7&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvk.in&lt;br /&gt;
: 5&lt;br /&gt;
: 1 2 3 4 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#0166 - SecvMax&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, v):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100000 or any(x &amp;gt;= 1000 for x in v):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_longest_even_sequence(n, v):&lt;br /&gt;
    if not validate_input(n, v):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;, []&lt;br /&gt;
&lt;br /&gt;
    start, end, max_len = 0, 0, 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if v[i] % 2 == 0:&lt;br /&gt;
            j = i&lt;br /&gt;
            while j &amp;lt; n and v[j] % 2 == 0:&lt;br /&gt;
                j += 1&lt;br /&gt;
            if j - i &amp;gt; max_len:&lt;br /&gt;
                start, end, max_len = i, j, j - i&lt;br /&gt;
&lt;br /&gt;
    max_sum = sum(v[start:end])&lt;br /&gt;
    for i in range(start, end):&lt;br /&gt;
        if v[i] % 2 == 0 and sum(v[i:end]) == max_sum:&lt;br /&gt;
            start = i&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(start, end):&lt;br /&gt;
        if v[i] % 2 == 0:&lt;br /&gt;
            result.append(v[i])&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;Datele sunt introduse corect.&amp;quot;, result&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;secvk.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        v = []&lt;br /&gt;
        for line in f:&lt;br /&gt;
            v += list(map(int, line.strip().split()))&lt;br /&gt;
&lt;br /&gt;
    message, result = find_longest_even_sequence(n, v)&lt;br /&gt;
&lt;br /&gt;
    print(message)&lt;br /&gt;
    if message == &amp;quot;Datele sunt introduse corect.&amp;quot;:&lt;br /&gt;
        with open(&amp;quot;secvk.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot; &amp;quot;.join(str(x) for x in result))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Functia validate_input(n, v) verifica daca datele de intrare sunt valide si intoarce True daca sunt valide si False altfel.&lt;br /&gt;
&lt;br /&gt;
Functia find_longest_even_sequence(n, v) rezolva problema conform cerintei, si intoarce un tuplu cu un mesaj si secventa gasita, sau cu un mesaj de eroare si o lista vida.&lt;br /&gt;
&lt;br /&gt;
In functia principala if __name__ == &amp;quot;__main__&amp;quot;, se citesc datele de intrare din fisier si se apeleaza functia find_longest_even_sequence(n, v) pentru a rezolva problema. Daca functia intoarce un mesaj de eroare, acesta se afiseaza, altfel secventa gasita se scrie in fisierul de iesire &amp;quot;secvk.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6443</id>
		<title>0578 - SecvEgale2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6443"/>
		<updated>2023-05-14T20:31:46Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/524/secvegale1 0578 - SecvEgale2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Determinați câte secvențe ale vectorului au toate elementele egale.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, apoi cele n elemente ale vectorului.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1.000.000.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 8&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restrictiilor inpuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0578 - SecvEgale2&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(0 &amp;lt;= x &amp;lt; 1000000000 for x in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def longest_equal_seq(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    count = 1&lt;br /&gt;
    max_count = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if arr[i] == arr[i - 1]:&lt;br /&gt;
            count += 1&lt;br /&gt;
        else:&lt;br /&gt;
            max_count = max(max_count, count)&lt;br /&gt;
            count = 1&lt;br /&gt;
&lt;br /&gt;
    max_count = max(max_count, count)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    print(max_count)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    arr = list(map(int, input().strip().split()))&lt;br /&gt;
    longest_equal_seq(n, arr)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
arr -&amp;gt; vine de la lista&lt;br /&gt;
&lt;br /&gt;
validate_input(n: int, arr: list[int]) -&amp;gt; bool: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifică dacă numărul n respectă restricțiile impuse de problema (adica 1 ≤ n ≤ 100.000) și dacă toate elementele din vectorul arr sunt mai mici decât 1.000.000.000. Dacă restricțiile sunt respectate, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
find_longest_equal_seq(n: int, arr: list[int]) -&amp;gt; None: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifica dacă datele sunt introduse corect folosind funcția validate_input și, în caz afirmativ, găsește lungimea celei mai lungi secvențe a vectorului arr care conține elemente egale și afișează indicii capetelor acestei secvențe.&lt;br /&gt;
&lt;br /&gt;
In if __name__ == &amp;quot;__main__&amp;quot;itim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0134_-_SecvK&amp;diff=6440</id>
		<title>0134 - SecvK</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0134_-_SecvK&amp;diff=6440"/>
		<updated>2023-05-14T20:29:41Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/134/secvk 0134 - SecvK]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir cu n numere naturale și un număr k.&lt;br /&gt;
Să se determine o secvență de elemente de lungime k cu suma elementelor maximă.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare secvk.in conţine pe prima linie numerele n și k, iar pe a doua linie n numere naturale separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;și fișierul secvk.out va conţine pe prima linie k numere, reprezentând elementele secvenței cerute&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ k ≤ n ≤ 100.000&lt;br /&gt;
* numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000&lt;br /&gt;
* dacă există mai multe secvențe de lungime k cu suma maximă se va afișa prima&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvk.in&lt;br /&gt;
: 8 3&lt;br /&gt;
: 5 6 1 2 6 6 4 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse correct&lt;br /&gt;
: secvk.out&lt;br /&gt;
: 6 6 4&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: secvk.in&lt;br /&gt;
: 8 3&lt;br /&gt;
: 52748&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0134 - SecvK&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, k, arr):&lt;br /&gt;
    if k &amp;gt; n or n &amp;gt; 100000 or k &amp;lt; 1 or n &amp;lt; 1 or any(x &amp;gt;= 1000 for x in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_max_sequence(n, k, arr):&lt;br /&gt;
    if not validate_input(n, k, arr):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;, []&lt;br /&gt;
&lt;br /&gt;
    start = 0&lt;br /&gt;
    end = k-1&lt;br /&gt;
    max_sum = sum(arr[start:end+1])&lt;br /&gt;
    result = arr[start:end+1]&lt;br /&gt;
&lt;br /&gt;
    for i in range(k, n):&lt;br /&gt;
        start += 1&lt;br /&gt;
        end += 1&lt;br /&gt;
        current_sum = sum(arr[start:end+1])&lt;br /&gt;
        if current_sum &amp;gt; max_sum:&lt;br /&gt;
            max_sum = current_sum&lt;br /&gt;
            result = arr[start:end+1]&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;Datele sunt introduse corect.&amp;quot;, result&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;secvk.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, k = map(int, f.readline().strip().split())&lt;br /&gt;
        arr = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    message, result = find_max_sequence(n, k, arr)&lt;br /&gt;
&lt;br /&gt;
    print(message)&lt;br /&gt;
    if message == &amp;quot;Datele sunt introduse corect.&amp;quot;:&lt;br /&gt;
        with open(&amp;quot;secvk.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot; &amp;quot;.join(str(x) for x in result)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
validate_input(n, k, arr) - această funcție primește trei argumente: n și k, reprezentând numărul total de elemente din listă, respectiv numărul de elemente consecutive din listă pe care trebuie să le adunăm, și arr, o listă de numere întregi. Funcția verifică dacă toate aceste valori respectă restricțiile impuse: 1 ≤ k ≤ n ≤ 100.000, iar toate numerele din listă sunt mai mici decât 1000. În cazul în care aceste condiții nu sunt respectate, funcția returnează False, altfel returnează True.&lt;br /&gt;
&lt;br /&gt;
find_max_sequence(n, k, arr) - această funcție primește aceiași trei argumente ca și funcția de mai sus, și calculează suma maximă a unei secvențe de k elemente consecutive din lista arr. Pentru a face acest lucru, funcția folosește o metodă de tip sliding window, parcurgând lista arr și determinând suma maximă a unei ferestre glisante de lungime k. Dacă argumentele nu respectă restricțiile impuse, funcția returnează un mesaj de eroare și o listă vidă, altfel returnează un mesaj de succes și lista de k elemente consecutive care au suma maximă.&lt;br /&gt;
&lt;br /&gt;
main() - această funcție deschide fișierul secvk.in, citind valorile n, k și lista arr. Apoi, apelează funcția find_max_sequence() cu aceste argumente și afișează mesajul de eroare sau lista de elemente dacă acestea sunt valabile. În cazul în care lista de elemente este validă, scrie rezultatul în fișierul secvk.out.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0298_-_SumSec&amp;diff=6438</id>
		<title>0298 - SumSec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0298_-_SumSec&amp;diff=6438"/>
		<updated>2023-05-14T20:21:51Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/298/sumsec 0298 - SumSec]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un şir format din n elemente, numere naturale. Calculaţi suma elementelor din secvenţa determinată de primul şi ultimul element prim.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare sumsec.in conţine pe prima linie numărul n; urmează cele n elemente ale vectorului, dispuse pe mai multe linii şi separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;&#039;&#039; și fișierul sumsec.out va conţine pe prima linie numărul S, reprezentând suma calculată&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039; si fisierul sumsec.out nu va fi generat.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000&lt;br /&gt;
* elementele şirului vor avea cel mult 9 cifre&lt;br /&gt;
* şirul va conţine cel puţin un element prim&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: sumsec.in&lt;br /&gt;
: 8&lt;br /&gt;
: 12 10 15 7 17 10 19 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: sumsec.out&lt;br /&gt;
: 53&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: sumsec.in&lt;br /&gt;
: 8&lt;br /&gt;
: 12 10 15 7 17 10 19 14&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0298 - SumSec&lt;br /&gt;
&lt;br /&gt;
def is_prime(n):&lt;br /&gt;
    if n &amp;lt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    if n == 2:&lt;br /&gt;
        return True&lt;br /&gt;
    if n % 2 == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(3, int(n ** 0.5) + 1, 2):&lt;br /&gt;
        if n % i == 0:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def solve_sumsec(n, a):&lt;br /&gt;
    first_prime = -1&lt;br /&gt;
    last_prime = -1&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if is_prime(a[i]):&lt;br /&gt;
            if first_prime == -1:&lt;br /&gt;
                first_prime = i&lt;br /&gt;
            last_prime = i&lt;br /&gt;
    &lt;br /&gt;
    if first_prime == -1 or last_prime == -1:&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sum = 0&lt;br /&gt;
    for i in range(first_prime + 1, last_prime):&lt;br /&gt;
        sum += a[i]&lt;br /&gt;
        &lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, a):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 10000):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;lt; 1 or num &amp;gt; 999999999 for num in a):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if not validate_input(n, a):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        result = solve_sumsec(n, a)&lt;br /&gt;
        with open(&amp;quot;sumsec.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(str(result))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția is_prime(n) primește ca argument un număr întreg n și verifică dacă acesta este un număr prim. Funcția parcurge toate numerele întregi impare de la 3 la radical din n, verificând dacă n este divizibil cu vreunul dintre acestea. Dacă n este divizibil cu un număr diferit de 1 și de n, atunci n nu este prim și funcția returnează False. În caz contrar, funcția returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția solve_sumsec(n, a) primește ca argumente un număr întreg n și un vector a cu n elemente și calculează suma elementelor din secvența determinată de primul și ultimul element prim din vectorul dat.&lt;br /&gt;
&lt;br /&gt;
În primul rând, funcția identifică prima și ultima poziție din vectorul a unde se găsesc elemente prime și le reține în variabilele first_prime și last_prime. Dacă nu există cel puțin o astfel de poziție, atunci funcția returnează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă există cel puțin o poziție cu un element prim, atunci funcția calculează suma elementelor din secvența determinată de primul și ultimul element prim. Această secvență este reprezentată de toate elementele din vectorul a care se află între pozițiile first_prime și last_prime, cu excepția primului și ultimului element prim din vector.&lt;br /&gt;
&lt;br /&gt;
In blocul if __name__ == &amp;quot;__main__&amp;quot;: se citesc datele de intrare din fișierul &amp;quot;sumsec.in&amp;quot;, se validează conform restricțiilor problemei, se afișează un mesaj corespunzător și se apelează funcția solve_sumsec() pentru a rezolva problema și a obține rezultatul dorit. Acest rezultat este scris apoi în fișierul &amp;quot;sumsec.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0854_-_Secvente1&amp;diff=6433</id>
		<title>0854 - Secvente1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0854_-_Secvente1&amp;diff=6433"/>
		<updated>2023-05-14T20:15:38Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/854/secvente1 0854 - Secvente1]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un șir cu n elemente, numere naturale și un număr k. Determinați numărul minim de secvențe disjuncte în care trebuie împărțit șirul astfel încât fiecare element al șirului să aparțină unei secvențe și fiecare secvență să conțină cel mult k elemente impare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele n k, iar apoi cele n elemente ale șirului&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;va afișa pe ecran numărul minim de secvențe C&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ k &amp;lt; n ≤ 100.000&lt;br /&gt;
* cele n numere citite vor fi mai mici decât 1.000.000.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 7 2&lt;br /&gt;
: 4 3 4 9 9 1 8 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 2&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 7 2&lt;br /&gt;
: 2 3 4 9 1 1 8 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0854 - Secvente1&lt;br /&gt;
&lt;br /&gt;
def validare_date_intrare(n, k, arr):&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt; n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(num &amp;gt;= 1000000000 for num in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare_problema(n, k, arr):&lt;br /&gt;
    count = 0&lt;br /&gt;
    odd_count = 0&lt;br /&gt;
&lt;br /&gt;
    for num in arr:&lt;br /&gt;
        if num % 2 != 0:&lt;br /&gt;
            odd_count += 1&lt;br /&gt;
&lt;br /&gt;
        if odd_count &amp;gt; k:&lt;br /&gt;
            count += 1&lt;br /&gt;
            odd_count = 1&lt;br /&gt;
&lt;br /&gt;
    return count + 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    t = int(input())&lt;br /&gt;
&lt;br /&gt;
    for i in range(t):&lt;br /&gt;
        n, k = map(int, input().split())&lt;br /&gt;
        arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
        if not validare_date_intrare(n, k, arr):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
            print(rezolvare_problema(n, k, arr))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Expliacatie Rezolvare == &lt;br /&gt;
&lt;br /&gt;
Funcția validare_date_intrare verifică dacă datele de intrare respectă restricțiile problemei și returnează True dacă acestea sunt corecte, False altfel.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare_problema primește cele 3 argumente și aplică algoritmul descris în cerință pentru a determina numărul minim de secvențe disjuncte care conțin cel puțin k numere impare.&lt;br /&gt;
&lt;br /&gt;
În funcția if __name__ == &amp;quot;__main__&amp;quot;, se citește numărul de seturi de date, apoi pentru fiecare set de date citesc datele de intrare. Se validează datele de intrare folosind funcția validare_date_intrare și se afișează rezultatul folosind funcția rezolvare_problema.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0071_-_Reducere&amp;diff=6431</id>
		<title>0071 - Reducere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0071_-_Reducere&amp;diff=6431"/>
		<updated>2023-05-14T20:14:18Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/71/reducere 0071 - Reducere]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se consideră două tablouri unidimensionale A și B cu elemente numere naturale din intervalul [1,10000]. Spunem că tabloul A se poate reduce la tabloul B dacă există o împărțire a tabloului A în secvențe disjuncte de elemente aflate pe poziţii consecutive în tabloul A astfel încât prin înlocuirea secvențelor cu suma elementelor din secvență să se obţină, în ordine, elementele tabloului B.&lt;br /&gt;
Se dau două tablouri A și B. Să se verifice dacă tabloul A se poate reduce la tabloul B.&lt;br /&gt;
&lt;br /&gt;
Programul va citi mai multe seturi de date, fiecare constând în doi vectori A, B și va afișa pentru fiecare set de date dacă tabloul A se poate reduce la tabloul B.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește un număr natural T, reprezentând numărul de seturi de date de test care urmează. Urmează T seturi de date, descrise astfel:&lt;br /&gt;
&lt;br /&gt;
* se citește n&lt;br /&gt;
* se citesc n valori, reprezentând elementele tabloului A&lt;br /&gt;
* se citește m&lt;br /&gt;
* se citesc m valori, reprezentând elementele tabloului B&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;afișează pentru fiecare dintre cele T teste, pe câte o linie a ecranului valoare 1, dacă tabloul A se poate reduce la tabloul B&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 0 &amp;lt; n, m &amp;lt; 1001&lt;br /&gt;
* elementele vectorilor A, B sunt numere naturale din intervalul [1,10000]&lt;br /&gt;
0 &amp;lt; T ≤ 10&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 12&lt;br /&gt;
: 7 3 4 1 6 4 6 9 7 1 8 7&lt;br /&gt;
: 4&lt;br /&gt;
: 14 7 26 16&lt;br /&gt;
: 5&lt;br /&gt;
: 1 4 2 2 3&lt;br /&gt;
: 3&lt;br /&gt;
: 5 3 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 1&lt;br /&gt;
: 0&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 1001&lt;br /&gt;
: 7 3 4 1 6 4 6 9 7 1 8 7&lt;br /&gt;
: 4&lt;br /&gt;
: 14 7 26 16&lt;br /&gt;
: 5&lt;br /&gt;
: 1 4 2 2 3&lt;br /&gt;
: 3&lt;br /&gt;
: 5 3 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0071 - Reducere&lt;br /&gt;
&lt;br /&gt;
def se_poate_reduca_la_B(A, B):&lt;br /&gt;
    i = j = 0&lt;br /&gt;
    n = len(A)&lt;br /&gt;
    m = len(B)&lt;br /&gt;
    while i &amp;lt; n and j &amp;lt; m:&lt;br /&gt;
        if A[i] == B[j]:&lt;br /&gt;
            i += 1&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            s = A[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            while i &amp;lt; n and s &amp;lt; B[j]:&lt;br /&gt;
                s += A[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            if s != B[j]:&lt;br /&gt;
                return 0&lt;br /&gt;
            j += 1&lt;br /&gt;
    return j == m&lt;br /&gt;
&lt;br /&gt;
def validare(n, A, m, B):&lt;br /&gt;
    if not(1 &amp;lt;= n &amp;lt;= 1000) or not(1 &amp;lt;= m &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= a &amp;lt;= 10000 for a in A) or not all(1 &amp;lt;= b &amp;lt;= 10000 for b in B):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    T = int(input())&lt;br /&gt;
    if T &amp;lt;= 0 or T &amp;gt; 10:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        for i in range(T):&lt;br /&gt;
            n = int(input())&lt;br /&gt;
            A = list(map(int, input().split()))&lt;br /&gt;
            m = int(input())&lt;br /&gt;
            B = list(map(int, input().split()))&lt;br /&gt;
            if not validare(n, A, m, B):&lt;br /&gt;
                print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(se_poate_reduca_la_B(A, B))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
validate_data(a, b): Această funcție primește ca parametri două liste, a și b, reprezentând cele două tablouri. Funcția validează dacă datele introduse respectă restricțiile problemei, adică dacă dimensiunile celor două tablouri sunt între 1 și 1000 și dacă toate elementele tablourilor sunt numere naturale între 1 și 10000. Dacă datele sunt valide, funcția returnează True, în caz contrar returnează False.&lt;br /&gt;
&lt;br /&gt;
reduce(a, b): Această funcție primește ca parametri două liste, a și b, reprezentând cele două tablouri. Funcția verifică dacă tabloul a se poate reduce la tabloul b. În acest scop, parcurge fiecare element al tabloului b și caută în tabloul a o secvență de elemente consecutive aflate pe poziții consecutive în tabloul a, a cărei sumă să fie egală cu elementul curent din tabloul b. Dacă găsește o astfel de secvență, o elimină din tabloul a și trece la următorul element din tabloul b. Dacă nu găsește o astfel de secvență, funcția returnează False. Dacă se parcurge cu succes întregul tablou b și toate elementele sale au fost găsite în tabloul a, funcția returnează True.&lt;br /&gt;
&lt;br /&gt;
main(): Această funcție este funcția principală a programului. Ea citeste datele de intrare din consolă, apoi validează datele folosind funcția validate_data. Dacă datele sunt valide, se parcurg cele t teste și pentru fiecare test se citesc cele două tablouri și se apelează funcția reduce pentru a verifica dacă primul tablou se poate reduce la cel de-al doilea. Rezultatul verificării se afișează în consolă. Dacă datele nu sunt valide, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6425</id>
		<title>0578 - SecvEgale2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6425"/>
		<updated>2023-05-14T20:10:14Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/524/secvegale1 0578 - SecvEgale2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Determinați câte secvențe ale vectorului au toate elementele egale.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, apoi cele n elemente ale vectorului.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1.000.000.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 8&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restrictiilor inpuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0578 - SecvEgale2&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(0 &amp;lt;= x &amp;lt; 1000000000 for x in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def longest_equal_seq(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    count = 1&lt;br /&gt;
    max_count = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if arr[i] == arr[i - 1]:&lt;br /&gt;
            count += 1&lt;br /&gt;
        else:&lt;br /&gt;
            max_count = max(max_count, count)&lt;br /&gt;
            count = 1&lt;br /&gt;
&lt;br /&gt;
    max_count = max(max_count, count)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    print(max_count)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    arr = list(map(int, input().strip().split()))&lt;br /&gt;
    longest_equal_seq(n, arr)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
arr -&amp;gt; vine de la lista&lt;br /&gt;
validate_input(n: int, arr: list[int]) -&amp;gt; bool: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifică dacă numărul n respectă restricțiile impuse de problema (adica 1 ≤ n ≤ 100.000) și dacă toate elementele din vectorul arr sunt mai mici decât 1.000.000.000. Dacă restricțiile sunt respectate, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
find_longest_equal_seq(n: int, arr: list[int]) -&amp;gt; None: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifica dacă datele sunt introduse corect folosind funcția validate_input și, în caz afirmativ, găsește lungimea celei mai lungi secvențe a vectorului arr care conține elemente egale și afișează indicii capetelor acestei secvențe.&lt;br /&gt;
&lt;br /&gt;
In if __name__ == &amp;quot;__main__&amp;quot;itim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6423</id>
		<title>0578 - SecvEgale2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6423"/>
		<updated>2023-05-14T20:09:28Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/524/secvegale1 0578 - SecvEgale2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Determinați câte secvențe ale vectorului au toate elementele egale.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, apoi cele n elemente ale vectorului.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1.000.000.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 8&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restrictiilor inpuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0578 - SecvEgale2&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(0 &amp;lt;= x &amp;lt; 1000000000 for x in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def longest_equal_seq(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    count = 1&lt;br /&gt;
    max_count = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if arr[i] == arr[i - 1]:&lt;br /&gt;
            count += 1&lt;br /&gt;
        else:&lt;br /&gt;
            max_count = max(max_count, count)&lt;br /&gt;
            count = 1&lt;br /&gt;
&lt;br /&gt;
    max_count = max(max_count, count)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    print(max_count)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    arr = list(map(int, input().strip().split()))&lt;br /&gt;
    longest_equal_seq(n, arr)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
validate_input(n: int, arr: list[int]) -&amp;gt; bool: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifică dacă numărul n respectă restricțiile impuse de problema (adica 1 ≤ n ≤ 100.000) și dacă toate elementele din vectorul arr sunt mai mici decât 1.000.000.000. Dacă restricțiile sunt respectate, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
find_longest_equal_seq(n: int, arr: list[int]) -&amp;gt; None: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifica dacă datele sunt introduse corect folosind funcția validate_input și, în caz afirmativ, găsește lungimea celei mai lungi secvențe a vectorului arr care conține elemente egale și afișează indicii capetelor acestei secvențe.&lt;br /&gt;
&lt;br /&gt;
In if __name__ == &amp;quot;__main__&amp;quot;itim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6422</id>
		<title>0578 - SecvEgale2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0578_-_SecvEgale2&amp;diff=6422"/>
		<updated>2023-05-14T20:08:42Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/524/secvegale1 0578 - SecvEgale2]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Determinați câte secvențe ale vectorului au toate elementele egale.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, apoi cele n elemente ale vectorului.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039; va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* elementele vectorului vor fi mai mici decât 1.000.000.000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 8&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 4 3 3 3 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restrictiilor inpuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0578 - SecvEgale2&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, arr):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(0 &amp;lt;= x &amp;lt; 1000000000 for x in arr):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def longest_equal_seq(n, arr):&lt;br /&gt;
    if not validate_input(n, arr):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    count = 1&lt;br /&gt;
    max_count = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if arr[i] == arr[i - 1]:&lt;br /&gt;
            count += 1&lt;br /&gt;
        else:&lt;br /&gt;
            max_count = max(max_count, count)&lt;br /&gt;
            count = 1&lt;br /&gt;
&lt;br /&gt;
    max_count = max(max_count, count)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    print(max_count)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    arr = list(map(int, input().strip().split()))&lt;br /&gt;
    longest_equal_seq(n, arr)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
validate_input(n: int, arr: list[int]) -&amp;gt; bool: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifică dacă numărul n respectă restricțiile impuse de problema (adica 1 ≤ n ≤ 100.000) și dacă toate elementele din vectorul arr sunt mai mici decât 1.000.000.000. Dacă restricțiile sunt respectate, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
find_longest_equal_seq(n: int, arr: list[int]) -&amp;gt; None: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifica dacă datele sunt introduse corect folosind funcția validate_input și, în caz afirmativ, găsește lungimea celei mai lungi secvențe a vectorului arr care conține elemente egale și afișează indicii capetelor acestei secvențe.&lt;br /&gt;
&lt;br /&gt;
main(): Aceasta este funcția principală a programului. Citim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0524_-_SecvEgale1&amp;diff=6416</id>
		<title>0524 - SecvEgale1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0524_-_SecvEgale1&amp;diff=6416"/>
		<updated>2023-05-14T20:04:26Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/524/secvegale1 0524 - SecvEgale1]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Determinați cea mai lungă secvență de elemente din vector care începe și se termină cu aceeași valoare. Dacă în vector există mai multe secvențe corecte de lungime maximă se va determina cea mai din stânga.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând elementele vectorului.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1000&lt;br /&gt;
* cele n numere citite vor fi mai mici decât 1.000.000.000&lt;br /&gt;
* indexarea elementelor vectorului începe de la 1.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 12&lt;br /&gt;
: 6 6 8 3 6 6 3 8 4 3 3 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect..&lt;br /&gt;
: 4 11&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 11&lt;br /&gt;
: 6 2  8 3 3 6 3 8 4 1 3 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0524 - SecvEgale1&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, v):&lt;br /&gt;
    if not (isinstance(n, int) and n &amp;gt;= 1 and n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(isinstance(x, int) and x &amp;gt;= 0 and x &amp;lt; 1000000000 for x in v):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_identical_sequence(n, v):&lt;br /&gt;
    max_len = 0&lt;br /&gt;
    seq_start = None&lt;br /&gt;
    seq_end = None&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i+1, n+1):&lt;br /&gt;
            if v[i:j] == v[i:j][::-1] and j-i &amp;gt; max_len:&lt;br /&gt;
                seq_start = i+1&lt;br /&gt;
                seq_end = j&lt;br /&gt;
                max_len = j-i&lt;br /&gt;
&lt;br /&gt;
    if max_len &amp;gt; 0:&lt;br /&gt;
        return (seq_start, seq_end)&lt;br /&gt;
    else:&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    v = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if validate_input(n, v):&lt;br /&gt;
        result = find_identical_sequence(n, v)&lt;br /&gt;
        if result:&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
            print(result[0], result[1])&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Nu exista secventa identica.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
Funcția validate_input primește n și v și verifică dacă n se află în intervalul [1, 1000] și dacă fiecare element al listei v se află în intervalul [0, 1000000000]. Dacă datele sunt valide, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția find_identical_sequence primește n și v și parcurge fiecare posibilă subsecvență a lui v. Dacă subsecvența este identică cu inversul ei și este mai mare decât lungimea maximă găsită până acum, actualizează lungimea maximă și poziția de început și sfârșit a secvenței. Dacă nu se găsește o secvență identică, funcția returnează None.&lt;br /&gt;
&lt;br /&gt;
În funcția if __name__ == &amp;quot;__main__&amp;quot;, citim n și v și verificăm dacă datele sunt valide. Dacă sunt, apelăm find_identical_sequence și afișăm secvența identică dacă există. Altfel, afișăm un mesaj de eroare corespunzător.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0522_-_kSecventa1&amp;diff=6413</id>
		<title>0522 - kSecventa1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0522_-_kSecventa1&amp;diff=6413"/>
		<updated>2023-05-14T20:02:49Z</updated>

		<summary type="html">&lt;p&gt;Flaviu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/522/ksecventa1 0522 - kSecventa1]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale, și un număr k. Să se stabilească dacă în vector există două secvențe de lungime k identice.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele n și k, iar apoi n numere naturale, reprezentând elementele vectorului.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&#039;&#039;&#039;, apoi pe un rând nou &#039;&#039;&#039;Programul va afișa pe ecran numerele i j, i &amp;lt; j reprezentând pozițiile de început a două secvențe de lungime k identice, dacă există două astfel de secvențe&#039;&#039;&#039;, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: &#039;&#039;&#039;&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ k &amp;lt; n ≤ 1000, k este divizor al lui n&lt;br /&gt;
* cele n numere citite vor fi mai mici decât 1000&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 12 5&lt;br /&gt;
: 2 3 1 1 4 3 1 1 4 3 8 8 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: 2 6&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 12 5&lt;br /&gt;
: 2 3 1 1 4 3 1 1 4 3 8 8 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
=== Rezolvare ver. 1 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 0522 - kSecventa1&lt;br /&gt;
def gaseste_secvente_identice(n, k, v):&lt;br /&gt;
    if n % k != 0:&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0, n-k+1):&lt;br /&gt;
        if v[i:i+k] in [v[j:j+k] for j in range(i+1, n-k+1)]:&lt;br /&gt;
            return f&amp;quot;{i+1} {v.index(v[i:i+k], i+1)+1}&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Nu exista secvente identice.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def valideaza_date_intrare(n, k, v):&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt; n &amp;lt;= 1000 and n % k == 0):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(x &amp;gt;= 1000 for x in v):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n, k = map(int, input().split())&lt;br /&gt;
    v = list(map(int, input().split()))&lt;br /&gt;
    &lt;br /&gt;
    if valideaza_date_intrare(n, k, v):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        print(gaseste_secvente_identice(n, k, v))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Explicatie Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
Funcția gaseste_secvente_identice primește trei argumente: n - numărul de elemente din șirul dat, k - lungimea secvenței identice și v - șirul de numere. Dacă n nu este un multiplu de k, funcția returnează un mesaj de eroare. Apoi, cu ajutorul două loop-uri, caută toate secvențele de lungime k și le compară cu toate secvențele de lungime k din dreapta sa. Dacă găsește o secvență identică, returnează pozițiile unde a fost găsită. Dacă nu găsește nicio secvență identică, funcția returnează un mesaj corespunzător.&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_date_intrare primește aceleași argumente ca și gaseste_secvente_identice și verifică dacă datele de intrare corespund cerințelor problemei. Dacă nu respectă aceste condiții, funcția returnează False. Altfel, returnează True.&lt;br /&gt;
&lt;br /&gt;
În if __name__ == &amp;quot;__main__&amp;quot;: se citește de la tastatură valorile lui n, k și șirul v. Apoi, se verifică dacă datele sunt introduse corect cu ajutorul funcției valideaza_date_intrare. Dacă da, se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; și se apelează funcția gaseste_secvente_identice. Dacă nu, se afișează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Flaviu</name></author>
	</entry>
</feed>