<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2454_-_Bsrec</id>
	<title>2454 - Bsrec - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2454_-_Bsrec"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2454_-_Bsrec&amp;action=history"/>
	<updated>2026-05-01T07:45:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2454_-_Bsrec&amp;diff=9559&amp;oldid=prev</id>
		<title>Raul: Pagină nouă: Fie un vector &lt;code&gt;v&lt;/code&gt; sortat crescător cu &lt;code&gt;N&lt;/code&gt; elemente naturale nenule distincte pe care nu le cunoaştem, dar pe care ne propunem să le determinăm. Având la dispoziţie acest vector &lt;code&gt;v&lt;/code&gt;, cu ajutorul următorului algoritm de căutare binară (vezi Figura 1)  putem răspunde la queryuri de forma: Dându-se un număr &lt;code&gt;X&lt;/code&gt; şi un interval &lt;code&gt;[a, b]&lt;/code&gt; se cere să se determine cel mai mic element mai mare decât &lt;code&gt;X&lt;/code&gt; afl...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2454_-_Bsrec&amp;diff=9559&amp;oldid=prev"/>
		<updated>2024-01-31T15:34:57Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Fie un vector &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; sortat crescător cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente naturale nenule distincte pe care nu le cunoaştem, dar pe care ne propunem să le determinăm. Având la dispoziţie acest vector &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;, cu ajutorul următorului algoritm de căutare binară (vezi Figura 1)  putem răspunde la queryuri de forma: Dându-se un număr &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; şi un interval &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; se cere să se determine cel mai mic element mai mare decât &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; afl...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Fie un vector &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; sortat crescător cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente naturale nenule distincte pe care nu le cunoaştem, dar pe care ne propunem să le determinăm. Având la dispoziţie acest vector &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;, cu ajutorul următorului algoritm de căutare binară (vezi Figura 1)&lt;br /&gt;
