Кесинди дарагы
Кесинди дарагы: кесиндидеги сумма жана чекитти жаңылоо 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) убакытта өзгөртө алат — андай маселеге туш болгондо үйрөнүңүз.
Тапшырма: даракты кесиндидеги МАКСИМУМГА кайра жасаңыз (үч оңдоо: операция, нейтралдуу элемент, чыгаруу) жана өз мисалыңызда текшериңиз.
Сабакты өттүм деп белгилеңиз.