@@ -5,7 +5,7 @@ use std::marker::PhantomData;
5
5
6
6
// TODO Should I split monoid-related traits to another module?
7
7
pub trait Monoid {
8
- type S : Copy ;
8
+ type S : Clone ;
9
9
fn identity ( ) -> Self :: S ;
10
10
fn binary_operation ( a : Self :: S , b : Self :: S ) -> Self :: S ;
11
11
}
@@ -63,7 +63,7 @@ impl<M: Monoid> Segtree<M> {
63
63
64
64
pub fn get ( & self , p : usize ) -> M :: S {
65
65
assert ! ( p < self . n) ;
66
- self . d [ p + self . size ]
66
+ self . d [ p + self . size ] . clone ( )
67
67
}
68
68
69
69
pub fn prod ( & self , mut l : usize , mut r : usize ) -> M :: S {
@@ -75,12 +75,12 @@ impl<M: Monoid> Segtree<M> {
75
75
76
76
while l < r {
77
77
if l & 1 != 0 {
78
- sml = M :: binary_operation ( sml, self . d [ l] ) ;
78
+ sml = M :: binary_operation ( sml, self . d [ l] . clone ( ) ) ;
79
79
l += 1 ;
80
80
}
81
81
if r & 1 != 0 {
82
82
r -= 1 ;
83
- smr = M :: binary_operation ( self . d [ r] , smr) ;
83
+ smr = M :: binary_operation ( self . d [ r] . clone ( ) , smr) ;
84
84
}
85
85
l >>= 1 ;
86
86
r >>= 1 ;
@@ -90,7 +90,7 @@ impl<M: Monoid> Segtree<M> {
90
90
}
91
91
92
92
pub fn all_prod ( & self ) -> M :: S {
93
- self . d [ 1 ]
93
+ self . d [ 1 ] . clone ( )
94
94
}
95
95
96
96
pub fn max_right < F > ( & self , mut l : usize , f : F ) -> usize
@@ -109,18 +109,18 @@ impl<M: Monoid> Segtree<M> {
109
109
while l % 2 == 0 {
110
110
l >>= 1 ;
111
111
}
112
- if !f ( M :: binary_operation ( sm, self . d [ l] ) ) {
112
+ if !f ( M :: binary_operation ( sm. clone ( ) , self . d [ l] . clone ( ) ) ) {
113
113
while l < self . size {
114
114
l *= 2 ;
115
- let res = M :: binary_operation ( sm, self . d [ l] ) ;
116
- if f ( res) {
115
+ let res = M :: binary_operation ( sm. clone ( ) , self . d [ l] . clone ( ) ) ;
116
+ if f ( res. clone ( ) ) {
117
117
sm = res;
118
118
l += 1 ;
119
119
}
120
120
}
121
121
return l - self . size ;
122
122
}
123
- sm = M :: binary_operation ( sm, self . d [ l] ) ;
123
+ sm = M :: binary_operation ( sm. clone ( ) , self . d [ l] . clone ( ) ) ;
124
124
l += 1 ;
125
125
// while
126
126
{
@@ -148,18 +148,18 @@ impl<M: Monoid> Segtree<M> {
148
148
while r > 1 && r % 2 == 1 {
149
149
r >>= 1 ;
150
150
}
151
- if !f ( M :: binary_operation ( self . d [ r] , sm) ) {
151
+ if !f ( M :: binary_operation ( self . d [ r] . clone ( ) , sm. clone ( ) ) ) {
152
152
while r < self . size {
153
153
r = 2 * r + 1 ;
154
- let res = M :: binary_operation ( self . d [ r] , sm) ;
155
- if f ( res) {
154
+ let res = M :: binary_operation ( self . d [ r] . clone ( ) , sm. clone ( ) ) ;
155
+ if f ( res. clone ( ) ) {
156
156
sm = res;
157
157
r -= 1 ;
158
158
}
159
159
}
160
160
return r + 1 - self . size ;
161
161
}
162
- sm = M :: binary_operation ( self . d [ r] , sm) ;
162
+ sm = M :: binary_operation ( self . d [ r] . clone ( ) , sm. clone ( ) ) ;
163
163
// while
164
164
{
165
165
let r = r as isize ;
@@ -170,7 +170,7 @@ impl<M: Monoid> Segtree<M> {
170
170
}
171
171
172
172
fn update ( & mut self , k : usize ) {
173
- self . d [ k] = M :: binary_operation ( self . d [ 2 * k] , self . d [ 2 * k + 1 ] ) ;
173
+ self . d [ k] = M :: binary_operation ( self . d [ 2 * k] . clone ( ) , self . d [ 2 * k + 1 ] . clone ( ) ) ;
174
174
}
175
175
}
176
176
0 commit comments