Кесинди дарагы

Кесинди дарагы: кесиндидеги сумма жана чекитти жаңылоо O(log n) убакытта.

Префикстик суммалар «кесиндидеги суммага» O(1) убакытта жооп берет, бирок массив ӨЗГӨРӨ баштаганда эле бузулат: бир жаңылоо — бардык префикстерди кайра эсептөө. Кесинди дарагы суроону да, жаңылоону да O(log n) убакытта жасайт. Идея: массивдин үстүнө экилик дарак курулат; ар бир чоку өз кесиндисинин суммасын сактайт. Тамыр — бүт массивдин суммасы, жалбырактар — өзүнчө элементтер. • элементти жаңылоо жалбырактан тамырга чейинки жолдогу чокуларга гана тиет — алар O(log n); • [l, r] суроосу дарактын O(log n) даяр кесиндисине ажырайт.

Киргизиңиз: 5 3, массив 1 2 3 4 5, андан кийин: sum 2 4 / set 3 10 / sum 2 4

Мисалды иштетиңиз: [2,4] суммасы адегенде 9, set 3 10 кийин 16 болот. Кодду кантип окуу керек: • v чокусу [tl, tr] кесиндисине жооп берет; балдары — кесиндинин жарымдары, номерлери 2v жана 2v+1; • өлчөмү 4n болгон tree массиви бүт даракты кепилдик менен батырат; • query кесилишпеген кесиндилер үчүн 0 кайтарат — нөл сумма үчүн нейтралдуу. Кесинди дарагы — конструктор: + белгисин min же max менен (жана нейтралдуу элементти чексиздик менен) алмаштырыңыз — минимум/максимум суроолорун аласыз. «Жалкоо» жаңылоолору бар өркүндөтүлгөн версиясы бүтүн кесиндилерди O(log n) убакытта өзгөртө алат — андай маселеге туш болгондо үйрөнүңүз.
Тапшырма: даракты кесиндидеги МАКСИМУМГА кайра жасаңыз (үч оңдоо: операция, нейтралдуу элемент, чыгаруу) жана өз мисалыңызда текшериңиз. Сабакты өттүм деп белгилеңиз.
Доска