세그먼트 트리 (템플릿

某大佬的模板

#INCLUDE <iostream> #INCLUDE <cstdio> 의 typedef 긴 긴 LL; LL 않음,이 [100005], D [270000], B [270000]; 보이드 빌드 (LL의 L, LL의 R, LL의 P) {//建树 경우 (L == R) { D [P]는 [1]을 =; 반환; } LL의 m = (L +의 연구) >> 1; 빌드 (L, m은, p는 << 1), 구축 (m + 1이고, (p << 1) | 1); D [P] = D [P << 1] + D의 [(p << 1) | 1]; } 공극 업데이트 (LL의 L, LL의 R, LL의 C, LL S, LL의 t, LL의 P) {//区间加数 경우 (L이 <= S && t <= R) { D [P] + = (t - S + 1) * C를, B [P] + = C; 반환; } LL의 m = (S +에서의 t) >> 1; 경우 (b [P]) D [P << 1] + B = [P] * (m - S + 1), D의 [(p << (B) [P << 1] + B = [P, B의 [(p << 1) | 1] + B = [P]; 경우 (L <= m) 업데이트 (L, R, C, S, M, P << 1); 경우 (R> m) 업데이트 (L, R, C, m + 1, t, (p << 1) | 1); D [P] = D [P << 1] + D의 [(p << 1) | 1]; } LL의 getsum (LL의 L, LL의 R, S LL, LL의 t, LL의 P) {//区间查询 경우 (L <= S && t <= R) 복귀 D [P]; LL의 m = (S +에서의 t) >> 1; 경우 (b의 [피]) D [P << 1] + B = [P] * (m - S + 1), D의 [(p << 1) | 1] + B = [P] * (t - m), B [P << 1] + B = [P, B의 [(p << 1) | 1] + B = [P]; 2 [P]는 = 0; LL 합 = 0; 경우 (L <= m) 합계 = getsum (L, R, S, M, P << 1); 경우 (R> m) 합계 = + getsum (L, R, m + 1, t, (p << 1) | 1); 합을 리턴; } LL q를 I1, I2, I3, I4] 표준 : CIN >> >> N Q; () {int로 메인 표준 : IOS :: sync_with_stdio (0); 대해 (LL I = 1; 나는 <= N; 내가 ++) 표준 : CIN >> A [I]; (1 N, 1)을 빌드; (q--) {동안 표준 : CIN >> >> I1, I2, I3 >>; 경우 (I1의 == 2) 표준 : COUT << getsum (I2, I3, 1 N, 1) << "\ n을"; 다른 표준 : CIN >> I4, 업데이트 (I2, I3, I4, 1 N, 1); } 0을 반환; }

  

추천

출처www.cnblogs.com/liuxiangyu666/p/11403528.html