各次の位置の同じ色の点を前処理と呼ば次に、その後左後端部を尋ねる左右ポインタソートシフトされ、削除するように構成された私の位置を、[i]は次の[F [次のよう ] + 1 。だけでなく、オリジナルのマーカーを削除してもF [次に[I]場合- 1 、即ち、最後の問い合わせ$ \のsum_ 1 = {I}} ^ {R&LT F [I] $ 、ツリーラインを維持することができます。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 2000005 4 の#define L(K << 1) 5 の#define R(L + 1) 6 の#define中間(L + R >> 1) 7 の構造体JI { 8 整数X、Y、ID。 9 ブール 演算子 <(CONSTの JI&A)のconst { 10 リターン X < 斧。 11 } 12 } Q [N]。 13 のint [<< N F N、M、L、ANS [N]、[N]は、FI [N]、NEX [N]、2 ]。 14 ボイド更新(int型 K、int型の L、int型の R、int型のx、int型のY){ 15 であれば(L == R){ 16 F [K] + = Y。 17 リターン; 18 } 19 であれば(X <= MID)更新(L、L、中、X、Y) 20 他の更新(R、中間+ 1 、R、X、Y)。 21 F [K] = F [L] + F [R]。 22 } 23 INTクエリ(INT K、int型の L、INT R、INTX、int型のY){ 24 であれば((L> Y)||(X> R))戻り 0 ; 25 であれば((X <= 1)&&(R <= Y))リターン[K] F。 26 リターンクエリ(L、L、中、X、Y)+クエリ(R、中間+ 1 、R、X、Y)。 27 } 28 INT メイン(){ 29 のscanf(" %dの%の* d個%のD "、&N、&M)。 30 のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 31 のために(int型 I; i-- iがN =){ 32 NEX [I] = Fiの[I]]。 33 Fiの[I] = I。 34 } 35 のための(int型 i = 1 ; iはN- < 4 ; iは++ ) 36 であれば(NEX [Fiの[I])更新(1、1、nは、NEX [Fiの[I]、1 )。 37 のために(int型 I = 1 ; I <= M; iが++ ){ 38 のscanf(" %D%dの"、&Q [i]は.X、&Q [i]の.Y)。 39 Q [i]は.ID = I。 40 } 41 ソート(Q + 1、Q + M + 1 )。 42 L = 1 。 43 のためには、(int型 I = 1 ; I <= M; iは++ ){ 44 ながら(L < Q [I] .X){ 45 であれば(NEX [L])更新(1、1、nは、NEX [L]、 - 1 )。 46 であれば(NEX [NEX [L])更新(1、1、nは、NEX [NEX [L]、1 )。 47 L ++ 。 48 } 49の ANS [Q [i]は.ID] =クエリ(1、1 、N、Q [i]は.X、Q [i]の.Y)。 50 } 51 のための(int型 I = 1 ; I <= M; iが++)のprintf(" %d個の\ n " 、ANS [I])を、 52 }