トピックリンク
https://www.luogu.org/problemnew/show/P3374
フェンウィックツリー
フェンウィックツリーは、最も基本的な要件や範囲です。
メンテナンス:
- 宇宙複雑:O(n)は、
- 時間の複雑さ(及び間隔、修正のシングルポイント):
変更:O(LOGN)
クエリ:O(LOGN)
C [i]を用いて(I-lowbit [I] + 1、i)および範囲を表します。
クエリ、および接頭辞を使用するアイデア、(I、J)= Cの[J] -c [I-1]。
利点
コードはシンプルです
短所
理解しにくいです
コード(解決)
1つの#include <iostreamの> 2の#include <cstdioを> 3。 使用した 名前空間STD; 4 のconst int型 = MAXN 500 005 ; 5 int型N-、M; 6 INT C [MAXN]; 7 INT lowbit(INT X){ // 対応する番号を見つけます。後方、前方から第1の2値1。 8 リターン - (X)X&; // - (6)例えば:. 6(110)> lowbit = 2; 12である(1100で) - > lowbit =(12)で4。 9。 } 10 空隙更新(int型 X、int型 V){ // 初期化し、更新する 11の ために(のInt I = X; I <= N + = lowbit Iは、(I))は{ // 自分の手のビデオをクリックし 12である C [I] = + V; 13である } 14 } 15 INTクエリ(INT X){ // クエリ:等、そのような相互更新 16 INT RES = 0 ; 17 用の(int型、I> I = Xを0 ; lowbit = I-(I))= RES + Cする[I]; 18で 復帰RES; 19 } 20 INT メイン() 21は 、{ 22は CIN >> N- M、 23である ため(int型 I = 1 iが++; iが<= N ){ 24 INT V。 25 のscanf(" %dの"、&V)。 26 更新(I、V)。 27 } 28 のための(int型 I = 1 ; I <= M; iは++ ){ 29 のint 、K、X、Y。 30 のscanf(" %D%D%D "、&K、およびX&Y)。 31 もし(K == 1 )アップデート(X、Y) 32 もし(K == 2)COUT <<クエリ(Y)-query(X- 1)<<endl; 33 } 34 リターン 0 。 35 }