@@ -53,7 +53,7 @@ impl SegmentTree {
5353 if let Mode :: RangeUpdate ( op) = & self . mode {
5454 let operator = match op {
5555 Op :: Add => |ret : & mut i64 , v : i64 | * ret += v,
56- _ => panic ! ( ) ,
56+ _ => panic ! ( "Operator {:?} is not supported." , op ) ,
5757 } ;
5858
5959 operator ( & mut ret, self . data [ index] ) ;
@@ -62,7 +62,7 @@ impl SegmentTree {
6262 operator ( & mut ret, self . data [ index] ) ;
6363 }
6464 } else {
65- panic ! ( "Unsupported" ) ;
65+ panic ! ( "Mode {:?} is not supported." , & self . mode ) ;
6666 }
6767
6868 ret
@@ -80,84 +80,49 @@ impl SegmentTree {
8080 if qr <= sl || sr <= ql {
8181 return SegmentTree :: default ( op) ;
8282 }
83-
8483 if ql <= sl && sr <= qr {
8584 return self . data [ pos] ;
8685 }
8786
88- fn add ( l : i64 , r : i64 ) -> i64 {
89- l + r
90- }
91- fn max ( l : i64 , r : i64 ) -> i64 {
92- l. max ( r)
93- }
94- fn min ( l : i64 , r : i64 ) -> i64 {
95- l. min ( r)
96- }
97-
9887 let sm = ( sl + sr) / 2 ;
9988 let lv = self . range_query_recursive ( op, ql, qr, sl, sm, pos * 2 ) ;
10089 let rv = self . range_query_recursive ( op, ql, qr, sm, sr, pos * 2 + 1 ) ;
101- let operate = match op {
102- Op :: Add => add,
103- Op :: Max => max,
104- Op :: Min => min,
105- } ;
106- operate ( lv, rv)
90+ match op {
91+ Op :: Add => lv + rv,
92+ Op :: Max => lv. max ( rv) ,
93+ Op :: Min => lv. min ( rv) ,
94+ }
10795 }
10896
109- /// Run a range query.
11097 pub fn get_range ( & self , l : usize , r : usize ) -> i64 {
11198 if let Mode :: RangeGet ( op) = & self . mode {
11299 self . range_query_recursive ( op, l, r, 0 , SegmentTree :: SEQ_LEN , 1 )
113100 } else {
114- panic ! ( "Unsupported" ) ;
101+ panic ! ( "Mode {:?} is not supported." , & self . mode ) ;
115102 }
116103 }
117104
118105 /// Update an i-th element to `value`.
119106 pub fn update_one ( & mut self , mut index : usize , value : i64 ) {
120107 index += SegmentTree :: SEQ_LEN ;
121108
122- fn add_assign_one ( ret : & mut i64 , v : i64 ) {
123- * ret += v;
124- }
125- fn max_assign_one ( ret : & mut i64 , v : i64 ) {
126- * ret = v;
127- }
128- fn min_assign_one ( ret : & mut i64 , v : i64 ) {
129- * ret = v;
130- }
131- fn add_assign ( ret : & mut i64 , l : i64 , r : i64 ) {
132- * ret = l + r;
133- }
134- fn max_assign ( ret : & mut i64 , l : i64 , r : i64 ) {
135- * ret = l. max ( r) ;
136- }
137- fn min_assign ( ret : & mut i64 , l : i64 , r : i64 ) {
138- * ret = l. min ( r) ;
139- }
140-
141109 if let Mode :: RangeGet ( op) = & self . mode {
142- let operate_and_assign_one = match op {
143- Op :: Add => add_assign_one,
144- Op :: Max => max_assign_one,
145- Op :: Min => min_assign_one,
146- } ;
147- operate_and_assign_one ( & mut self . data [ index] , value) ;
148-
149- let operate_and_assign = match op {
150- Op :: Add => add_assign,
151- Op :: Max => max_assign,
152- Op :: Min => min_assign,
153- } ;
154-
110+ match op {
111+ Op :: Add => self . data [ index] += value,
112+ _ => self . data [ index] = value,
113+ }
155114 while index > 0 {
156115 index /= 2 ;
157116 let lv = self . data [ index * 2 ] ;
158117 let rv = self . data [ index * 2 + 1 ] ;
159- operate_and_assign ( & mut self . data [ index] , lv, rv) ;
118+ match op {
119+ Op :: Add => self . data [ index] = lv + rv,
120+ Op :: Max => self . data [ index] = lv. max ( rv) ,
121+ Op :: Min => self . data [ index] = lv. min ( rv) ,
122+ } ;
160123 }
124+ } else {
125+ panic ! ( "Mode {:?} is not supported." , & self . mode) ;
161126 }
162127 }
163128
@@ -186,7 +151,7 @@ impl SegmentTree {
186151 r /= 2 ;
187152 }
188153 } else {
189- panic ! ( "Unsupported" ) ;
154+ panic ! ( "Mode {:?} is not supported." , & self . mode ) ;
190155 }
191156 }
192157}
0 commit comments