&lt;br /&gt;
putem răspunde la queryuri de forma: Dându-se un număr &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; şi un interval &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; se cere să se determine cel mai mic element mai mare decât &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; aflat în intervalul determinat de indicii &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, interval din vectorul &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;. Se cunosc paşii pe care algoritmul de cautare binară i-a urmat pentru diferite valori ale tripletului &amp;lt;code&amp;gt;(X, a, b)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (lungimea vectorului), &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; (numărul de query-uri apelate) şi cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; query-uri, să se determine vectorul iniţial. Dacă există mai multe soluţii se va afişa soluţia minim lexicografică. Dacă nu există soluţie se va afişa valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;. Un vector &amp;lt;code&amp;gt;V1&amp;lt;/code&amp;gt; se consideră mai mic lexicografic decât un alt vector &amp;lt;code&amp;gt;V2&amp;lt;/code&amp;gt; dacă există un indice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; astfel încât: &amp;lt;code&amp;gt;V1[1] = V2[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;V1[2] = V2[2]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;V1[i-1] = V2[i-1]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V1[i] &amp;lt; V2[i]&amp;lt;/code&amp;gt;. Cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; query-uri sunt formate din:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; – valoarea pe care o căutăm binar în vector&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; – numărul de iteraţii în algoritmul de căutare binară&lt;br /&gt;
* &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; – intervalul în care se aplică algoritmul de cautare binară (perechea &amp;lt;code&amp;gt;(a, b)&amp;lt;/code&amp;gt; este considerată prima iteraţie în algoritm)&lt;br /&gt;
* &amp;lt;code&amp;gt;M-1&amp;lt;/code&amp;gt; perechi de indici reprezentând valorile afişate de algoritmul de căutare binară în urma fiecărei iteraţii&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;bsrec.in&amp;lt;/code&amp;gt; conține pe prima linie o valoare &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; reprezentând numărul de teste ce vor fi efectuate. Pentru fiecare din cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; teste se va citi de pe prima linie valoarea &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (numărul de elemente ale vectorului), respectiv &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; (numărul de query-uri), despărţite prin câte un spaţiu. Următoarele linii descriu cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; query-uri. În cadrul unui query, prima linie va conține o pereche de numere &amp;lt;code&amp;gt;(X, M)&amp;lt;/code&amp;gt; despărţite printr-un spaţiu, unde &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă valoarea căutată în vector, iar &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numărul de paşi efectuaţi în căutarea binară a celei mai mici valori din vector care este mai mare decât &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;. Pe următoarea linie a query-ului se găseşte perechea de valori &amp;lt;code&amp;gt;(a, b)&amp;lt;/code&amp;gt; având semnificaţia de mai sus. Următoarele &amp;lt;code&amp;gt;M-1&amp;lt;/code&amp;gt; linii conţin perechi &amp;lt;code&amp;gt;(st, dr)&amp;lt;/code&amp;gt; de valori naturale despărţite prin câte un spaţiu care reprezintă indicii stânga, respectiv dreapta ce sunt afişaţi în urma fiecărei iteraţii a algoritmului de mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;bsrec.out&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii, linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; conţinând răspunsul pentru testul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Dacă testul admite soluţie, se vor afişa &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale nenule strict crescătoare ce vor reprezenta valorile vectorului &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;. Deoarece există mai multe soluţii, se va afişa soluţia minim lexicografică. Dacă testul NU admite soluţie, se va afişa &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, Q ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ X ≤ 1 000 000 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ st ≤ dr ≤ N&amp;lt;/code&amp;gt;, cu excepţia ultimei perechi din căutarea binară unde &amp;lt;code&amp;gt;st &amp;gt; dr&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;20%&amp;lt;/code&amp;gt; din punctajul total există teste cu &amp;lt;code&amp;gt;1 ≤ N, Q ≤ 10&amp;lt;/code&amp;gt; şi soluţia minim lexicografică admite valori până în &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se garantează că &amp;lt;code&amp;gt;M ≤ 15&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;bsrec.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 5 3&lt;br /&gt;
 3 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 2 1&lt;br /&gt;
 30 3&lt;br /&gt;
 2 4&lt;br /&gt;
 4 4&lt;br /&gt;
 5 4&lt;br /&gt;
 25 2&lt;br /&gt;
 4 5&lt;br /&gt;
 4 3&lt;br /&gt;
 5 3&lt;br /&gt;
 30 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 2 1&lt;br /&gt;
 3 3&lt;br /&gt;
 2 4&lt;br /&gt;
 4 4&lt;br /&gt;
 5 4&lt;br /&gt;
 5 2&lt;br /&gt;
 4 5&lt;br /&gt;
 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;bsrec.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 3 4 25 26&lt;br /&gt;
 -1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Fișierul conține două teste.&lt;br /&gt;
&lt;br /&gt;
Primul test are trei query-uri:&lt;br /&gt;
&lt;br /&gt;
- Primul query caută binar valoarea &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; în intervalul &amp;lt;code&amp;gt;[1,5]&amp;lt;/code&amp;gt; și face &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; iterații&lt;br /&gt;
&lt;br /&gt;
- Cel de al doilea query caută binar valoarea &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; pe intervalul &amp;lt;code&amp;gt;[2,4]&amp;lt;/code&amp;gt; și face &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; iterații&lt;br /&gt;
&lt;br /&gt;
- Cel de al treilea query caută binar valoarea &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; pe intervalul &amp;lt;code&amp;gt;[4,5]&amp;lt;/code&amp;gt; și face &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; iterații&lt;br /&gt;
&lt;br /&gt;
Cel de al doilea test are &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; query-uri, dar NU admite soluție.&lt;br /&gt;
&lt;br /&gt;
== Încărcare soluție ==&lt;br /&gt;
&lt;br /&gt;
=== Lipește codul aici ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
NMAX = 1005&lt;br /&gt;
INF = 1000000007&lt;br /&gt;
&lt;br /&gt;
tests, n, q = 0, 0, 0&lt;br /&gt;
up, down, left, right, sol = [0] * NMAX, [0] * NMAX, [0] * NMAX, [0] * NMAX, [0] * NMAX&lt;br /&gt;
&lt;br /&gt;
def read_and_restrict():&lt;br /&gt;
    value, steps = map(int, input().split())&lt;br /&gt;
    for i in range(1, steps + 1):&lt;br /&gt;
        left[i], right[i] = map(int, input().split())&lt;br /&gt;
    for i in range(1, steps):&lt;br /&gt;
        if left[i] == left[i + 1]:&lt;br /&gt;
            down[right[i + 1] + 1] = max(down[right[i + 1] + 1], value)&lt;br /&gt;
        else:&lt;br /&gt;
            up[left[i + 1] - 1] = min(up[left[i + 1] - 1], value - 1)&lt;br /&gt;
&lt;br /&gt;
def set_restrictions():&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        down[i] = 0&lt;br /&gt;
        up[i] = INF&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    sys.stdin = open(&amp;#039;bsrec.in&amp;#039;, &amp;#039;r&amp;#039;)&lt;br /&gt;
    sys.stdout = open(&amp;#039;bsrec.out&amp;#039;, &amp;#039;w&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    tests = int(input())&lt;br /&gt;
    for _ in range(tests):&lt;br /&gt;
        n, q = map(int, input().split())&lt;br /&gt;
        set_restrictions()&lt;br /&gt;
        for _ in range(q):&lt;br /&gt;
            read_and_restrict()&lt;br /&gt;
        have_sol = 1&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            sol[i] = max(sol[i - 1] + 1, down[i])&lt;br /&gt;
            if sol[i] &amp;gt; up[i]:&lt;br /&gt;
                have_sol = 0&lt;br /&gt;
        if not have_sol:&lt;br /&gt;
            print(&amp;quot;-1&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                print(sol[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
            print()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raul</name></author>
	</entry>
</feed>