로스 템플릿 밸리 P3374 [1] 펜윅 트리 과제 해결

멩 새로운, 자율 학습 등의 경우 어려움에 새로운 지식의 뒷면. 나무의 경우는 배열, 트리 라인 아래 어떤 초보자를 배운하지 않은에서 ...... ~ ~ 문제가이 솔루션은 학생들에게 공유의 경험 초보자 세그먼트 트리를 제공하는 것입니다, 그래서 ~~

당신은 트리 라인이 재생 https://www.cnblogs.com/jason2003/p/9676729.html을보고 무엇인지 모르는 경우

많은 내용이 재생 블로그에 자세히 설명되어 있습니다, 다음은 간단한 유도입니다

``CPP
#INCLUDE <비트 / stdc ++ H.>
#DEFINE MAXN 2,000,001
#DEFINE LL 긴 긴
네임 스페이스를 사용하여 표준;

INT N, m, A [MAXN];

인라인 INT 진 () {//快读
CHAR C = getchar가 ();
INT (S) = 0, F = 1;
반면 (c <0 || C> '9') {
경우 (c == '-') = -1 F;
C = getchar가 ();
}
동안 (c> = 0 && C <= '9') {
(S) = ((S) << 3) + ((S) << 1) + (C ^ 48);
C = getchar가 ();
}
리턴 S * F;
}

구조체 데이터 구조 {기입 익숙한 //
INT의 L, R & LT;
INT SUM]
} 트리 [MAXN];

보이드 빌드 (INT I, INT L, R의 INT) {//建树
트리 [I] 펜닐 = L, 트리 [I] = R .R;
경우 (L == R) {
트리 [I] .sum = A [1];
반환;
}
INT 미드 = L + R >> 1;
빌드 (2 * I, L, 중간);
빌드 (I * 2 + 1 + 1 미드, R);
트리 [I] 트리 .sum = [2 * i]를 트리 .sum + [2 * I + 1] .sum;
}

부가 공극 (INT I, INT DIS, INT의 K) {//单点修改
경우 (트리 [I] 펜닐 == 트리 [I] .R) {
트리 [I] .sum + = K;
반환;
}
경우 (DIS <= 트리 [2 * i]를 .R) 추가 (2 × I, DIS, K);
(i가 1, DIS, K +를 * 2) 다른 추가;
트리 [I] 트리 .sum = [2 * i]를 트리 .sum + [2 * I + 1] .sum;
반환;
}

인라인 검색 INT (INT I, INT L, R의 INT) {//区间查询
경우 (트리 [I] 펜닐> = 1 && 트리 [I] .R <= R) {
창 트리 [I] .sum;
}
경우 (트리 [I] .R <L || 트리 [I] 펜닐> R) 반환 0;
INT (S) = 0;
경우 (트리 [2 * i]를 .R> = l) = S + 검색 (2 × I, L, R);
경우 (트리 [2 * I + 1] .L <= R) = S + 검색 (2 * I + 1, L, R);
수익의;
}

) (주 {int로
) (N = 진 (), m = 진;
위한 (INT 난 = 1; I <= N; I ++) {
A [I] = 진 ();
}
빌드 (N 1,1);
위한 (INT 난 = 1; I <= m; I ++) {
INT C = 진 ()는, X = 진 ()는, Y는 진 (=);
//分类
경우 (c == 1) {
추가 (1, X, Y);
}
(c == 2) {다른 경우
의 printf ( "% D \ n"으로 검색 (1, X, Y));
}
}
0을 리턴;
}

```

추천

출처www.cnblogs.com/wzsyyh/p/12501764.html