[Шаблон] сегмент дерева (Luogu P3372)

# include <cstdio>
 #define N 1000010 
ЬурейеЕ долго  долго LL; 

LL п, т, выбрать, р, Q, S; 
LL A [N], добавить [N << 2 ], сумма [Н << 2 ]; 

пустоты сборки (LL я, LL л, Л.Л. г) {//建树
     , если (л == г) { 
        сумма [I] = а [л];
        вернуться ; 
    } 
LL середине
= (L + R) >> 1 ; построить (я << 1 , л, средний); построить (я << 1 | 1 , середина + 1 , г);
сумма [я]
= Сумма [я << 1 ] + сумма [я << 1 | 1 ]; } Недействительными PLU (LL я, LL л, Л.Л. г, Л.Л. v) {//加法运算 добавить [I] + = v; сумма [я] + = (г - L + 1 ) * v; } Недействительными магазинный (LL я, LL л, Л.Л. г, LL среднего) {//维护Ленивый-тега , если (добавить [я] == 0 ) возвращение ;
PLU (я
<< 1 , л, в середине, добавьте [I]);
пьет (я
<< 1 | 1 , середина + 1 , г, добавить [я]);
добавьте [I]
= 0 ; } LL запросов (LL я, LL л, Л.Л. г, LL х, у LL) {//询问区间和 , если (л> = х && г <= у) возврат суммы [I];
LL середина
= (L + R) >> 1, ANS = 0 ; магазинный (I, L, R, середина);
если (х <= середина) ANS + = запрос (я << 1 , л, в середине, х, у); если (у> середина) ANS + = запрос (я << 1 | 1 , середина + 1 , г, х, у);
вернуться анс; } Недействительными изменения (LL я, LL л, Л.Л. г, LL х, у LL, LL v) {//更新区间 , если (л> = х && г <= у) { PLU (I, L, R, V) ; вернуть; }
LL середине
= (L + R) >> 1 ; магазинный (I, L, R, середина);
если (х <= середина) изменение (я << 1 , л, в середине, х, у, у); если (у> середины) изменить (я << 1 | 1 , середина + 1 , г, х, у, v);
сумма [я]
= сумма [я << 1 ] + сумма [я << 1 | 1 ]; } INT основных () {
зсапЕ (
" % LLD% LLD " , & п, & м); для (LL я = 1 ; г <= п; я ++) зсапЕ ( ", &а [I]); построить ( 1 , 1 , п);
в то время как (m-- ) { зсапЕ ( " % LLD " , & опт);
если (неавтоматического == 1 ) { зсапЕ ( " % LLD% LLD% LLD " , & р, & д, & с); изменить ( 1 , 1 , п, р, д, с); }
Иначе { зсапЕ ( " % LLD% LLD " , & р, & д); Е ( " % ДНУ \ п " , запрос ( 1,1 , п, р, д)); } } Возвращают 0 ; }

 

рекомендация

отwww.cnblogs.com/zengpeichen/p/10943152.html