마리오는 세계적으로 유명한 배관공입니다. 그의 "억센"그림과 우리의 기억에 상기시켜 놀라운 점프 능력. 이제 가난한 공주는 다시 곤경에 마리오는 그의 연인을 저장해야합니다. 우리는 높이 인사에 벽돌이 모든 정수 POINT I에, 선 (길이가 n은)로 보스의 성으로가는 길을 생각. 이제 문제는 그가 이동할 수있는 최대 높이가 H. 경우 많은 벽돌에 [L, R] 마리오 칠 수있는 방법입니다
제 InputThe 라인 정수 T, 테스트 데이터의 수에 따른다.
각각의 테스트 데이터의 경우 :
첫 번째 라인은 N, m은 (1 <=는 N <= 10 ^ 5, 1 <= m <= 10 ^ 5) N 도로의 길이, m은 쿼리의 개수 두 정수를 포함 .
다음 라인은 범위 [0, 1000000000]이고, n은 정수, 각 벽돌의 높이를 포함한다.
. 다음에 m 행, 각 라인은 세 개의 정수 L, R, H (0 <= L <= R <n은 0 <= H <= 1000000000.)를 OutputFor 각각의 경우, 출력 "케이스 X를"포함 (X 사건 번호는 m 행 하였다 1)에서 시작하여, 각각의 라인은 정수를 포함한다. i 번째 정수 마리오 i 번째 쿼리 칠 수 벽돌의 수입니다.
샘플 입력
1 10 10 0 7 5 2 5 4 3 8 7 7 2 8 6 3 5 0 1 3 1 1 4 9 0 0 1 3 5 5 5 5 1 4 6 3 1 5 7 5 7 3
샘플 출력
. 1 예 : . 4 0 0 . 3 . 1 2 0 . 1 . 5 . 1
K에 동일한 간격을 찾는 우리 R 세그먼트 트리 버전을 이동 수 질의의 수보다 적은 - 세그먼트 트리의 L-1 번호의 첫 번째 버전
번호 :
#INCLUDE <cstdio> #INCLUDE <iostream> #INCLUDE <CString을> #INCLUDE <알고리즘> #INCLUDE <큐> #INCLUDE <적층> #INCLUDE < 설정 > #INCLUDE <지도> #INCLUDE <벡터> #INCLUDE <cmath> CONST의 INT maxn 1E5 + = 5 ; 타입 정의 긴 긴 LL; 사용하는 네임 스페이스 표준을; 구조체 노드 { INT의 L, R; INT 합; } 트리 [maxn * 20 ]; INT CNT 루트 [maxn]; INT A [maxn]; 벡터 < INT > V; INT getid ( INT X) { 복귀 LOWER_BOUND (v.begin () v.end (), X) -v.begin () + 1 ; } 공극 빌드 ( INT 및 U, INT의 L, INT의 R) { U = ++ CNT; 트리 [U] .sum = 0 ; 경우 (L == R) 창 ; int로 중간 = (L + R) / 2 ; (트리 [U] 펜닐, L, 미드)를 작성; 구축 (트리 [유] .R, 중반 + 1 , R); } 공극 업데이트 ( INT의 L, INT의 R, INT의 전, INT 현재 및, INT의 P) { 트리 [ ++ CNT = 트리 [중고]; 이제 = CNT는; 트리 [지금] .sum ++ ; 경우 (L == R)이 { 리턴 ; } INT 중간 = (L + R) >> 1 ; 경우 (p <= MID) { 업데이트 (좌, 중, 트리 [중고] 펜닐, 트리 [현재] 펜닐, P); } 다른 { 갱신 (중간 +1 , R, 트리 .R, 목 [현재] .R, P [중고]); } } INT의 쿼리 ( INT의 L, INT의 R, INT의 L, INT의 R, INT의 K) { 경우 (L == R) { 복귀 트리 [R] .sum- 트리 [L] .sum; } INT 중간 = (L + R) >> 1 ; 경우 (K <= MID) { 리턴 질의 (좌, 중, 트리 [L] 펜닐, 트리 [R] 펜닐, K); } 다른 { LL ANS = 나무 [나무 [R] .L] .sum-의 트리 [트리 [L] 펜닐] .sum; ANS + = 쿼리 (MID + 1, R, 트리 [L] .R, 목 [R] .R, K); 반환 ANS를; } } INT 의 main () { INT의 T; CIN >> T; INT의 CC = 1 ; 반면 (T-- ) { INT의 N, m; scanf와 ( " %의 D % d에 " , N, m); CNT = 0 ; 대 ( INT의 t = 1 , t <= N; t ++ ) { v.clear (); } 대 ( INT t =1 ; t <= N; t ++ ) { scanf와 ( " 가 % d " , & A [t]); v.push_back (a [t]); } 종류 (v.begin (), v.end ()); v.erase (고유 (v.begin () v.end ()) v.end ()); 빌드 (루트 [ 0 ] (1) , N); 대 ( INT의 t = 1 , t <= N; t ++ ) { 업데이트 ( 1 N, 루트 [T- 1 , 루트 [t] getid (a [t])); } INT의 X, Y, K; 의 printf ( " 케이스가 % d : \ n " , CC ++ ) 동안 (M-- ) { 는 scanf ( " % D % D % D ' , X, Y, K); K = UPPER_BOUND (v.begin () v.end () , K) - v.begin () 경우 (케이 == 0 ) { 둔다 ( " 0 " ) 계속 ; } X ++ ; Y ++ ] 의 printf ( " % D \ 없음 " 쿼리 ( 1 , N 루트 [X- 1] 루트 [Y, K)); } } 반환 0 ; }