<?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=2095_-_Descompunere_in_Intervale</id>
	<title>2095 - Descompunere in Intervale - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2095_-_Descompunere_in_Intervale"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2095_-_Descompunere_in_Intervale&amp;action=history"/>
	<updated>2026-05-01T06:37:58Z</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=2095_-_Descompunere_in_Intervale&amp;diff=9970&amp;oldid=prev</id>
		<title>AjM: Pagină nouă: == Enunt == Se dau numerele N și M și apoi M perechi de numere X, Y ambele valori fiind cuprinse între 1 și N. În această problemă numim interval o mulțime de numere naturale consecutive. Notăm [A, B] cu A &lt;= B ca fiind intervalul format din numerele A, A+1, A+2, ... B-1, B. Numim descompunere în intervale a unei perechi de numere X, Y ca fiind o mulțime de intervale care acoperă complet mulțimea (fiecare număr dintre X și Y, inclusiv, este conținut de exact u...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2095_-_Descompunere_in_Intervale&amp;diff=9970&amp;oldid=prev"/>
		<updated>2024-06-03T15:45:49Z</updated>

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