트리 유지 보수 간격 트리 (동적 개방 점) 유지 보수 범위의 내부 의장;
원래의 간격에 기반의 펜윅 트리 노드 I를 i 번째 버전 가중치 세그먼트 트리 [I - lowbit (I) + (1), I];
펜윅 나무를 합산하여 노드 (각 노드가 세그먼트 트리입니다), 당신은 나무의 대통령의 전체 버전을 얻을 수 있습니다;
때문에 배열의 나무의 특별한 특성, 역사적 버전을 저장하지 않아도, 최대 트리에서 직접 업데이트가 없습니다;
내 코드는 재귀 쓰기, 약간의 기억 상실이다
^ (* ¯ (OO) ¯) ^들 z0에없는 삶과 죽음, 없었 실수 나무는 질문은 정말 쓰라린 눈물이다의 의장 만하는 것을 슈퍼 메모리, 32M 메모리는 루오 구도 및 요령 루오 밸리 AC 코드를 재귀;
순환 엉망 가지 압력 압력 메모리를들 z0, 그래서도하고 코드의 일부를 붙여 넣습니다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <. 비트 / stdc ++ H> 의 #pragma GCC의 최적화 (2) 사용 스페이스 성병; 형식 정의를 오래 오래 LL을; 쌍 타입 정의 < INT , INT > PII; 쌍 타입 정의 < 이중 , 두 > PDD; CONST INT N = 6E4 + 5 ; CONST INT M + 1E4 = 5 ; CONST INT INF = 0x3f3f3f3f ; CONST INT 개조 1E9 + = 7 ; CONST 두 EPS 1e- = 9 ; CONST 긴 이중 PI는 ACOS을 = (- 1 . 0L ); #DEFINE LS (I << 1) #DEFINE의 RS (I << 1 | 1) #DEFINE의 인터넷 제 #DEFINESE 제 #DEFINE PB와 push_back #DEFINE MK make_pair #DEFINE MEM (a, b)가 memset (A, B를 sizeof (a)) ) (읽기 LL { LL X = 0 , t = 1 ; 숯불 채널; 반면 (! isdigit에 (CH = getchar가 ())) 의 경우 (CH2 == ' - ' ) t = - 1 ; 반면 (isdigit에 (CH2)) X = { 10 * X + CH- ' 0 ' ; CH = getchar가 (); } 리턴 X * t 단계; } 구조체 노드 { INT L, R, V; C} [ 40 * N]; INT 루트 [N], T [N + 렌 M], A [N], L [M], R [M], K [M] (CMD) [M], TOT, N, m, CNT; INT의 QX [N] QY [N], TX, TY; 보이드 업데이트 ( INT의 L, INT R, INT 지금 & INT POS, INT d) { 경우 (현재 == 0 ) = 현재 ++ CNT; C [현재] .V + = D; 경우 (L == R) 창 ; INT 중간 = L + R >> 1 ; 경우 (POS <= MID) 업데이트 (좌, 중, C [현재] 펜닐, POS, d); 다른 업데이트 (MID + 1 [지금, R, C .R, POS, d); } 인라인 INT lowbit ( INT X) { 돌아가 , X (- X); } 보이드 추가 ( INT의 X, INT의 Y) { 대 ( INT ; I <= N; I = I + X = lowbit (I)) 업데이트 ( 1 렌 루트 [I], A [X, Y); } INT 쿼리 ( INT L, INT R, INT의 K) { 경우 (L == R) 복귀 L; INT 중간 = L + R >> 1 ; INT 합 = 0 ; 위한 ( INT 난 = 1 합 + =; I <= TY I ++) C [C [QY를 [I] 1-.] .V; 위한 ( INT 난 = 1 sum- =; I <= TX I ++) C [C [QX를 [I] 1-.] .V; 경우 (K <= 합) { 위한 ( INT 난 = 1 QY [I] =; I <= TY I ++) C [QY [I]을 L.; 위한 ( INT 난 = 1 QX [I] =; I <= TX I ++) C [QX [I]을 L.; 반환 (L, 중간, K) 쿼리; } 그밖에 { 위한 ( INT 난 = 1 QY [I] =; I <= TY I ++) C [QY [I] R한다.; 위한 ( INT 난 = 1 QX [I] =; I <= TX I ++) C [QX [I] R한다.; 반환 쿼리 (중간 + 1 , R, K- 합); } } int 형 ) (주 { INT T는 = 1 ; 반면 (T-- ) { 위한 ( INT 난 = 1 루트 [I] = C [i]를 .L = C [i]를 .R = C [I] .V =; I <= I ++ CNT)가 0 ; CNT = TX = TY = 0 ; TOT = N =) (읽기, m = ) (판독; 위한 ( INT 난 = 1 → [I] = A [I] =; I <= N을 I ++) ) (판독; 위한 ( INT 난 = 1 ; I <= m; I ++ ) { 숯 CH [ 2 ]; INT X, Y, Z; scanf와 ( " % S " , CH); cmd를 [I] = CH [ 0 ]; 경우 (CH [ 0 ] == ' Q ' ) L [I] = (판독), R [I] = (판독), K [I] = () 판독; 다른 L [I] = (판독) t [++ TOT] = R [I] = () 판독; } 다행히도 (t + 1 , t + 모든 + 1 ); LEN = 고유 (t + 1 , t + TOT + 1 -T-) 1 ; // 대해 (INT 내가 = 1; i가 <= LEN; I ++)의 printf ( "% D % C"를 t [i]는, I == LEN '\ n': ''); 위한 ( INT 난 = 1 ; I <= N; I ++)는 [I] = LOWER_BOUND (t + 1 , t + LEN + 1 , A [I]) - t 단계; 위한 ( INT 난 = 1 ; I <= N; I ++) 추가 (I, 1 ); 위한 ( INT 난 = 1 ; I <= m; I ++ ) { 만약 CMD ([I] == ' Q ' ) { TX = TY = 0 ; 대 ( INT J = L [I] - 1 , J, J = = lowbit (j)) QX [++ TX = 루트 [J] 대 ( INT J = R [i]를, J, J = = lowbit (j)) QY [++ TY = 루트 [J] 의 printf ( " 가 % d \ n " , t [쿼리 ( 1 , 렌 K [I])]); } 그밖에 { (L을 [i]를 추가 - 1 ); 이 [L [I] = LOWER_BOUND (t + 1 , t + LEN + 1 , R [I]) - t; (L [i]를 추가, 1 ); } } } 반환 0 ; }