K 번째 가장 가까운 거리

주제 링크

문제의 의미 내부의 수 (n), Q 질의, 질의 [L, R, | A [I] - P | 다수의 K

아이디어 : 적당한 크기에 따라 회장 트리 유지 보수 가치의 절반 대답 쿼리 간격 [P - 중간, P + 중간] 수

#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream> 
#INCLUDE <지도> 
#INCLUDE <벡터> 
#INCLUDE <큐> 
#INCLUDE <cmath>
 사용  스페이스 성병;
CONST의  INT N = + 1E5 (10) ;
CONST의  INT M = 1E6;
구조체 노드 {
     INT의 L, R;
    INT 발; 
} 트리 [N * 55 ];
INT의 루트 [N], TOT;
INT의 N, Q, A [N];
INT의 갱신 (INT의 전, INT (PL), INT (PR), INT 발)을 {
     INT CUR = ++ TOT; 
    트리 [CUR] = 트리 [중고]; 
    트리 [똥개] .val ++ ;
    경우 (PL == PR) 복귀 CUR;
    INT 중간 = (PL + PR) >> 1 ;
    경우 (발 <= MID) 트리 [CUR] 펜닐 = 업데이트 (트리 [중고] 펜닐, PL, 미드, 발);
    다른 나무 [CUR] .R = 업데이트 (트리 [중고] .R 미드 + 1 , PR, 발);
    반환 CUR을; 
} 
INT의 K, CNT;
INT의 쿼리 ( INTPL, INT (PR), INT의 L, INT의 R, INT의 RT, INT의 LT) {
     경우 (PL <= 1 && R <= PR) {
         복귀 트리 [RT] .val - 트리 [LT] .val; 
    } 
    INT 중간 = (L + R) >> 1 ;
    INT 입술 = 0 ;
    경우 (PL <= MID) 입술 + = 쿼리 (PL, PR, L, 미드, 트리 [RT] 펜닐, 트리 [LT] 펜닐);
    경우 (PR> MID) 입술 + = 쿼리 (PL, PR, 미드 + 1 , R, 트리 [RT] .R, 목 [LT] .R);
    반환 입술을; 
} 
INT 의 main () {
     INTT, 프렉스;
    INT의 L, R, P;
    int로 PL, 홍보, 중반을; 
    scanf와 ( " %의 D ' , T);
    반면 (T-- ) { 
        는 scanf ( " %의 D % d에 " , N, Q);
        위한 ( int로 I = 1 ; 나는 <= N; I ++는 ) { 
            는 scanf ( " %의 D를 " , & A [I]); 
            루트 [I] = 업데이트 (루트 [I - 1 , 1 , M, A [I]); 
        } 
        프렉스 = 0 ;
        반면 (q-- ) { 
            는 scanf ( " % D % D % D % D ' , L, R, P, K); 
            L = L ^ 프렉스; R = R ^ 프렉스; p = P ^ 프렉스; K = K ^ 프렉스; 
            PL = 0 , PR = M;
            반면 (PL <= PR) { 
                중간 = (PL + PR) >> 1 ;
                경우 (쿼리 (최대 ( 1 , P - MID), 분 (M, P + MID), 1 , M, 루트 (R), 루트 [1 - 1 ])> = K) { 
                    프렉스 = 미드; 
                    홍보= 중간 - 1 ; 
                } 다른 PL = 중간 + 1 ; 
            } 
            의 printf ( " % D \ 없음 " , 프렉스); 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/2462478392Lee/p/11285439.html