修飾会長ツリーと[テンプレート]

つまり、フェンウィックツリープラスセグメントツリーです

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  のconst  int型 N = 5E4 + 7 4  構造体ノード{
 5      int型のL、R、合計。
6 } TR [N << 3 ]。
7  構造体QUER {
 8      int型のL、R、K、V、OP。
9 } Q [ 10000 + 7 ]。
10  int型RTN、Lnは、Rnの。
11  INT [N]、B [N]、RT [N << 2 ]、L [N << 2 ]、R [N << 2 ]。
12  文字S [ 2 ]。
13  ボイド変化(INT&O、INT L、INT R、INT P、INT ヴァル){
 14      であれば、O = ++(O!)RTN。
15の      TR [O] .SUM + = ヴァル。
16      であれば(L == R)のリターン;
17      int型 M =(L + R)>> 1 18      であれば(p <= m)の変化(TR [O] .L、L、M、P、ヴァル)。
19      他の変化(TR [O] .R、M + 1 、R、P、ヴァル)。
20  }
 21  int型の照会(INTL、のint R、int型K){
 22      であれば(L == R)戻りL。
23      int型 M =(L + R)>> 1 24      のint CNTL = 0、CNTR = 0 25      のためにint型 I = 1 ; I <= Lnは、++ I)CNTL + = TR [TR [L [I] L] .SUM。
26      のためには、int型 I = 1 ; I <= Rnの; ++ I)CNTR + = TR [TR [R [I] L。] .SUM。
27      もし(K <= cntr- {CNTL)
 28          のためのINT I = 1; I <= Lnは、++ I)L [I] =のTR [L [I] L。
29          のためにint型 I = 1 ; I <= Rnの; ++ I)R [I] = T R [R [I] L。
30          リターン  クエリ(L、M、K)。
31      }
 32      のためのint型 I = 1 ; I <= Lnは、++ I)L [I] =のTR [Lの[I] R。
33      のためには、int型、I = 1 ; I <= Rnの; ++ I)R [I] =のTR [R [I] R。
34      リターンクエリ(M + 1、R、K-cntl- CNTR)。
35  }
 36  INT メイン(){
 37      INT T; scanf関数を("%のD "& T);
 38      ながら(T-- ){
 39          RTN = 0 ;
 40          のmemset(RT、0はsizeof (RT));
 41          INT numn = 0 ;
 42          int型 N、M; scanf関数(" % D%D "、&​​N、&M);
 43          のためのint型 i = 1 ; iが<= N; ++ I)TR [I] .SUM = 0 ;
 44          用のint型 I = 1を iが<= N; ++ I)のscanf(" %d個"、&​​[i])と、[++ numn] = B [i]は、
45          のためには、int型、I = 1 ; I <= M; ++ I){
 46              のscanf(" %sの" 、S);
47              であれば(S [ 0 ] == ' Q ' ){
 48                  のscanf(" %D%D%D "、&​​Q [i]は.L&Q [i]を.R&Q [I]・K)。
49                  Q [i]が.OP = 0 50              }
 51              {
 52                  のscanf(" %D%dの"、&​​Q [i]は.L&Q [I] .V)。
53                  Q [i]が.OP = 1 54                  B [++ numn] = Q [i]は.V。
55              }
 56          }
 57          ソート(B + 1、B + 1 + numn)。
58          のint NUM =一意(B + 1、B + 1 + numn)-B- 1 59          のためにint型 i = 1 ; iが<= N ++ {I)
 60              [I] = LOWER_BOUND(B + 1、B + 1 - + NUM、[I]); B
61             int型 J = I; J <= N; J + = J&( - J)){
 62                  変化(RT [J]、1、NUM、[i]は、1 )。
63              }
 64          }
 65          のためのint型 I = 1 ; I <= M; ++ I){
 66              であれば(!{Q [i]が.OP)
 67                  のLn = Rnを= 0 ;
68                  のためにINT J = Q [i]が.l- 1 ; J; J = = J&( - J))L [++ LN] =のRT [J]。
69                  のためにINT ; J; J = Q [i]は.R J- = J&( - J))R [++ Rnの] = RT [J]。
70                  のprintf(" %d個の\ n "、B [クエリ(1 、NUM、Q [I]・K)])。
71              }
 72              {
 73                  のためにINT J = Q [i]は.Lあり、j <= N; J + = J&( - J)) 
 74                      変化(RT [J]、1、NUM、[Q [I]。 L]、 - 1 )。
75                  [Q [I] .L] = LOWER_BOUND(B + 1、B + 1 + NUM、Q [i]は.V) - B。
76                 のためにINT J = Q [i]は.Lあり、j <= N; J + = J&( - J))変化(RT [J]、1、NUM、[Q [I] .L]、1 )。
77             }
 78          }
 79      }
 80      リターン 0 81 }

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11391864.html