つまり、フェンウィックツリープラスセグメントツリーです
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 }