@@ -285,3 +285,106 @@ where
285
285
self . lz [ k] = F :: identity_map ( ) ;
286
286
}
287
287
}
288
+
289
+ #[ cfg( test) ]
290
+ mod tests {
291
+ use crate :: { LazySegtree , MapMonoid , Max } ;
292
+
293
+ struct MaxAdd ;
294
+ impl MapMonoid for MaxAdd {
295
+ type M = Max < i32 > ;
296
+ type F = i32 ;
297
+
298
+ fn identity_map ( ) -> Self :: F {
299
+ 0
300
+ }
301
+
302
+ fn mapping ( f : i32 , x : i32 ) -> i32 {
303
+ f + x
304
+ }
305
+
306
+ fn composition ( f : i32 , g : i32 ) -> i32 {
307
+ f + g
308
+ }
309
+ }
310
+
311
+ #[ test]
312
+ fn test_max_add_lazy_segtree ( ) {
313
+ let base = vec ! [ 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 , 5 , 3 ] ;
314
+ let n = base. len ( ) ;
315
+ let mut segtree: LazySegtree < MaxAdd > = base. clone ( ) . into ( ) ;
316
+ check_segtree ( & base, & mut segtree) ;
317
+
318
+ let mut segtree = LazySegtree :: < MaxAdd > :: new ( n) ;
319
+ let mut internal = vec ! [ i32 :: min_value( ) ; n] ;
320
+ for i in 0 ..n {
321
+ segtree. set ( i, base[ i] ) ;
322
+ internal[ i] = base[ i] ;
323
+ check_segtree ( & internal, & mut segtree) ;
324
+ }
325
+
326
+ segtree. set ( 6 , 5 ) ;
327
+ internal[ 6 ] = 5 ;
328
+ check_segtree ( & internal, & mut segtree) ;
329
+
330
+ segtree. apply ( 5 , 1 ) ;
331
+ internal[ 5 ] += 1 ;
332
+ check_segtree ( & internal, & mut segtree) ;
333
+
334
+ segtree. set ( 6 , 0 ) ;
335
+ internal[ 6 ] = 0 ;
336
+ check_segtree ( & internal, & mut segtree) ;
337
+
338
+ segtree. apply_range ( 3 , 8 , 2 ) ;
339
+ internal[ 3 ..8 ] . iter_mut ( ) . for_each ( |e| * e += 2 ) ;
340
+ check_segtree ( & internal, & mut segtree) ;
341
+ }
342
+
343
+ //noinspection DuplicatedCode
344
+ fn check_segtree ( base : & [ i32 ] , segtree : & mut LazySegtree < MaxAdd > ) {
345
+ let n = base. len ( ) ;
346
+ #[ allow( clippy:: needless_range_loop) ]
347
+ for i in 0 ..n {
348
+ assert_eq ! ( segtree. get( i) , base[ i] ) ;
349
+ }
350
+ for i in 0 ..=n {
351
+ for j in i..=n {
352
+ assert_eq ! (
353
+ segtree. prod( i, j) ,
354
+ base[ i..j] . iter( ) . max( ) . copied( ) . unwrap_or( i32 :: min_value( ) )
355
+ ) ;
356
+ }
357
+ }
358
+ assert_eq ! (
359
+ segtree. all_prod( ) ,
360
+ base. iter( ) . max( ) . copied( ) . unwrap_or( i32 :: min_value( ) )
361
+ ) ;
362
+ for k in 0 ..=10 {
363
+ let f = |x| x < k;
364
+ for i in 0 ..=n {
365
+ assert_eq ! (
366
+ Some ( segtree. max_right( i, f) ) ,
367
+ ( i..=n)
368
+ . filter( |& j| f( base[ i..j]
369
+ . iter( )
370
+ . max( )
371
+ . copied( )
372
+ . unwrap_or( i32 :: min_value( ) ) ) )
373
+ . max( )
374
+ ) ;
375
+ }
376
+ for j in 0 ..=n {
377
+ assert_eq ! (
378
+ Some ( segtree. min_left( j, f) ) ,
379
+ ( 0 ..=j)
380
+ . filter( |& i| f( base[ i..j]
381
+ . iter( )
382
+ . max( )
383
+ . copied( )
384
+ . unwrap_or( i32 :: min_value( ) ) ) )
385
+ . min( )
386
+ ) ;
387
+ }
388
+ }
389
+ }
390
+ }
0 commit comments