{"id":458,"date":"2022-12-07T07:33:29","date_gmt":"2022-12-07T07:33:29","guid":{"rendered":"https:\/\/solinfo.ro\/blog\/?p=458"},"modified":"2024-05-17T20:31:18","modified_gmt":"2024-05-17T20:31:18","slug":"structuri-de-date-arborescente-arbori-de-intervale","status":"publish","type":"post","link":"https:\/\/solinfo.ro\/blog\/structuri-de-date-arborescente-arbori-de-intervale\/","title":{"rendered":"Structuri de date arborescente &#8211; Arbori de intervale"},"content":{"rendered":"\n<p>Un arbore de intervale este o structur\u0103 de date similar\u0103 cu un arbore binar, \u00een care fiecare nod con\u0163ine informa\u0163ii despre un anumit interval dintr-un \u015fir. La cazul general, un nod re\u021bine informa\u021bii despre intervalul [st, dr]. Dac\u0103 intervalul asociat nodului are lungimea mai mare dec\u00e2t 1, nodului curent \u00eei vor fi asociate alte dou\u0103 noduri ce vor descrie intervalele [st, mid] \u0219i [mid + 1, dr], unde mid = (st + dr) \/ 2. <\/p>\n\n\n\n<p>Pentru a \u00een\u021belege mai bine cum arat\u0103 un astfel de arbore, vom considera \u0219irul cu 7 elemente <strong>v<\/strong> = (4, 3, -1, 2, 9, 10, 6). Vrem s\u0103 afl\u0103m suma elementelor dintr-un anumit interval de pozi\u021bii din \u0219irul <strong>v<\/strong>. Arborele de intervale asociat lui <strong>v<\/strong> va fi:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"727\" data-id=\"459\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-3-1024x727.png\" alt=\"\" class=\"wp-image-459\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-3-1024x727.png 1024w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-3-300x213.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-3-768x545.png 768w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-3-500x355.png 500w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-3.png 1109w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<p>Vom construi arborele recursiv, folosind un vector. Dimensiunea vectorului va fi <strong>4 * N<\/strong>, deoarece num\u0103rul de noduri este egal cu: <em><strong>1 + 2 + 4 + &#8230; + 2^[log2(N)] &lt; 2^([log2(N)] + 1) &lt; 4 * N<\/strong>.<\/em> Ulterior, vom vedea \u0219i ce opera\u021bii putem face cu acest arbore.<\/p>\n\n\n\n<p>Pentru a identifica nodurile, fiii nodului cu num\u0103rul <strong>k<\/strong> vor fi nodurile cu numerele <strong>2 * k (pentru nodul din st\u00e2nga), respectiv 2 * k + 1 (pentru nodul din dreapta).<\/strong> R\u0103d\u0103cina o vom numerota cu <strong>1<\/strong>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Construirea arborelui de intervale \u00een <strong>O(N)<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Vom construi arborele recursiv, folosind urm\u0103toarele observa\u021bii:<\/p>\n\n\n\n<p>a) dac\u0103 nodul curent descrie un interval cu un singur element, atunci el va lua valoarea din \u0219ir asociat\u0103 pozi\u021biei corespunz\u0103toare;<\/p>\n\n\n\n<p>b) dac\u0103 nodul curent descrie un interval cu mai multe elemente, atunci el va fi suma valorilor fiilor.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">void build(int node, int st, int dr) {\n\n    if(st == dr) {\n        \/\/ nodul curent descrie un interval de lungime 1\n\n        tree[node] = v[st]; \/\/ prelu\u0103m valoarea din vector\n        return;\n\n    }\n    \n    \/\/ \u00eemp\u0103r\u021bim intervalul curent \u00een doua subintervale\n    int mid = (st + dr) \/ 2;\n    build(2 * node, st, mid); \/\/mergem \u00een nodul din st\u00e2nga \u0219i construim primul subinterval\n    build(2 * node + 1, mid + 1, dr); \/\/ mergem \u00een nodul din dreapta \u0219i construim al doilea subinterval\n    \n    tree[node] = tree[2 * node] + tree[2 * node + 1]; \/\/ rezultatul pentru intervalul curent\n\n}<\/pre>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>Actualizarea unui element \u00een <strong>O(log2(N))<\/strong><\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p>Vom decide, pentru o pozi\u021bie dat\u0103 din \u0219ir, dac\u0103 ne mut\u0103m \u00een nodul din st\u00e2nga sau dreapta, \u00een func\u021bie de subintervalele asociate nodurilor. \u00cen acest mod, vom ajunge s\u0103 actualiz\u0103m rezultatele \u00een timp logaritmic.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">void update(int node, int st, int dr, int poz, int val){\n\n    if(st == dr){\n\n        \/\/ am ajuns \u00een nodul corespunz\u0103tor pozi\u021biei care-\u0219i schimb\u0103 valoarea\n        tree[node] = val;\n        return;\n\n    }\n\n    int mid = (st + dr) \/ 2;\n\n    if(poz &lt;= mid)\n \/\/ dac\u0103 pozi\u021bia pe care o caut\u0103m se afl\u0103 \u00een primul subinterval, vom merge \u00een nodul corespunz\u0103tor\n        update(2 * node, st, mid, poz, val);\n\n    if(poz &gt; mid) \/\/ dac\u0103 pozi\u021bia pe care o caut\u0103m se afl\u0103 \u00een al doilea subinterval, vom merge \u00een nodul corespunz\u0103tor\n        update(2 * node + 1, mid + 1, dr, poz, val);\n\n    tree[node] = tree[2 * node] + tree[2 * node + 1]; \/\/ refacem rezultatele din cauza modific\u0103rii aduse\n\n}<\/pre>\n\n\n\n<p>Dac\u0103 vrem s\u0103 modific\u0103m, de exemplu, valoarea de la pozi\u021bia 4, vom merge \u00een nodurile:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>1<\/strong>, care descrie intervalul <em>[1, 7]<\/em><\/li>\n\n\n\n<li><strong>2<\/strong>, care descrie intervalul <em>[1, 4]<\/em><\/li>\n\n\n\n<li><strong>5<\/strong>, care descrie intervalul <em>[3, 4]<\/em><\/li>\n\n\n\n<li><strong>11<\/strong>, care descrie intervalul <em>[4, 4]<\/em>, unde vom schimba valoarea asociata nodului cu parametrul <strong>val<\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"684\" data-id=\"460\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5-1024x684.png\" alt=\"\" class=\"wp-image-460\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5-1024x684.png 1024w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5-300x201.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5-768x513.png 768w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5-500x334.png 500w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5-370x247.png 370w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-5.png 1164w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Interogarea unui interval \u00een <strong>O(log2(N))<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Vom \u00eencerca s\u0103 descompunem intervalul despre care dorim s\u0103-i afl\u0103m suma \u00een subintervale disjuncte din arbore. Formal, vom descompune un interval <strong>[x, y]<\/strong> \u00een intervale de forma <strong>[x, y1], [y1 + 1, y2], [y2 + 1, y3], &#8230;, [yn + 1, y].<\/strong> De exemplu, intervalul <em>[2, 5]<\/em> se descompune \u00een: <em>[2, 2], [3, 4], [5, 5].<\/em> Fiecare interval se va descompune \u00een cel mult <em>2[log2(N)] <\/em>intervale. R\u0103spunsul interog\u0103rii va fi suma valorilor din nodurile ale c\u0103ror reuniune de intervale asociate d\u0103 exact intervalul <em>[x, y].<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int query(int node, int st, int dr, int x, int y){\n\n    if(x &lt;= st &amp;&amp; dr &lt;= y) \/\/ m\u0103 aflu \u00eentr-un subinterval care este inclus in intervalul de interogare( de exemplu, [3, 4] este inclus in [2,5])\n        return tree[node];\n\n    int mid = (st + dr) \/ 2, r1 = 0, r2 = 0;\n\n    if(x &lt;= mid) \/\/ dac\u0103 mai exist\u0103 o por\u021biune din intervalul de interogare \u00een primul subinterval, preiau rezultatul\n        r1 = query(2 * node, st, mid, x, y);\n\n    if(y &gt; mid) \/\/ dac\u0103 mai exist\u0103 o por\u021biune din intervalul de interogare \u00een al doilea subinterval, preiau rezultatul\n        r2 = query(2 * node + 1, mid + 1, dr, x, y);\n\n    return r1 + r2; \/\/ combin rezultatele\n\n}<\/pre>\n\n\n\n<p>Pentru intervalul de interogare <em>[2, 5]<\/em>, avem:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nodul <strong>1<\/strong> cu intervalul <em>[1, 7]<\/em> care nu este inclus \u00een <em>[2, 5]<\/em>, deci \u00eel vom \u00eemp\u0103r\u021bi \u0219i verific\u0103m dac\u0103 subintervalele rezultate se <strong>suprapun<\/strong> cu <em>[2, 5]<\/em>. Subintervalele sunt <em>[1, 4]<\/em> \u0219i <em>[5, 7]<\/em>, deci vom merge \u00een ambele, pe r\u00e2nd;<\/li>\n\n\n\n<li>Nodul <strong>2<\/strong> cu intervalul <em>[1, 4]<\/em> care nu este inclus \u00een <em>[2, 5]<\/em>, deci aplic\u0103m acela\u0219i procedeu ca mai sus. Subintervalele sunt <em>[1, 2]<\/em> \u0219i <em>[3, 4]<\/em>, deci, din nou, vom merge \u00een ambele;<\/li>\n\n\n\n<li>Nodul <strong>4<\/strong> cu intervalul<em> [1, 2] <\/em>care nu este inclus \u00een <em>[2, 5]<\/em>. Subintervalele sunt <em>[1, 1]<\/em> \u0219i <em>[2, 2]<\/em>. Decidem deci s\u0103 mergem doar \u00een intervalul <em>[2, 2]<\/em>, fiind singurul care se suprapune cu <em>[2, 5]<\/em>;<\/li>\n\n\n\n<li>Nodul <strong>9<\/strong> cu intervalul <em>[2, 2]<\/em>. Este un interval inclus \u00een <em>[2, 5]<\/em>, deci adun\u0103m valorea din nod <strong><em>=&gt; <span style=\"text-decoration: underline;\">3<\/span><\/em><\/strong>;<\/li>\n\n\n\n<li>Revenim din <em>[2, 2]<\/em> \u00een <em>[1, 2]<\/em>, apoi \u00een <em>[1, 4]<\/em> \u0219i mergem \u00een nodul <strong>5<\/strong> cu intervalul asociat <em>[3, 4]<\/em>, care este inclus \u00een <em>[2, 5]<\/em>, deci vom aduna valorea din nou <strong><em>=&gt; <span style=\"text-decoration: underline;\">1<\/span><\/em><\/strong>;<\/li>\n\n\n\n<li>Revenim din <em>[3, 4]<\/em> \u00een <em>[1, 4]<\/em>, pentru care rezultatul este <strong>1 + 3 = 4 (suma elementelor intervalului rezultat din suprapunerea lui [2, 5] cu [1, 4])<\/strong>, apoi \u00een <em>[1, 7]<\/em>. Mergem \u00een nodul <strong>3<\/strong> cu intervalul asociat <em>[5, 7]<\/em>, care nu este inclus \u00een <em>[2, 5]<\/em>. Subintervalele sunt <em>[5, 6]<\/em> \u0219i <em>[7, 7]<\/em>. Singurul care se suprapune cu <em>[2, 5]<\/em> este <em>[5, 6]<\/em>.<\/li>\n\n\n\n<li>Nodul <strong>6<\/strong> cu intervalul <em>[5, 6]<\/em> care nu este inclus \u00een <em>[2, 5]<\/em>. Subintervalele sunt <em>[5, 5]<\/em> \u0219i <em>[6, 6]<\/em>. Decidem s\u0103 mergem doar \u00een intervalul <em>[5, 5]<\/em>.<\/li>\n\n\n\n<li>Nodul <strong>12<\/strong> cu intervalul <em>[5, 5]<\/em> care este inclus \u00een <em>[2, 5]<\/em>, deci adun\u0103m valorea din nod <em><strong>=&gt; <span style=\"text-decoration: underline;\">9<\/span><\/strong><\/em>;<\/li>\n\n\n\n<li>Revenim din <em>[5, 5]<\/em> \u00een <em>[5, 6]<\/em>, pentru care rezultatul este <strong>9 (suma elementelor intervalului rezultat din suprapunerea lui [2, 5] cu [5, 6])<\/strong>, apoi \u00een <em>[5, 7]<\/em> (cu acela\u0219i rezultat) \u0219i \u00een final \u00een <em>[1, 7]<\/em>, pentru care avem rezultatul <strong>4 + 9 = 13 (suma elementelor din [2, 5])<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Actualizarea unui interval de elemente \u00een <strong>O(log2(N))) &#8211; lazy update<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Dac\u0103 dorim s\u0103 actualiz\u0103m un anumit interval de elemente\/pozi\u021bii din vector, o abordare ca cea de mai sus ne va duce la  o complexitate prea mare (este ineficient pentru un interval <em>[x, y]<\/em> pe care vrem s\u0103-l actualiz\u0103m cu o valoare <strong>val<\/strong>, s\u0103 parcurgem fiecare pozi\u021bie din acel interval). Ca urmare, vom folosi tehnica <em>&#8222;lazy update&#8221;<\/em>, care se refer\u0103 la propagarea actualiz\u0103rilor de la cele mai mari intervale incluse \u00een <em>[x, y]<\/em> spre fiii lor, \u00een jos. Pe l\u00e2ng\u0103 arborele de intervale principal, \u00een care re\u021binem rezultatele, vom construi un al doilea arbore de intervale care ne va ajuta s\u0103 re\u021binem cu ce valoare trebuie s\u0103 actualiz\u0103m elementele din intervalul asociat unui nod. Dup\u0103 ce actualiz\u0103m elementele, vom &#8222;propaga&#8221; valoarea de actualizare, re\u021binut\u0103 \u00een al doilea arbore (ex: <strong>lazy[node])<\/strong> c\u0103tre fii, adic\u0103 <strong>lazy[2 * node], respectiv lazy[2 * node + 1], \u0219i vom pierde valoarea din lazy[node] (eliber\u0103m lazy[node] de toate actualiz\u0103rile necesare intervalului pe care-l descrie &#8222;node&#8221;, \u00eentruc\u00e2t le-am trimis fiilor lui).<\/strong><\/p>\n\n\n\n<p>Aceast\u0103 opera\u021bie poate fi vizualizat\u0103 mai jos, unde este prezentat arborele de intervale <strong>lazy[]<\/strong>, \u00eenainte \u0219i dup\u0103 propagarea valorii (<em>adic\u0103 5<\/em>) cu care trebuie actualizat intervalul <em>[3, 4]<\/em>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"669\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-8-1024x669.png\" alt=\"\" class=\"wp-image-469\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-8-1024x669.png 1024w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-8-300x196.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-8-768x502.png 768w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-8-500x327.png 500w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-8.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\u00eenainte de propagare<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"665\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-17.png\" alt=\"\" class=\"wp-image-491\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-17.png 889w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-17-300x224.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-17-768x574.png 768w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/12\/Screenshot-17-500x374.png 500w\" sizes=\"auto, (max-width: 889px) 100vw, 889px\" \/><figcaption class=\"wp-element-caption\">dup\u0103 propagare<\/figcaption><\/figure>\n\n\n\n<p>Func\u021bia care ne ajut\u0103 s\u0103 actualiz\u0103m rezultatele folosind arborele <strong>lazy[]<\/strong> arat\u0103 astfel:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">void update_lazy(int node, int st, int dr){\n\n    \/\/ aten\u021bie! vectorul <strong>lazy[]<\/strong> trebuie ini\u021bializat \u00een totalitate cu -1 \u00eenaintea efectu\u0103rii oric\u0103rei opera\u021bii pe arbore pentru a se p\u0103stra proprietatea de mai jos\n\n    if(lazy[node] == -1) \/\/ nu avem nimic de actualizat \u00een intervalul curent (putem folosi o alt\u0103 valoare care NU se afl\u0103 \u00een intervalul valorilor posibile la actualizare)\n        return;\n\n    tree[node] = (dr - st + 1) * lazy[node]; \/\/ actualiz\u0103m rezultatele din nodul curent cu valoarea de actualizare * c\u00e2te elemente sunt \u00een interval, \u00eentruc\u00e2t fiecare element se modific\u0103\n\n    if(st != dr){ \/\/ exist\u0103 fii\n\n       \n        \/\/ trimitem valoarea cu care actualiz\u0103m c\u0103tre fiii nodului curent\n        lazy[2 * node] = lazy[node];\n        lazy[2 * node + 1] = lazy[node];\n\n    }\n\n    lazy[node] = -1; \/\/ pierdem valoarea cu care actualiz\u0103m\n\n}<\/pre>\n\n\n\n<p>Ca urmare, func\u021bia de actualizare va suferi modific\u0103ri:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">void update(int node, int st, int dr, int x, int y, int val){\n\n    \/\/ verific\u0103m dac\u0103 trebuie s\u0103 actualiz\u0103m intervalul curent cu o anumit\u0103 valoare\n    update_lazy(node, st, dr);\n\n    if(x &lt;= st &amp;&amp; dr &lt;= y){\n        \n        \/\/ m\u0103 aflu \u00eentr-un interval inclus \u00een intervalul de actualizat (unul dintre intervalele de lungime maxim\u0103 din arbore care este inclus \u00een <em>[x, y] - intervalul de actualizat)<\/em>\n\n        lazy[node] = val; \/\/ modific cu actualizarea curent\u0103\n        update_lazy(node, st, dr); \/\/ voi propaga actualizarea c\u0103tre fii\n\n        return;\n\n    }\n\n    int mid = ((st + dr) &gt;&gt; 1);\n\n    if(x &lt;= mid)\n        update(2 * node, st, mid, x, y, val);\n\n    if(y &gt; mid)\n        update(2 * node + 1, mid + 1, dr, x, y, val);\n\n     \n    \/\/ acum vom propaga eventualele rezultate din fii c\u0103tre urm\u0103toarele noduri\n    update_lazy(2 * node, st, mid);\n    update_lazy(2 * node + 1, mid + 1, dr);\n\n    tree[node] = tree[2 * node] + tree[2 * node + 1]; \/\/ refacem rezultatele\n\n}<\/pre>\n\n\n\n<p><strong>ATEN\u021aIE: dup\u0103 cum se observ\u0103, update_lazy() \u0219i update() sunt func\u021bii diferite! <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>update() ajut\u0103 la actualizarea intervalelor de lungime maxim\u0103 din arbore care sunt incluse \u00een intervalul de actualizat;<\/strong><\/li>\n\n\n\n<li><strong>update_lazy() ajut\u0103 la propagarea rezultatelor.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Interog\u0103rile vor ar\u0103ta un pic diferit: la fel ca func\u021bia de actualizare, \u00eenainte s\u0103 return\u0103m un rezultat dintr-un nod, verific\u0103m dac\u0103 trebuie actualizat cu o anumit\u0103 valoare.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int query(int node, int st, int dr, int x, int y){\n\n    \n    \/\/ verific\u0103m dac\u0103 este nevoie de actualiz\u0103ri ale rezultatelor\n    update_lazy(node, st, dr);\n\n    if(x &lt;= st &amp;&amp; dr &lt;= y)\n        return tree[node];\n\n    int mid = (st + dr) \/ 2, r1 = 0, r2 = 0;\n\n    if(x &lt;= mid)\n        r1 = query(2 * node, st, mid, x, y);\n\n    if(y &gt; mid)\n        r2 = query(2 * node + 1, mid + 1, dr, x, y);\n\n    return r1 + r2;\n\n}<\/pre>\n\n\n\n<p>Autor: Pirnog Theodor Ioan<\/p>\n\n\n\n<p>Colegiul Na\u021bional &#8222;B. P. Hasdeu&#8221; Buz\u0103u<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un arbore de intervale este o structur\u0103 de date similar\u0103 cu un arbore binar, \u00een care fiecare nod con\u0163ine informa\u0163ii &hellip; <\/p>\n","protected":false},"author":3,"featured_media":479,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-458","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/comments?post=458"}],"version-history":[{"count":23,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions"}],"predecessor-version":[{"id":496,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions\/496"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/media\/479"}],"wp:attachment":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/media?parent=458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/categories?post=458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/tags?post=458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}