1754 (세그먼트 트리의 최대 범위를 찾기 위해) - 나는 HDU가 싫어

나는 그것을 증오 1754 - HDU

주제 링크 : https://vjudge.net/problem/HDU-1754

주제 :

많은 학교의 인기 습관. 선생님은 정말 최고 점수 인들 사이에서 그렇게 그렇게 그렇게 그렇게, 부탁.
이것은 많은 학생들이 혐오되어 있습니다.

당신이 좋든 싫든간에, 지금 당신은, 교사의 요구 사항에 따라입니다 물어 교사를 시뮬레이션하는 프로그램을 작성할 수있다 할 필요가있다. 물론, 교사들은 때때로 특정 학생의 성과를 업데이트해야합니다.

입력이 제목은 파일의 끝을 다루는 시험의 여러 세트를 가지고 있습니다.
각 시험의 첫 번째 행에서 두 개의 양의 정수 N과 M있다 (0 <N는 <= 200000,0 <M <5000), 동작 횟수와 학생의 수를 나타낸다.
학생 ID 번호는 N. 1에서 컴파일
두 번째 행은 i 번째의 학생 ID가 나는 결과를 나타내는 상기 N 개의 초기 학생의 성적을 나타내는 N의 정수를 포함한다.
다음 M 행. 각 라인은 문자 C를 가지고, 2 개 개의 양의 정수 A, B. (단지 'Q'또는 'U'를 가지고)
경우 C는 'Q'시간이 학생들 중에서 (A, B를 포함)에 B로부터 ID를 질의,이 질의 동작 즉,이며, 가장 높은 점수이다.
때 C는 'U'시간이 성적을 학생의 B를 변경하는 데 필요한 ID 업데이트 작업입니다입니다
행에서 가장 높은 점수를 출력하는 각 쿼리 작업에 대해서는 출력. 샘플 입력
5 6 
1 2 3 4 5 
Q 1~5 
U 3~6 
Q 3 4 
Q 4 5 
U 2 9 
Q 1~5
샘플 출력
5 
6 
5 
9 아이디어 : 단일 지점을 수정하는 간단한 땜질 트리 라인, 최대 합을 찾는 것이 최대가, 업데이트가 여전히 단계 업데이트로 왼쪽과 오른쪽 노드 노드 단계를 눌러 교체 할



//  
// 2019년 9월 4일에 HJYL 작성.
//
 #INCLUDE <알고리즘> 
#INCLUDE <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <큐> 
#INCLUDE < 설정 > 
#INCLUDE <math.h> 
#INCLUDE <지도>
 사용  스페이스 성병;
CONST의  INT maxn 1E6 + = 7 ;
INT의 입력 [maxn]; 

구조체 노드 {
     INT 왼쪽;
    int로 바로;
    INT의 MAXX; 
} 트리 [maxn * 4]; 

보이드 팔 굽혀 펴기 ( INT의 루트) 
{ 
    트리 [루트] .maxx = 최대 (트리 [루트 << 1 ] .maxx, 트리 [루트 << 1 | 1 ] .maxx); 
} 

공극 빌드 ( INT의 루트 의 INT (L) 의 INT R) 
{ 
    트리 [루트] .left = L; 
    트리 [루트] 됐지 = R;
    경우 (L == R) 
    { 
        트리 [루트] .maxx = 입력 [1];
        반환 ; 
    } 
    INT 중반 = (L + R) >> 1 ;
    빌드 (루트 << 1 , L, MID); 
    구축 (루트 << 1 | 1 , 중반 + 1 , R); 
    팔 굽혀 펴기 (루트); 
} 
INT의 maxxx;
공극 변화 ( INT의 뿌리, INT DIS, INT의 K) 
{ 
    경우 (트리 [루트] == .left 트리 [루트] 됐지) 
    { 
        트리 [루트] .maxx = K;
        반환 ; 
    } 
    경우 (트리 [루트 << 1 ] 됐지> = DIS) 
        변화 (루트 << 1 , DIS, K);
    다른 ] .left)
        변화 (루트 << 1 | 1 , DIS, K); 
    팔 굽혀 펴기 (루트); 
} 

INT의 검색 ( INT의 루트 의 INT (L) 의 INT R) 
{ 
    INT의 maxxx = 0 ;
    경우 (L <= 트리 [루트] .left && 트리 [루트] 됐지 <= R) 
    { 
        복귀 트리 [루트] .maxx; 
    } 
    경우 (L <= 트리 [루트 << 1 ] 됐지) 
        maxxx = 최대 (maxxx 검색 (루트 << 1 , L, R));
    경우 (R> = 나무 [루트 << 1 | 1 
        maxxx= 최대 (maxxx 검색 (루트 << 1 | 1 , L, R));
    반환 maxxx을; 
} 

INT 의 main () 
{ 
    INT의 N, m;
    동안 (~는 scanf ( " %의 D % d에 " , N, m)) {
         위해 ( int로 난 = 1 난 ++; i가 N = < ) 
            (scanf와를 " 가 % d " , 입력 [I]); 
        구축 ( 1 , 1 , N);
         CH [ 10 ];
        // COUT << "m ="<< m << ENDL;
        반면 (M-- ) { 
            는 scanf ( " %의 S ' , CH);
            // getchar가 (); 
            경우 (CH [ 0 ] == ' Q ' ) {
                 INT의 LL, RR;
                // COUT << "HHH"<< ENDL; 
                scanf와 ( " %의 D % d에 " , LL, RR); 
                의 printf ( " % D \ 없음 " 검색 ( 1 , LL, RR)); 
            } 다른 {
                 INT의 P, Q; " , P, Q); 
                변화 ( 1 , P, Q); 
            } 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/Vampire6/p/11462741.html