새 템플릿 트리 라인, 노인 템플릿에, 단지 자신을 유지하기 위해 각 노드의 내용을 저장하거나하지 않습니다 단지 여름 훈련 캠프를 마무리. 리드 푸시 다운을 쓸 때, 나는 쓸 조금 어려울 것 렌. 그래서 새 템플릿을 구성 할 수 있습니다.
각 노드는 또한, L, R, 게으른, 렌을 저장 훨씬 더 명확한 아이디어를 작성합니다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
사용법 #include <iostream> #INCLUDE <cstdio> #DEFINE LSON (RT << 1) #DEFINE rson (RT << 1 | 1) #DEFINE의 LSON의 LSON, L, 중간 #DEFINE의 Rson rson의 중간 + 1, R 의 typedef 긴 긴 LL; CONST INT INF = 0x3f3f3f3f ; CONST의 INT maxn 1E5 + = 7 ; 사용하는 네임 스페이스 표준을; 구조체 노드 { 게요 발; // 值 INT 렌; // 长度 LL 게으른; // 标记 INT L, R;// 왼쪽 끝점 } 트리 [MAXN << 2 ] LL ARR [MAXN] INT N-, m, 공극 빌드 ( INT RT, INT의 L, INT R & LT) // 업적 { 트리 [RT] .lazy = 0 ; 트리 [RT] .L = L, 트리 [RT] .R = & lt; 화학식 트리 [RT] .LEN = L - R & LT + 1. , IF (R & LT == L) 트리 [RT] .val ARR = [L]; // 행의 끝에 트리 브로 할당 도달 다른 { int로 MID = (L + R 및 LT) / 2 ] (LSON)을 빌드; (Rson)을 빌드, 트리 [RT] .val= 트리 [LSON] .val + 트리 [rson] .val; } } 공극 푸시 ( INT RT) // 向下传递지연标记 { 경우 (트리 [RT]가 .lazy) { 트리 [LSON] .lazy + = 트리 [RT] .lazy; 트리 [rson] .lazy + = 트리 [RT] .lazy; 트리 [LSON] .val + = 트리 [LSON] .LEN * 트리 [RT] .lazy; 트리 [rson] .val + = 트리 [rson] .LEN * 트리 [RT] .lazy; 트리 [RT] .lazy = 0 ; } } 무효 추가 ( INT의 RT, INT의 ID, LL의 addval를) // 单点更新 { 경우 (트리 [RT] 펜닐 == 트리 [RT] .R) { 트리 [RT] .val + = addval; 반환 ; } 다른 { INT 중간 = (트리 [RT] 펜닐 + 트리 [RT] .R) / 2 ; 경우 (ID <= (LSON, ID, addval) 추가 중반); 다른 사람 (rson, ID, addval) 추가; 트리 [RT] .val = 트리 [LSON] + .val의 트리 [rson] .val; } } LL 쿼리 ( INT의 RT, INT의 L, INT R) // 计算区间和 { 경우(트리 [RT] 펜닐> = 1 && 트리 [RT] .R <= R) 복귀 트리 [RT] .val; 경우 (트리 [RT] 펜닐> R || 트리 [RT] .R < l) 복귀 0 ; 푸시 (RT); 리턴 질의 (LSON, L, R) + 쿼리 (rson, L, R); } 무효 업데이트 ( INT의 RT, INT의 L, INT의 R, LL addval) // 区间更新 { LL 중반; 경우 (트리 [RT] 펜닐> = 1 && 트리 [RT] .R <= R) { 트리 [RT] .lazy + = addval; 트리 [RT] .val + = 트리 [RT] .LEN * addval; 반환; } 경우 (트리 [RT] 펜닐> R || 트리 [RT] .R < l) 창 ; 푸시 (RT); 업데이트 (LSON, L, R, addval); 업데이트 (rson, L, R, addval); 트리 [RT] .val = 트리 [LSON] + .val의 트리 [rson] .val; } INT 의 main () { 는 scanf ( " %의 D % d에 " , N, m); 위한 ( int로 I = 1 ; 나는 <= N; I ++는 ) { 는 scanf ( " %의 LLD " , 도착 [I]); } 구축 ( 1 , 1,엔); 위한 ( int로 I = 1 ; I <= m; 내가 ++ ) { 문자 들 [ 10 ]; scanf와 ( " %의 S ' , S); INT의 L, R; 게요 X; 경우 (S [ 0 ] == ' C ' ) { 는 scanf ( " % D % % LLD D ' , L, R, X); 업데이트 ( 1 , L, R, X); } 다른 { 는 scanf ( " % d 개 %의 D ' , L,아르 자형); 의 printf ( " % LLD \ 없음 " 쿼리 ( 1 , L, R)); } } 반환 0 ; }