08 질문 끊기 전기 멀티 학교 4 차전.
이진 트리 + 회장
주제는 나무의 대통령으로해야 참조하십시오. 그 당시 만 먼저 생각하는 구간에서 발견하고 오랫동안 쓸 폭력을 찾기 위해 최대 169 K, P 순위보고, 코드가 지불 조정할 조금 어려운 RE 다른 그름 해당 단계의 결과로, WA해야한다 , 이는 다시했다.
, 해석 회장 트리 플러스 두 점, 두 지점 중간에 대답하고, 번호가 K보다 큰 경우 다음 대통령 트리 쿼리 간격 LR는 점에서 [P-중반, P + 중간]의 범위 번호, 우리의 중반을 설명하기 위해 큰 선택, 다음은 중간, 또는 증가 중반을 줄일 것, 두 지점이 될 수 있습니다.
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; #DEFINE INF 0x3f3f3f3f의 CONST의 INT N = + 1E6 (10) ; CONST INT 개조 1E9 + = 7 ; CONST의 INT의 M = + 1E6 (10) ; // CONST INT의 MX = 1E6; 구조체 나무 { INT의 탄소 나노 튜브, LC, RC; } T [(M << 6 )]; INT의 루트 [N], A [N], 2 [N]; 값 int m, Q, TOT, N; 무효 빌드 ( INT & RT, INT의 L, INT의 R) //建立一颗空树 { RT = ++ 어린 아이; T [RT] .CNT = 0 ; T [RT] .lc = T [RT] .RC = 0 ; 경우 (L == R) 창 ; int로 중간 = (L + R) >> 1 ; 빌드 (T [RT] .lc, L, MID); 빌드 (T [RT] .RC 중간 + 1 , R); } 공극 인서트 ( INT의 L, INT R, INT 및 CUR, INT의 전, INT의 POS) { T [ ++ TOT] = [중고] T; CUR =더하다; T [CUR] .CNT ++ ; 경우 (L == R) 창 ; int로 중간 = (L + R) >> 1 ; 경우 (POS <= 삽입 MID) (좌, 중, T [CUR] .lc, T .lc, POS [중고]); 다른 삽입 (MID + 1 , R, T [CUR] .RC, T [중고] .RC, POS); } INT의 쿼리 ( INT의 L, INT의 R, INT의 X, INT의 Y, INT의 K) { 경우 (R <= k)에 반환 T를 [Y] .CNT - T [X] .CNT; 경우 (L == R) { 창T [Y] .CNT - T [X] .CNT; } INT S = T [T [Y] .lc] .CNT - T [T [X] .lc] .CNT; int로 중간 = (L + R) >> 1 ; 경우 (K <= MID) { 리턴 질의 (좌, 중, T [X] .lc, T [Y] .lc, K); } 다른 { 창 (S) + 쿼리 (MID + 1 , R, T [X] .RC, T [Y] .RC, K); } } INT의 최대 ( int로 하는 INT의 b)는 { 복귀 A> B를? A : B; } INT 의 main () { INT의 T; scanf와 (" %의 D ' , T); 대 ( INT의 t = 1 , t <= T; t ++ ) { INT MX = 0 ; scanf와 ( " %의 D % d에 " , N, m); 위한 ( int로 I = 1 ; 나는 <= N; ++ i가 ) (scanf와를 " %의 D ' , A [I]), MX = 최대 (MX A [I]); TOT = 0 ; 빌드 (루트 [ 0 , 1 , MX); 대한 (int로 I = 1 ; 난 = <N; 난 ++ ) (삽입 한 , MX 루트 [I] 루트 [I - 1 ], A [I]); INT의 LST = 0 ; 반면 (M-- ) { INT의 L, R, P, K; scanf와 ( " % D % D % D % D ' , L, R, P, K); L ^ = LST, R ^ = LST, K ^ = LST, P ^ = LST; INT의 L = 0 , R = 1E6; 반면 (L < R) { INT 중간 = (L + R) >>1 ; INT CNT = 쿼리 ( 1 , MX 루트 [1 - (1) ], 루트 (R), P + MID); 경우 (p - 중간 - 1 > 0 ) CNT - 질의 = ( 1 , MX 루트 [1 - (1) ], 루트 (R), P - 중간 - 1 ); 경우 (CNT> = K) R = 미드; 다른 L = 중간 + 1 ; } 의 printf ( " % D \ 없음 " , LST = L); } } 반환 0 ; }