문제의 의미 내부의 수 (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 ; }