적 병사 라인업 -HDU1166

제목 : 라이벌 국가 C 국가의 지속적인 군사 이번에 행사는 국가의 스파이 수석 C 데릭과 그의 사람들은 바쁜 단정 한 최대로 시작했다. N 개의 엔지니어링 캠프의 라인을 따라 배열 된 국가의 해안선, 데릭하고 깔끔 작업이 엔지니어 캠프의 활동을 모니터하는 것입니다. 고급 모니터링 도구의 어떤 종류의 결과, 각각의 캠프 C 맑은 파악 미국, 각 캠프에서 엔지니어의 수가 엔지니어의 수 가능성이 직원의 수를 증가 시키거나 감소시킬 수있다, 변화를 발생하지만, 그들은 C를 벗어날 수 있습니다 나라를 모니터링 할 수 있습니다.

링크 :  http://acm.hdu.edu.cn/showproblem.php?pid=1166
CIA 데릭 깔끔한 그래서 적의 전술 훈련, 사람들의 숫자가 연속 엔지니어링 캠프 일정 기간 보고서를 유지하기 위해 정확히 어떤 연구에, 예를 들어 데릭 질문 : 단정 한 즉시이 단락 및 보고서의 총 수를 계산하기 시작합니다 "깔끔한 즉시 10 명 캠프의 총의 많은 사람들에게 처음 세 개의 캠프를보고!". 그러나 적의 캠프의 수는 자주 변경하고, 데릭은 단정했던 모든 시간이 단정의 속도를 계산하기 위해 캠프, 곧 소진 데릭의 숫자에 갈 수 있도록 각 세그먼트는 다른 질문 점점 불만 : "당신에게 죽은 지방 소년을 너무 느려 고려, 당신은 해고"단정 한 생각 : "당신은 정말 당신이 너무 저를 해고하고자하는 피곤한 작업입니다 수학 자신을 수행! "절망에서 깔끔한 도움 윈드, 윈드 브레이커에 컴퓨터 전문가가 전화를했다, 말했다 :"죽은 지방 소년, 당신은 일반적으로 멀티 포인트 ACM 제목이라고 및 멀티 포인트 산술 책, 지금은의 쓴 과일 맛 보는가! "단정 한 말을" 나는 ... 실수를 인정 "하지만 윈드 브레이커는 전화를 끊었습니다. 그가 정말로 충돌을 계산합니다 그래서 깔끔한 매우, 화가, 지능형 독자, 당신은 그 일을 마무리 도움으로 프로그램을 작성할 수 있습니다? 프로그램 효율이 높은 충분하지 않은 경우에, 깔끔한 여전히 데릭의 야단됩니다.

아이디어 : 기본 세그먼트 트리 포인트는 + 쿼리 간격을 수정하는 방법

코드 :

#INCLUDE <비트 / STDC ++ H.>
 은 USING  스페이스 STD;
 CONST  INT MAXN = 5E4 + 5. ;
 INT 트리 [MAXN << 2 ]
 보이드 push_up ( INT 노드) // 함수 상향 전달 및 범위는 동일 알고 쉽게 그의 두 서브 섹션의 합
{
    트리 [노드] = 트리 [노드 << 1 ] + 트리 [노드 << 1 | 1 ];
}
보이드 빌드 ( INT 노드 INT L, INT R & LT) // 재귀 업적
{
    경우 (L == R)
    {
        CIN >> 트리 [노드];
        반환 ;
    }
    INT 중간 = (L +의 연구) >> 1 ;
    빌드 (노드 << 1 , L, MID);
    빌드 (노드 << 1 | 1 , 중반 + 1 , R);
    (노드) push_up;
}
보이드 업데이트 ( INT의 노드 INT L, INT의 R, INT (K)는 값 int i)를 //点修改
{
    INT 중간 = (L +의 연구) >> 1 ;
    경우 (L == R)
    {
        트리 [노드] + = K; 반환 ;
    }
    경우 (ⅰ <= MID)
        업데이트 (노드 << 1 , L, 중, K, I);
    다른 
        업데이트 (노드 << 1 | 1 중간 + 1 , R, K, I);
    (노드) push_up;
}
INT 쿼리 ( INT 노드 INT L, INT R & LT, INT L, INT R & LT) // 쿼리 간격
{
    경우 (L <= 1 && R> = R)
    {
        반환 트리 [노드];
    }
    INT 중간 = (L +의 연구) >> 1 ;
    INT ANS = 0 ;
    경우 (L <= MID)
        ANS + = 쿼리 (노드 << 1 , L, 중, L, R);
    경우 (R> 중간)
        ANS + = 쿼리 (노드 << 1 | 1 중간 + 1 , R, L, R);
    반환 ANS를;
}
int 형 ) (주
{
    IOS :: sync_with_stdio ( 거짓 );
    cin.tie ( 0 );
    INT t, CIN >> t; INT case_ = 0 ;
    반면 (t-- )
    {
        COUT << " 케이스 " << 경우 ++ _ << " : " << ENDL;
        INT의 N, CIN >> N;
        빌드 ( 1 , 1 , N);
        하지만 ( 1 )
        {
            문자열 의;
            CIN >> 이야;
            경우 (들 == " 쿼리 " )
            {
                INT X, Y; X CIN >> >> Y;
                COUT << 쿼리 ( 1 , 1 , N, X, Y) << ENDL;
            }
            다른 
                경우 (들 == " 추가 " )
            {
                INT X, Y; X CIN >> >> Y;
                업데이트 ( 1 , 1 , N, Y, X);
            }
            다른 
                경우 (들 == " 하위 " )
            {
                INT X, Y; X CIN >> >> Y;
                업데이트 ( 1 , 1 , N, - Y, X);
            }
            그밖에
            {
                휴식 ;
            }

        }
    }
    반환  0 ;
}

추천

출처www.cnblogs.com/ljxdtc666/p/12222769.html