http://acm.hdu.edu.cn/showproblem.php?pid=4027
이러한 쿼리에 응답 할 수 있습니까?
시간 제한 : 2,000분의 4,000 MS (자바 / 기타) 메모리 제한 : 65,768분의 65,768 K (자바 / 기타)
총 제출 (들) : 33,385 허용 제출 (들) : 8020
문제 설명
악마의 전함의 많은 전투 전에 일렬로 배열되어있다. 우리의 사령관은 전함을 제거하기 위해 우리의 비밀 무기를 사용하기로 결정. 전함 각각 내구성의 값을 표시 할 수있다. 우리의 비밀 무기의 모든 공격의 경우, 지구력이 원래 값의 제곱근에 자신의 지구력을하여 전함의 연속 부분의 내구성을 줄일 수 있습니다. 우리의 비밀 무기의 공격의 일련의 동안, 사령관은 무기의 효과를 평가하고자하는, 그래서 그는 도움을 요청합니다.
당신은 전함 라인의 연속 부분의 내구성의 합이 그 쿼리에 응답하라는 메시지가 표시됩니다.
제곱근 연산이 정수로 반올림해야 알 수 있습니다.
당신은 전함 라인의 연속 부분의 내구성의 합이 그 쿼리에 응답하라는 메시지가 표시됩니다.
제곱근 연산이 정수로 반올림해야 알 수 있습니다.
입력
입력은 EOF로 종료 몇 가지 테스트 케이스가 포함되어 있습니다.
테스트 케이스를 들어, 첫 번째 행은 행 내의 악의 N 전함 거기 나타내는 단일 정수 N을 포함한다. (1 <= N <= 100,000)
의 두 번째 줄은 정수 N 에이 끝까지 라인의 시작에서 각 전함의 내구성을 나타내는 값이 포함되어 있습니다. 당신은 모든 인내 값의 합이 2보다 작은 것으로 가정 할 수있다 (63) .
다음 줄은 행동과 쿼리 수를 나타내는, 정수 M이 포함되어 있습니다. (1 <= M <= 100000)
다음 M 라인은 각 라인은 포함 세 정수 T, X 및 Y. T = 0 X 번째 및 Y 번째 전함 사이 전함 내구 값을 감소 병기의 작용을 나타내는 포함 . X 번째 및 Y-번째까지의 전함의 내구 값의 합을 요청 커맨더의 조회를 나타내는 T = 1.
테스트 케이스를 들어, 첫 번째 행은 행 내의 악의 N 전함 거기 나타내는 단일 정수 N을 포함한다. (1 <= N <= 100,000)
의 두 번째 줄은 정수 N 에이 끝까지 라인의 시작에서 각 전함의 내구성을 나타내는 값이 포함되어 있습니다. 당신은 모든 인내 값의 합이 2보다 작은 것으로 가정 할 수있다 (63) .
다음 줄은 행동과 쿼리 수를 나타내는, 정수 M이 포함되어 있습니다. (1 <= M <= 100000)
다음 M 라인은 각 라인은 포함 세 정수 T, X 및 Y. T = 0 X 번째 및 Y 번째 전함 사이 전함 내구 값을 감소 병기의 작용을 나타내는 포함 . X 번째 및 Y-번째까지의 전함의 내구 값의 합을 요청 커맨더의 조회를 나타내는 T = 1.
산출
각 테스트 케이스를 들어, 첫 번째 줄에 사건 번호를 인쇄 할 수 있습니다. 그런 다음 각 쿼리에 대해 한 줄을 인쇄 할 수 있습니다. 그리고 각 테스트 케이스 후 빈 줄을 따라 기억한다.
샘플 입력
10 1 2 3 4 5 6 7 8 9 10 5 0 10 1 1 1 10 1 1 5 0 5 8 1 4 8
샘플 출력
사례 1 : 7 19 6
출처
권하다
LCY
그 루트 개구 6-7 다수 재귀 각 리프를 업데이트하는 다른 상기 업데이트 간격없이 R-L + 1 ==의 발에 대해 1이며, 주목
// #INCLUDE <비트 / stdc ++. H> #INCLUDE <cstdio> #INCLUDE <CString을> #INCLUDE <cmath> #INCLUDE <알고리즘> #INCLUDE <iostream> #INCLUDE <알고리즘> #INCLUDE <iostream> #INCLUDE <cstdio > #INCLUDE < 문자열 > #INCLUDE <CString을> #INCLUDE <STDIO.H> #INCLUDE <큐> #INCLUDE <적층> ; 사용법 #include <지도> 사용법 #include < 설정 > 사용법 #include < #INCLUDE <벡터> #define한다 ME (X, Y)가 memset (X, Y는 sizeof (X)) #DEFINE SF (N)는 scanf ( "%의 D", N) #DEFINE에 대한 담당자 (I, n)은 (지능 I = 0; I <N은, 내가 ++)는 #DEFINE의 0x3f3f3f3f INF #DEFINE의 개조 1,000,000,007 #DEFINE의 PI의 ACOS (-1) 를 사용 스페이스 성병; 타입 정의 긴 긴 LL; CONST의 INT의 N = 100009 ; LL 합계; 구조체 노드 { INT의 L, R; 발 LL; } 트리 [N << 2 ]; 무효 빌드 (INT의 L, INT의 R, INT의 루트) { 트리 [루트] 펜닐 = L, 트리 [루트] .R = R; 경우 (L == R) { 는 scanf ( " %의 LLD " , 트리 [루트] .val); 반환 ; } INT 중간 = (L + R) >> 1 ; 구축 (L, 중간, 루트 * 2 ); 구축 (중앙 + 1 , R, 루트 * 2 + 1 ); 트리 [루트] .val = 트리 [루트 * 2 ] + .val 트리 [루트 *2 + 1 ] .val; } 공극 업데이트 ( INT의 L, INT의 R, INT의 루트) { 경우 ((트리 [루트] 펜닐> = 1 && 트리 [루트] .R <= R) && (트리 [루트] .R - 트리 [루트] .L + 1 > = 트리 [루트] .val)) { 리턴 ; } 경우 (트리 [루트] 펜닐 == 트리 [루트] .R) { 트리 [루트] .val = SQRT (트리 [루트] .val); 반환 ; } INT 중간 = (트리 [루트] 펜닐 + 트리 [루트] .R) >> 1 ; 경우 (L <= MID) 업데이트 (L, R, 루트 * 2 ); 경우 (R> MID) 업데이트 (L, R, 루트 * 2 + 1 ); 트리 [루트] .val = 트리 [루트 * 2 ] + .val 트리 [루트 * 2 + 1 ] .val; } 공극 getsum ( INT의 L, INT의 R, INT의 루트) { 경우 (트리 [루트] 펜닐> = 1 && 트리 [루트] .R <= R) { 합계 + = 트리 [루트] .val; 반환 ; } INT중간 = (트리 [루트] 펜닐 + 트리 [루트] .R) >> 1 ; 경우 (L <= MID) getsum (L, R, 루트 * 2 ); 경우 (R> MID) getsum (L, R, 루트 * 2 + 1 ); } INT 의 main () { INT의 N, m; INT CNT = 0 ; 동안 (~는 scanf ( " %의 D ' , N)) { 의 printf ( " 케이스 # 1 %의 D : \ n " , ++ CNT); (빌드 1N, 1 ); scanf와 ( " %의 D ' , m); 위한 ( int로 I = 0 ; I <m은, 내가 ++ ) { INT는 이고 , L, R; scanf와 ( " % D % D % D " , 이며 , L, R); 경우 (L> R) - 스왑 (L, R); // 注意坑 경우 ( 인 == 0 ) { 업데이트 (L, R, 1 ); } 다른 { 합 = 0 ; getsum (L, R, 1 ); 의 printf ( " % LLD \ 없음 " , 합); } } COUT << ENDL; } 반환 0 ; }