Skip to content

Instantly share code, notes, and snippets.

@murilomaeda
Created October 9, 2024 03:21
Show Gist options
  • Save murilomaeda/5b481f1d4815cf1f1ab8f0a84c78092c to your computer and use it in GitHub Desktop.
Save murilomaeda/5b481f1d4815cf1f1ab8f0a84c78092c to your computer and use it in GitHub Desktop.
//[ini,fim] é o intervalo representado pelo nó "pos" da seg
//queremos setar o intervalo [p,q] para ter pai igual a "val"
void update(int pos, int ini, int fim, int p, int q, int val)
{
//se o [ini,fim] e [p,q] são disjuntos, não faz nada
if(p > fim || q < ini) return;
//se [ini,fim] está inteiramente contido no intervalo [p,q]
if(p <= ini && fim <= q)
{
//com a observação, podemos só setar seg[pos] = val
//não é necessário descer para os filhos de pos
seg[pos] = min(seg[pos],val);
return;
}
int m = (ini + fim)/2;
int e = pos*2, d = pos*2 + 1;
//se não está inteiramente contido, desce até achar um que esteja inteiramente contido em [p,q].
update(e,ini,m,p,q,val);
update(d,m+1,fim,p,q,val);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment