11//! # Segment Tree
22
3+ use std:: ops:: Range ;
4+
35/// see https://codeforces.com/blog/entry/112755
46///
57/// returns the split point of the range which
68/// makes the segment tree a complete binary tree
7- fn split ( tl : usize , tr : usize ) -> usize {
8- let pw2 = 1 << ( tr - tl ) . ilog2 ( ) ;
9- ( tl + pw2) . min ( tr - pw2 / 2 )
9+ fn split ( tr : & Range < usize > ) -> usize {
10+ let pw2 = 1 << tr . len ( ) . ilog2 ( ) ;
11+ ( tr . start + pw2) . min ( tr. end - pw2 / 2 )
1012}
1113
1214fn op ( vl : u64 , vr : u64 ) -> u64 {
@@ -18,9 +20,9 @@ fn op(vl: u64, vr: u64) -> u64 {
1820/// use programming_team_code_rust::data_structures::seg_tree::SegTree;
1921///
2022/// let mut seg_tree = SegTree::new(10);
21- /// seg_tree.update(0, 5, 1);
22- /// seg_tree.update(5, 10, 2);
23- /// assert_eq!(seg_tree.query(0, 10), 15);
23+ /// seg_tree.update(0.. 5, 1);
24+ /// seg_tree.update(5.. 10, 2);
25+ /// assert_eq!(seg_tree.query(0.. 10), 15);
2426/// ```
2527pub struct SegTree {
2628 n : usize ,
@@ -67,17 +69,18 @@ impl SegTree {
6769 }
6870 }
6971
70- fn apply ( & mut self , delta : u64 , tl : usize , tr : usize , v : usize ) {
71- self . tree [ v] += delta * ( tr - tl ) as u64 ;
72+ fn apply ( & mut self , delta : u64 , tr : & Range < usize > , v : usize ) {
73+ self . tree [ v] += delta * tr . len ( ) as u64 ;
7274 if v < self . n {
7375 self . lazy [ v] += delta;
7476 }
7577 }
7678
77- fn push ( & mut self , tl : usize , tm : usize , tr : usize , v : usize ) {
79+ fn push ( & mut self , tr : & Range < usize > , v : usize ) {
7880 if self . lazy [ v] > 0 {
79- self . apply ( self . lazy [ v] , tl, tm, 2 * v) ;
80- self . apply ( self . lazy [ v] , tm, tr, 2 * v + 1 ) ;
81+ let tm = split ( tr) ;
82+ self . apply ( self . lazy [ v] , & ( tr. start ..tm) , 2 * v) ;
83+ self . apply ( self . lazy [ v] , & ( tm..tr. end ) , 2 * v + 1 ) ;
8184 self . lazy [ v] = 0 ;
8285 }
8386 }
@@ -88,21 +91,21 @@ impl SegTree {
8891 /// # Complexity
8992 /// - Time: O(log(n))
9093 /// - Space: O(log(n)) due to the program stack
91- pub fn update ( & mut self , le : usize , ri : usize , delta : u64 ) {
92- self . update_impl ( le , ri , delta, 0 , self . n , 1 ) ;
94+ pub fn update ( & mut self , qr : Range < usize > , delta : u64 ) {
95+ self . update_impl ( & qr , delta, & ( 0 .. self . n ) , 1 ) ;
9396 }
9497
95- fn update_impl ( & mut self , le : usize , ri : usize , delta : u64 , tl : usize , tr : usize , v : usize ) {
96- if ri <= tl || tr <= le {
98+ fn update_impl ( & mut self , qr : & Range < usize > , delta : u64 , tr : & Range < usize > , v : usize ) {
99+ if qr . end <= tr . start || tr. end <= qr . start {
97100 return ;
98101 }
99- if le <= tl && tr <= ri {
100- return self . apply ( delta, tl , tr, v) ;
102+ if qr . start <= tr . start && tr. end <= qr . end {
103+ return self . apply ( delta, tr, v) ;
101104 }
102- let tm = split ( tl , tr) ;
103- self . push ( tl , tm , tr, v) ;
104- self . update_impl ( le , ri , delta, tl , tm , 2 * v) ;
105- self . update_impl ( le , ri , delta, tm , tr , 2 * v + 1 ) ;
105+ let tm = split ( tr) ;
106+ self . push ( tr, v) ;
107+ self . update_impl ( qr , delta, & ( tr . start ..tm ) , 2 * v) ;
108+ self . update_impl ( qr , delta, & ( tm..tr . end ) , 2 * v + 1 ) ;
106109 self . tree [ v] = op ( self . tree [ 2 * v] , self . tree [ 2 * v + 1 ] ) ;
107110 }
108111
@@ -111,22 +114,22 @@ impl SegTree {
111114 /// # Complexity
112115 /// - Time: O(log(n))
113116 /// - Space: O(log(n)) due to the program stack
114- pub fn query ( & mut self , le : usize , ri : usize ) -> u64 {
115- self . query_impl ( le , ri , 0 , self . n , 1 )
117+ pub fn query ( & mut self , qr : Range < usize > ) -> u64 {
118+ self . query_impl ( & qr , & ( 0 .. self . n ) , 1 )
116119 }
117120
118- fn query_impl ( & mut self , le : usize , ri : usize , tl : usize , tr : usize , v : usize ) -> u64 {
119- if ri <= tl || tr <= le {
121+ fn query_impl ( & mut self , qr : & Range < usize > , tr : & Range < usize > , v : usize ) -> u64 {
122+ if qr . end <= tr . start || tr. end <= qr . start {
120123 return 0 ;
121124 }
122- if le <= tl && tr <= ri {
125+ if qr . start <= tr . start && tr. end <= qr . end {
123126 return self . tree [ v] ;
124127 }
125- let tm = split ( tl , tr) ;
126- self . push ( tl , tm , tr, v) ;
128+ let tm = split ( tr) ;
129+ self . push ( tr, v) ;
127130 op (
128- self . query_impl ( le , ri , tl , tm , 2 * v) ,
129- self . query_impl ( le , ri , tm , tr , 2 * v + 1 ) ,
131+ self . query_impl ( qr , & ( tr . start ..tm ) , 2 * v) ,
132+ self . query_impl ( qr , & ( tm..tr . end ) , 2 * v + 1 ) ,
130133 )
131134 }
132135}
0 commit comments