ダイナミック処方重みセグメントツリーは通常のバランスツリーに係合します。。。交換用の波

RT。

書式#include <iostreamの> 
の#include <cstdioを>
 に#define RレジスタのINT
 使用して 名前空間はstdを、
インラインINT G(){ 
    R RET = 0、=解決1登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。
    DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。
} 
のconst  int型 N = 100010はInf = 1E +7 + 10 構造体ノード{ int型 LS、RS、CNT;} T [N << 2 ]。
int型nは、TOT、室温;
#define LS tは[TR] .ls
 の#define RS T [TR] .RS
 の#define CNT(X)T [X] .CNT 
インラインボイド追加(INT&TR、int型の L、INT R、INT VL、INT D) {
     場合(!TR)TR = ++ TOT; もし(L == R){CNT(TR)+ = D。リターン ;} R MD = 1 + rを>> 1 もし(VL <= MD)(LS、L、MD、VL、D)を加えます。他に +(RS、MDを追加1、R、VL、D)。CNT(TR)= CNT(LS)+ CNT(RS)。
} 
インラインINTクエリ(INT TR、INT L、INT R、INT LL、INT RR){
     場合(!TR)戻り 0 ; もし(LL <= 1 && R <= RR)戻り CNT(TR)。R MD = L + R >> 1 RET = 0 もし(LL <= MD)RET + =クエリ(LS、L、MD、LL、RR)。もし(RR> MD)RET + =クエリ(RS、MD + 1、R、LL、RR)。リターンRET; 
} 
インラインINT getvl(INT TR、int型の L、INT R、INT RK){
     場合(L == R)戻り L。R MD = L + R >> 1 もし(CNT(LS)> = RK)戻り getvl(LS、L、MD、RK)。 戻り getvl(RS、MD + 1、R、rk- CNT(LS))。
} 
インラインINT getrk(INT TR、INT L、INT R、INT VL){ 場合(!TR)戻り 0 ;
    もし(L == R)リターン 1R MD = L + R >> 1 もし(VL <= MD)戻り getrk(LS、L、MD、VL)。 戻り CNT(LS)+ getrk(RS、MD + 1 、R、VL)
} 
インラインINT getpre(INT VL){RのRK =クエリ(1、-Inf、Infを、-Inf、VL- 1)。戻り getvl(1、 - Infを、Infを、RK);} 
インラインINT getnxt(INT VL){RのRK =クエリ(1、-Inf、Infを、-Inf、VL)+ 1戻り getvl(1、 - Infを、Infの、rkが);} 
(){ 主署名さ
JACK #ifdefの
    (freopenは"でNOIPAK ++。" " R 、STDIN);
 #endifの
    N = G()のための(R I = 1 iが<= N; ++、OPであり、X I){ 
        OP = G()、X = G (); 場合(オペアンプ== 1)(RT、-Inf、Infを、X、追加1 ;)そう であれば(オペアンプ== 2)を追加し(室温、-Inf、Infを、X - 1 )、
         そう であれば(オペアンプ== 3)のprintf(" %d個の\ n "、getrk(1、 - Infを、Infの、X)); 
         そうでない 場合(OP == 4)のprintf(" %Dを\ n "、getvl(1、 - Infを、Infの、X));
        そう であれば(OPの== 5)のprintf(" %Dを\ n " 、getpre(X));
        そう であれば(OP == 6)のprintf(" %d個の\ n " 、getnxt(X));    
    } 
}

2019年7月3日

 

おすすめ

転載: www.cnblogs.com/Jackpei/p/11128437.html