문제의 의미와 m 질의 서열을 감안할 Q의 간격 거리 (LR)와 P (의 절대 값의 차이)를 작게 K lrpk 인공 지능
게임의 절반 간격의 위치에서 LR P를 찾을 때되는 좌우 한 후 미친 초과 K 트래버스
복잡성은 K를 제거 할
직접 절반 응답
의 수와 간격 [P-중반, P + 중간]에서 LR 회장 나무의 유지 보수
참고이 고전 회장 나무 유지 관리 모드가! ! ! ! ! ! 유지 구간은 [인공 지능 Y, X에 속하는]의 개수
일반 트리 회장은 첨자로 분리 간격 T에 발생합니다
이는 T의 우선 큰 순서 작은 데이터에 기초
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; CONST의 INT의 N = 110000 ; CONST의 INT의 M = 2000000 ; int로 노드를; INT B [N], ID [N]; INT의 어린 아이, K; INT T [M] LSON의 [M의, rson [M] → [M]; 인라인 무효화 업 ( INT (X), INT의 L, INT의 R, INT 사전, INT 및 POS) { POS = ++ ncnt; LSON [POS] = LSON [중고]; rson [POS] =rson [중고]; t [POS] = t의 [중고] + 1 ; 경우 (L == R) 창 ; INT의 m = L +의 연구 >> 1 ; 경우 (X <= m)를 (X, L, m, LSON [POS] LSON [POS]); 다른 업 (X, m + 1 , R, rson [POS] rson [POS]); } 공극 qsum ( INT의 L, INT의 R, INT (X), INT의 Y, INT의 L, INT의 R) { 경우 (TOT> = K) 창 ; 경우 (L <= 1 && R <= R) { TOT + t = [Y] -t [X];반환 ; } INT의 m = L +의 연구 >> 1 ; 경우 (L <= m) qsum (L, R, LSON [X]의 LSON [y를, L, m); 경우 (R> m) qsum (L, R, rson [X] rson [Y] m + 1 , R); } INT 의 main () { INT의 ncase; CIN >> ncase; 반면 (ncase-- ) { INT의 PRV = 0 ; INT의 N, m; scanf와 ( " %의 D % d에 " , N, m); 위한 ( int로 I = 1 ; i가 N = <; 내가 ++)는 scanf를 ( " %의 D ", 및 B [I]), ID [I] = I; 정렬 (ID + 1 , ID + N + 1 , [( int로 I, INT의 J) { 리턴 B가 [I] < 2 [J]}); 정렬 (B + 1 , B + N + 1 ); ncnt = 0 ; 위한 ( int로 I = 1 에서 (ID [I] 난 ++; 나는 <= N)의 1 N, T [I- 1 ], T [I]); // 루트 [I] = 수정 (1, 1, N, ID [I], 루트 [I - 1]); 위한 ( int로 I = 1 I <= m; 나는 ++) { INT의 L, R, P; scanf와 ( " % D % D % D % D ' , L, R, P, K); L ^ = PRV, R ^ = PRV, P ^ = PRV, K는 ^ = PRV; int로 - 성 = 1 , = EN , 1E8을 반면 (EN - 성> 1 ) { INT 미드 세인트 + = EN >> 1 ; INT의 L = LOWER_BOUND (B + 1 , B + N + 1 , P - MID) - B; INT R = UPPER_BOUND (B + 1 , B + N + 1 , P + MID) - B -1 ; TOT = 0 ; qsum (L, R, T [1 - 1 ], T [R] 1 , N); 경우 (TOT> = K) EN = 미드; 다른 일 = 중간; } PRV = EN; 의 printf ( " % D \ 없음 " , EN); } } 반환 0 ; }