ロステンプレートバレーP3374 [1]フェンウィック木問題の解決

いくつかの困難に新しい、自習など孟ときに、新しい知識バック。木の場合は、配列、ツリーラインダウンなし初心者を学んでいないで...... ~~問題に対するこの解決策は、学生に共有に経験の初心者セグメントツリーを与えることですので~~

あなたは木のラインが再生https://www.cnblogs.com/jason2003/p/9676729.htmlを見ることが何であるかわからない場合

多くのコンテンツが再生されたブログで詳しく説明されている、以下は単純な誘導であります

`CPP
の#include <ビット/ STDC ++ H>
に#define MAXN 2000001
の#define LL長い長い
名前空間stdを使用。

整数N、M、[MAXN]。

インラインINTジン(){//快读
チャーC = GETCHAR()。
INT S = 0、F = 1。
一方、(C < '0' || C> '9'){
IF(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、int型R){//建树
ツリー[I] .L = L;ツリー[I]。R = R。
IF(L == R){
ツリー[I] .SUM = [L]。
リターン;
}
int型のミッド= L + R >> 1。
ビルド(2 * I、L、ミッド)。
ビルド(2 * I + 1、ミッド+ 1、R);
ツリー[I] .SUM =ツリー[2 * i]は.SUM +ツリー[2 * I + 1] .SUM。
}

ボイド追加(INT I、INT DIS、int型K){//单点修改
IF(ツリー[I] .L ==ツリー[I] .R){
ツリー[I] .SUM + = K。
リターン;
}
IF(DIS <=ツリー[2 * i]を.R)(2 * I、DIS、k)を加えます。
他のアドオン(2 * I + 1、DIS、K);
ツリー[I] .SUM =ツリー[2 * i]は.SUM +ツリー[2 * I + 1] .SUM。
リターン;
}

インラインINT検索(INT I、INT L、int型R){//区间查询
場合(ツリー[I] .L> = L &&ツリー[I]。R <= R){
戻りツリー[I] .SUM。
}
IF(ツリー[I] .R <L ||ツリー[I] .L> r)は0を返します。
int型S = 0;
IF(ツリー[2 * i]は.R> = L)S + =検索(2 * I、L、R)。
(ツリー[2 * I + 1] .L <= r)は、S + =(2 * I + 1、L、R)検索した場合。
戻り値;
}

INTメイン(){
N =ジン()、M =ジン()。
以下のために(INT I 1 =; I <= N; I ++){
[I] =ジン()。
}
ビルド(1,1、N)。
以下のために(INT iが= 1; I <= M; I ++){
int型C =ジン()、X =ジン()、Y =ジン()。
//分类
IF(C == 1){
追加(1、x、y)は、
}
(C == 2){他の場合
のprintf( "%D \ nが"検索(1、X、Y));
}
}
0を返します。
}

`` `

おすすめ

転載: www.cnblogs.com/wzsyyh/p/12501764.html