Modifikácie

Pozrime sa teraz bližšie na to, akými rôznymi spôsobmi môžeme meniť prvky v treťom druhu požiadaviek. Na to budeme potrebovať niektoré veci trochu formálnejšie pooznačovať.

Prvky postupnosti, ktorú náš strom reprezentuje, budeme naďalej volať $p_0, p_1, \dots, p_{n-1}$. Operáciu, ktorú tento strom počíta označme všeobecne ako $\circ$. V prípade súčtového stromu teda symbol $\circ$ bude znamenať $+$, v prípade súčinového bude znamenať $\cdot$ (krát),

v prípade maximového bude znamenať binárne maximum (teda operáciu, ktorá vráti väčšie z dvoch čísel). Náš strom teda dokáže pre zadaný interval $[l, r)$ v logaritmickom čase vypočítať hodnotu $$p_l \circ p_{l+1} \circ p_{l+2} \circ \dots \circ p_{r-1} \text{.}$$

Zmenu, ktorú robíme s prvkami v treťom druhu požiadaviek definujeme formálne pomocou ďalšej binárnej operácie $*$ (ktorá môže byť aj rovnaká ako $\circ$). Tretí druh požiadavky teda bude vyzerať nasledovne:

  1. Pre dané indexy $l, r$ a hodnotu $v$ zmeň každý prvok $p_i$ s indexom $i$ z intervalu $[l, r)$ na $p_i * v$.

V prípade, ktorý sme popisovali v tomto texte, teda oparácia $\circ$ bola $+$ (sčítanie) a operácia $*$ bola $\cdot$ (násobenie).

Na to, aby sme mohli napísať intervalový strom s lazy propagation pre nejaké dve operácie $\circ$ a $*$, musia platiť nasledovné veci:

  1. Operácia $\circ$ musí byť asociatívna a pre dané $x, y$ musíme vedieť v konštantnom čase vypočítať $x \circ y$. Táto podmienka musí platiť, aby bolo vôbec možné napísať $\circ$-ový intervalový strom (aj bez lazy propagation).
  2. Ak poznáme hodnoty $l, r, v$ a hodnotu $p_l \circ p_{l+1} \circ p_{l+2} \circ \dots \circ p_{r-1}$, vieme v konštantnom čase vypočítať hodnotu $(p_l * v) \circ (p_{l+1} *v) \circ (p_{l+2} * v) \circ \dots \circ (p_{r-1} * v)$. Toto musí platiť, aby leniví úradníci vedeli aktualizovať svoju hodnotu aj bez toho, aby museli svojim podriadeným hovoriť, že majú zmeniť hodnoty prvkov vo svojich úsekoch.
  3. Ak poznáme hodnoty $v_1$ a $v_2$, potom vieme v konštantnom čase vypočítať hodnotu $v_3$ takú, že $(x * v_1) * v_2 = x * v_3$ pre každú možnú hodnotu $x$. Toto potrebujeme, aby si leniví úradníci vedeli zmeniť

    hodnotu vo svojom diári, keď im príde tesne po sebe viacero požiadaviek na zmenu celého ich úseku.

Pre získanie lepšej predstavy sa teraz pozrime na niekoľko konkrétnych príkladov operácií $\circ$ a $*$:

  • V súčtovom intervalovom strome (teda keď $\circ$ je $+$) môžeme za operáciu $*$ zobrať napríklad

    • sčítanie (budeme vedieť spracúvať požiadavky typu ,,pripočítaj $v$ ku všetkým prvkom s indexami z intervalu $[l, r)$'')
    • násobenie (,,vynásob všetky prvky z intervalu $[l, r)$ hodnotou $v$'')
    • operáciu ,,vráť druhý prvok'' (teda operáciu $*$ definovanú ako $x * y = y$). To nám v strome umožní spracúvať požiadavky typu ,,zmeň všetky prvky z intervalu [l, r) na hodnotu $v$''.
    • V maximovom intervalovom strome môžeme za operáciu $*$ zobrať napríklad
    • sčítanie
    • násobenie kladným číslom
    • ,,vráť druhý prvok''
    • binárne maximum (to nám umožní požiadavky typu ,,všetky prvky z intervalu $[l, r)$ menšie ako $v$ zmeň na $v$'').

    • binárne minimum