<?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=2091_-_Actualizare_Interval%2C_Minim_Interval</id>
	<title>2091 - Actualizare Interval, Minim Interval - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2091_-_Actualizare_Interval%2C_Minim_Interval"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2091_-_Actualizare_Interval,_Minim_Interval&amp;action=history"/>
	<updated>2026-06-17T06:08:55Z</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=2091_-_Actualizare_Interval,_Minim_Interval&amp;diff=9973&amp;oldid=prev</id>
		<title>AjM: Pagină nouă: == Enunt == Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui interval (schimbarea valorii tuturor elementelor aflate între două poziții date) și interogarea unui interval (determinarea celei mai mici valori aflate între două poziții date). == Cerinţa == Afișați răspunsurile la fiecare interogare. == Date de intrare == Prima linie a fisierului aimi.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2091_-_Actualizare_Interval,_Minim_Interval&amp;diff=9973&amp;oldid=prev"/>
		<updated>2024-06-03T15:50:37Z</updated>

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