セグメントツリーのテンプレート(ゾーンの変更、怠惰な標準)

1の#include <アルゴリズム>
 2の#include <cstdioを>
 3  使用して 名前空間をSTD。
4のtypedef 長い LL。
5  CONST LL N = 1E5 + 10、INF = 0x3f3f3f3f 6  LL N、M。
7 LL和[N]、T [N << 2 ]、タグ[N << 2 ]、ANS [N << 2 ]。
8インラインLL LS(LL P){ 戻り P << 1 ;}
 9インラインLL RS(LL P){ 戻り P << 1 | 1 ;}
 10インラインボイド push_up(LL P){ANS [P] = ANS [LS(P)] + ANS [RS(P)];}
 11インラインボイド追加(LL、L、LL R、LL P、LL K){ANS [P ] + = K×(R-L + 1);タグ[P] + = K;}
 12  インライン(読み取りLL){
 13      LL X = 0、F = 1チャー CH = GETCHAR()。
14      一方(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();}
 15      ながら、(CH> = ' 0 '&& CH <= ' 9 ')、X = X * 10 + CH- ' 0 '、CH = GETCHAR()。
16      リターン X * F。
17  }
 18インラインボイドスキャン(){
 19      N =(読み取り); M =は(読み取り)
20      のために(iは= LL 1、I <= N; I ++)和[I] = )(読み取ります。
21  }
 22  空隙ビルド(LL P、LL、L、LL R){
 23      であれば(L == R){
 24の         ANS [P] =和[L]。リターン;
25      }
 26     LL半ば=(L + R)>> 1 27      ビルド(LS(P)、L、ミッド)。
28      ビルド(RS(P)、ミッド+ 1 、R)。
29      push_up(P)。
30  }
 31  空隙push_down(LL、L、LL R、LL P){
 32      LLミッド=(L + R)>> 1 33      追加(L、中間、LS(P)、タグ[P])。
34      追加(MID + 1 、R、RS(P)、タグ[P])。
35      タグ[P] = 0 ;
36  }
 37  空隙更新(LL CL、LL、CR、LL、L、LL R、LL P、LL K){
 38      であれば(CL <= L && CR> = {r)は
 39         (L、R、P、k)を加えます。リターン;
40      }
 41      LLミッド=(L + R)>> 1 42      push_down(L、R、P)。
43      であれば(CL <= MID)更新(CL、CR、L、中間、LS(P)、K)。
44      であれば(CR> MID)更新(CL、CR、中間+ 1 、R、RS(P)、K)。
45      push_up(P)。
46  }
 47  LLクエリ(LL CL、LL、CR、LL、L、LL R、LL P){
 48      LL RES = 0 49      であれば(CL <= L && CR> = R)戻りANS [P]。
50      LLミッド=(L + R)>> 1 51     push_down(L、R、P)。
52      であれば(CL <= MID)RES + = クエリ(CL、CR、L、中間、LS(P))。
53      であれば(CR> MID)RES + =クエリ(CL、CR、中間+ 1 、R、RS(P))。
54      リターンのres;
55  }
 56  INT メイン(){
 57  //     freopenは( "testdata.in"、 "R"、STDIN)。
58  //     freopenは( "testdata.out"、 "W"、STDOUT); 
59の     スキャン()。
60      ビルド(11 、N)
61      一方(M-- ){
 62          のLL K = read()は、
63          もし(K ==1 ){
 64              のLL L =(読み取り)、R =(読み取り)、= K (読み取り)
65              更新(L、R、1、nは、1 、K)。
66          }
 67          {
 68              のLL L =(読み取り)、R = 読み取り()。
69              のprintf(" %のLLD \ n "、クエリ(L、R、1、nは、1 ))。
70          }
 71      }
 72      リターン 0 73 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/lifeisabadword/p/11822701.html