항목 링크 : HTTPS : //www.luogu.org/problem/P4513
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <알고리즘> 사용 스페이스 성병; #DEFINE maxn 500,005 #DEFINE 줄게 긴 긴 #DEFINE의 LS 리터 미드, RT << 1 #DEFINE RS 미드 + 1, R, RT << 1 | 1 개 구조체 노드 { LL 합, lsum, rsum, msum; } TR [maxn << 2 ]; LL A [maxn]; 인라인 공극 팔 굽혀 펴기 ( INT의 RT) { TR [RT] .sum = TR [RT << 1 ] .sum + TR [RT << 1 | 1 ] .sum; TR [RT] .lsum = 최대 (TR [RT <<1 ] .lsum, TR [RT << 1 ] .sum + TR [RT << 1 | 1 ] .lsum); TR [RT] .rsum = 최대 (TR [RT << 1 | 1 ] .rsum, TR [RT << 1 | 1 ] .sum + TR [RT << 1 ]을 .rsum); TR [RT] .msum = 최대 (최대 (TR [RT << 1 ] .msum, TR [RT << 1 | 1 ] .msum) TR [RT << 1 | 1 ] .lsum + TR [RT < < 1 ] .rsum); } 인라인 공극 빌드 ( INT의 L, INT의 R, INT의 RT) { 경우 (L ==R) { TR [RT] .sum = TR [RT] .msum = TR [RT] .lsum = TR은 [RT] .rsum는 = A [L]을; 반환 ; } INT 중간 = L + R >> 1 ; (LS)를 구축 (RS)를 구축; 팔 굽혀 펴기 (RT); } 인라인 공극 업데이트 ( INT의 L, INT의 C, INT의 L, INT의 R, INT의 RT) { 경우 (L == R) { TR [RT] .sum = TR [RT] .msum = TR [RT] .lsum = TR [RT] = .rsum의 C; 반환 ; } INT 중간 = L + R >> 1; 경우 (L <= MID) 업데이트 (L, C, LS); 다른 업데이트 (L, C, RS); 팔 굽혀 펴기 (RT); } 인라인 노드 쿼리 ( INT의 L, INT의 R, INT의 L, INT의 R, INT의 RT) { 경우 (L <= 1 && R> = R) 복귀 TR [RT]; int로 중간 = L + R >> 1 ; 경우 (R <= MID) 리턴 질의 (L, R, LS); 다른 경우 (L> 중간) 반환 쿼리 (L, R, RS); 또 { 노드 WL = 쿼리 (L, R, LS) = WR쿼리 (L, R, RS) ANS; ans.lsum = 최대 (wl.lsum, wl.sum + wr.lsum); ans.rsum = 최대 (wr.rsum, wr.sum + wl.rsum); ans.msum = 최대 (최대 (wl.msum, wr.msum) wl.rsum + wr.lsum); 반환 ANS를; } } INT 의 main () { INT의 N, m; scanf와 ( " %의 D % d에 " , N, m); 위한 ( int로 I = 1 ; i가 ++; 나는 <= N ) (scanf와를 " %의 LLD를 " , & A [I]); (빌드 1 , N, 1); INT의 OP, L, R, X; 위한 ( int로 I = 1 ; I <= m; 내가 ++ ) { 는 scanf ( " %의 D " , OP); 경우 (연산 == 1 ) { 는 scanf ( " % d 개 %의 D ' , L, R); 경우 (L> R) - 스왑 (L, R); 의 printf ( " % LLD \ 없음 " 쿼리 (L, R, 1 N, 1 ) .msum); } 다른 { scanf와을 ( "% D % D ' , L, X), 업데이트 (L, X, 1 N, 1 ); } } 리턴 0 ; }