Asosiy tarkibga o‘tish

O‘rganish

Kirish
Qo‘llanma

Qo‘llanma · Dasturlash

segment-tree

Masalalar tez orada

Nazariya

Segmentlar daraxti — massivda ikki xil amalni O(log n) da bajaradi: elementni o‘zgartirish va oraliq bo‘yicha so‘rov (yig‘indi, minimum, maksimum). Prefiks yig‘indi faqat o‘zgarmas massivda ishlaydi; o‘zgarishlar bo‘lsa — segmentlar daraxti.

size = 1
while size < n:
    size *= 2
t = [float("inf")] * (2 * size)
t[size:size + n] = a
for i in range(size - 1, 0, -1):
    t[i] = min(t[2 * i], t[2 * i + 1])

def update(i, x):
    i += size; t[i] = x
    while i > 1:
        i //= 2
        t[i] = min(t[2 * i], t[2 * i + 1])

def query(l, r):                 # [l, r)
    res, l, r = float("inf"), l + size, r + size
    while l < r:
        if l & 1: res = min(res, t[l]); l += 1
        if r & 1: r -= 1; res = min(res, t[r])
        l //= 2; r //= 2
    return res

Faqat yig‘indi va nuqtali o‘zgarish kerak bo‘lsa, qisqaroq Fenwick daraxti ham yetadi.

Bu mavzu bo‘yicha masalalar tez orada qo‘shiladi.

Shu mavzu kirgan kurslar

Menyu

Ko‘rinish

Klaviatura yorliqlari

Ctrl K yoki /
Qidirish va buyruqlar
g h
Bosh sahifa
g p
Masalalar
g c
Musobaqalar
g r
Reyting
Ctrl Enter
Masala sahifasida — yechimni yuborish
?
Shu oyna