제목 : 라이벌 국가 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 ; }