이 질문은 트리 선 두께 연습보다 더 많은 것 같습니다;
하지만 데이터가 1E9에 열려 있기 때문에, 트리 라인을 해결하기 위해 가중치를 사용하고, 그래서 이산해야합니다.
각 노드에 포함 된 이산화의 후, 제 크기 범위의 디지털 기록 빌드
그런 다음 천천히 성과, 프로세스, 하나의 숫자, 그것은 쿼리 할 때 업적;
1 #INCLUDE <cstdio> 2 #INCLUDE <알고리즘> 3 #INCLUDE <math.h> 4 #INCLUDE < 문자열 .H> 5 #INCLUDE <큐> 6 이용한 스페이스 성병; 7 CONST의 INT maxn 1E5 + = 10 ; 8 int로 A [maxn], B [maxn]; 9 구조체 노드 10 { 11 INT의 L, R, 미드; 12 의 INT NUM; 13 } 트리 [maxn << 2 ]; (14) 무효 빌드 ( INT의 L, INTR, INT CUR) 15 { 16 트리 [CUR] 펜닐 = L, 트리 [CUR] .R = R; 17 트리 [CUR] .num = 0 ; 18 트리 [CUR] .MID = (L + R) / 2 ; 19 의 경우 (L == R) 창 ; 20 빌드 (L, 트리 [CUR] .MID, CUR << 1 ); 21 빌드 (트리 [CUR] .MID + 1 , R, CUR << 1 | 1 ); 22 } 23 무효 업데이트 ( INT의 POS, INT CUR) 24 { 25 트리 [똥개] .num ++ ; 26 일 경우 (트리 [CUR] 펜닐 == 트리 [CUR] .R) 창 ; 27 일 경우 (POS <= 트리 [CUR] .MID) 28 업데이트 (POS, CUR << 1 ); 29 다른 업데이트 (POS, CUR << 1 | 1 ); 30 } 31 INT 쿼리 ( INT 베이스 , INT CUR) 32 { 33 의 경우 (트리 [CUR] 펜닐 == 트리 [CUR] .R) 복귀 트리 [CUR] 펜닐; 34 의 경우 ( 베이스 <= 트리 [CUR << 1] .num) 창 (쿼리 ( 베이스 , CUR << 1 )); 35 다른 창 (쿼리 ( 베이스 - 트리 [CUR << 1 ] .num, CUR << 1 | 1 )); 36 } 37 INT의 주 () 38 { 39 INT N; 40 는 scanf ( " %의 D ' , N); (41) 에 대한이 ( int로 I = 1 난 ++; i가 N = < {) (42) 는 scanf ( " %의 D를 " ,일체 포함]); 43 B [I] = A [I]; 44 } 45 정렬 (B + 1 , B + 1 + N); 46 INT의 t = 고유 (B + 1 , B + 1 + N) -B- 1 ; 47 빌드 ( 1 N, 1 ); (48) 에 대한이 ( int로 I = 1 ; i가 = <N; i가 ++ ) { 49 INT의 POS LOWER_BOUND = (B + 1 , B + 1 + t, A [I]) - B; 50 업데이트 (POS, 1 ); (51) 의 경우(I %의 2 )의 printf ( " % D \ 없음 " , B [쿼리 (I / 2 + 1 , 1 )]); 52 } 53 반환 0 ; 54 }