대부분의 간격 차이 값, 최대 세그먼트 트리, 최소 값을 유지한다. 쿼리는 MAX-분 결과
1 #INCLUDE <iostream> 2 #INCLUDE <CString을> 3 #INCLUDE <벡터> 4 #INCLUDE <알고리즘> 5 #DEFINE LSON의 L, m, 실온 << 1 6 #DEFINE의 rson의 m + 1, R, RT << 1 | 1 7 #DEFINE MEM (X)가 memset (X, 0는 sizeof (X)) 8 사용 스페이스 성병; 9 CONST의 INT의 INF = 9999999 ; 10 CONST의 INT의 maxn = 50000 + 5 ; 11 INT 미 [maxn << 4 ]; 12 INT 마 [maxn <<4 ]; (13) 보이드 팔 굽혀 펴기 ( INT의 RT) { 14 미 [RT] = 분 (MI [RT << 1 ] 미시건 [RT << 1 | 1 ]); 15 마 [RT] = 최대 (마 [RT << 1 ], MA [RT << 1 | 1 ]); 16 } 17 공극 빌드 ( INT의 L, INT의 R, INT의 RT) { 18 의 경우 (L == R) { 19 는 scanf ( " %의 D " , 미 [RT]); 20 마 [RT] = 미 [RT]; (21) 반환 ; 22 } 23 INT m = (L +의 연구) >> 1 ; 24 빌드 (LSON); 25 빌드 (rson); 26 팔 굽혀 펴기 (RT); 27 } 28 29 쌍 < INT , INT > 쿼리 ( INT L, INT R, INT의 L, INT의 R, INT의 RT) { 30 의 경우 (L <= 1 && R> = R) 31 { 32 쌍 < INT , INT > P ( 미 [RT], MA [RT]); (33) // COUT << 미 [RT] << ''<< 마 [RT] << ENDL; 34 리턴 P; 35 } 36 INT m = (L +의 연구) >> 1 ; 37 쌍 < INT , INT > LV (INF, 0 ), RV (INF, 0 ); 38 의 경우 (L <= m) LV = 쿼리 (L, R, LSON); 39 의 경우 (R> m) = RV 쿼리 (L, R, rson); 40 쌍 < INT , INT > P; 41 p.first = 분 (lv.first, rv.first); 42 p.second = 최대 (lv.second, rv.second); 반환 P는; 44 } 45 INT의 주 () { 46 INT N; INT의 m; 47 CIN >> >> N m; 48 빌드 ( 1 N, 1 ); (49) 에 대한이 ( 값 int = 1을 1 ; I <= m; 내가 ++ ) { 50 INT의 A, B; 51 는 scanf ( " % d 개 %의 D ' , A, 및 B); 52 쌍 < INT , INT > P; 53 p = 쿼리 (A, B, 1 , N,1 ); 54 // COUT << p.second << ''<< p.first << "SS"<< ENDL; 55 의 printf ( " % D \ 없음 " , p.second-의 p.first); 56 } 57 반환 0 ; 58 }