On this page
article
SegTree Iterativa
Sobre
Consultas 0-based
Valores iniciais devem estar em (seg[n], … , seg[2*n-1])
Query: soma do range [a, b]
Update: muda o valor da posicao p para x
Complexidades:
build - O(n)
query - O(log(n))
update - O(log(n))
Link original: segTreeIterativa.cpp
Código
int seg[2 * MAX];
int n;
void build() {
for (int i = n - 1; i; i--) seg[i] = seg[2*i] + seg[2*i+1];
}
int query(int a, int b) {
int ret = 0;
for(a += n, b += n; a <= b; ++a /= 2, --b /= 2) {
if (a % 2 == 1) ret += seg[a];
if (b % 2 == 0) ret += seg[b];
}
return ret;
}
void update(int p, int x) {
seg[p += n] = x;
while (p /= 2) seg[p] = seg[2*p] + seg[2*p+1];
}