Skip to content

Commit ded9a93

Browse files
Added LazySegTree
1 parent dc1c6b7 commit ded9a93

File tree

2 files changed

+287
-0
lines changed

2 files changed

+287
-0
lines changed

src/lazysegtree.rs

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,287 @@
1+
use crate::internal_bit::ceil_pow2;
2+
use crate::Monoid;
13

4+
pub trait MapMonoid {
5+
type M: Monoid;
6+
type F: Copy;
7+
// type S = <Self::M as Monoid>::S;
8+
fn identity_element() -> <Self::M as Monoid>::S {
9+
Self::M::identity()
10+
}
11+
fn binary_operation(
12+
a: <Self::M as Monoid>::S,
13+
b: <Self::M as Monoid>::S,
14+
) -> <Self::M as Monoid>::S {
15+
Self::M::binary_operation(a, b)
16+
}
17+
fn identity_map() -> Self::F;
18+
fn mapping(f: Self::F, x: <Self::M as Monoid>::S) -> <Self::M as Monoid>::S;
19+
fn composition(f: Self::F, g: Self::F) -> Self::F;
20+
}
21+
22+
impl<F: MapMonoid> Default for LazySegtree<F> {
23+
fn default() -> Self {
24+
Self::new(0)
25+
}
26+
}
27+
impl<F: MapMonoid> LazySegtree<F> {
28+
pub fn new(n: usize) -> Self {
29+
vec![F::identity_element(); n].into()
30+
}
31+
}
32+
impl<F: MapMonoid> From<Vec<<F::M as Monoid>::S>> for LazySegtree<F> {
33+
fn from(v: Vec<<F::M as Monoid>::S>) -> Self {
34+
let n = v.len();
35+
let log = ceil_pow2(n as u32) as usize;
36+
let size = 1 << log;
37+
let mut d = vec![F::identity_element(); 2 * size];
38+
let lz = vec![F::identity_map(); size];
39+
d[size..(size + n)].clone_from_slice(&v);
40+
let mut ret = LazySegtree {
41+
n,
42+
size,
43+
log,
44+
d,
45+
lz,
46+
};
47+
for i in (1..size).rev() {
48+
ret.update(i);
49+
}
50+
ret
51+
}
52+
}
53+
54+
impl<F: MapMonoid> LazySegtree<F> {
55+
pub fn set(&mut self, mut p: usize, x: <F::M as Monoid>::S) {
56+
assert!(p < self.n);
57+
p += self.size;
58+
for i in (1..=self.log).rev() {
59+
self.push(p >> i);
60+
}
61+
self.d[p] = x;
62+
for i in 1..=self.log {
63+
self.update(p >> i);
64+
}
65+
}
66+
67+
pub fn get(&mut self, mut p: usize) -> <F::M as Monoid>::S {
68+
assert!(p < self.n);
69+
p += self.size;
70+
for i in (1..=self.log).rev() {
71+
self.push(p >> i);
72+
}
73+
self.d[p].clone()
74+
}
75+
76+
pub fn prod(&mut self, mut l: usize, mut r: usize) -> <F::M as Monoid>::S {
77+
assert!(l <= r && r <= self.n);
78+
if l == r {
79+
return F::identity_element();
80+
}
81+
82+
l += self.size;
83+
r += self.size;
84+
85+
for i in (1..=self.log).rev() {
86+
if ((l >> i) << i) != l {
87+
self.push(l >> i);
88+
}
89+
if ((r >> i) << i) != r {
90+
self.push(r >> i);
91+
}
92+
}
93+
94+
let mut sml = F::identity_element();
95+
let mut smr = F::identity_element();
96+
while l < r {
97+
if l & 1 != 0 {
98+
sml = F::binary_operation(sml, self.d[l].clone());
99+
l += 1;
100+
}
101+
if r & 1 != 0 {
102+
r -= 1;
103+
smr = F::binary_operation(self.d[r].clone(), smr);
104+
}
105+
l >>= 1;
106+
r >>= 1;
107+
}
108+
109+
F::binary_operation(sml, smr)
110+
}
111+
112+
pub fn all_prod(&self) -> <F::M as Monoid>::S {
113+
self.d[1].clone()
114+
}
115+
116+
pub fn apply(&mut self, mut p: usize, f: F::F) {
117+
assert!(p < self.n);
118+
p += self.size;
119+
for i in (1..=self.log).rev() {
120+
self.push(p >> i);
121+
}
122+
self.d[p] = F::mapping(f, self.d[p].clone());
123+
for i in 1..=self.log {
124+
self.update(p >> i);
125+
}
126+
}
127+
pub fn apply_range(&mut self, mut l: usize, mut r: usize, f: F::F) {
128+
assert!(l <= r && r <= self.n);
129+
if l == r {
130+
return;
131+
}
132+
133+
l += self.size;
134+
r += self.size;
135+
136+
for i in (1..=self.log).rev() {
137+
if ((l >> i) << i) != l {
138+
self.push(l >> i);
139+
}
140+
if ((r >> i) << i) != r {
141+
self.push((r - 1) >> i);
142+
}
143+
}
144+
145+
{
146+
let l2 = l;
147+
let r2 = r;
148+
while l < r {
149+
if l & 1 != 0 {
150+
self.all_apply(l, f.clone());
151+
l += 1;
152+
}
153+
if r & 1 != 0 {
154+
r -= 1;
155+
self.all_apply(r, f.clone());
156+
}
157+
l >>= 1;
158+
r >>= 1;
159+
}
160+
l = l2;
161+
r = r2;
162+
}
163+
164+
for i in 1..=self.log {
165+
if ((l >> i) << i) != l {
166+
self.update(l >> i);
167+
}
168+
if ((r >> i) << i) != r {
169+
self.update((r - 1) >> i);
170+
}
171+
}
172+
}
173+
174+
pub fn max_right<G>(&mut self, mut l: usize, g: G) -> usize
175+
where
176+
G: Fn(<F::M as Monoid>::S) -> bool,
177+
{
178+
assert!(l <= self.n);
179+
assert!(g(F::identity_element()));
180+
if l == self.n {
181+
return self.n;
182+
}
183+
l += self.size;
184+
for i in (1..=self.log).rev() {
185+
self.push(l >> i);
186+
}
187+
let mut sm = F::identity_element();
188+
while {
189+
// do
190+
while l % 2 == 0 {
191+
l >>= 1;
192+
}
193+
if !g(F::binary_operation(sm.clone(), self.d[l].clone())) {
194+
while l < self.size {
195+
self.push(l);
196+
l *= 2;
197+
let res = F::binary_operation(sm.clone(), self.d[l].clone());
198+
if g(res.clone()) {
199+
sm = res;
200+
l += 1;
201+
}
202+
}
203+
return l - self.size;
204+
}
205+
sm = F::binary_operation(sm, self.d[l].clone());
206+
l += 1;
207+
//while
208+
{
209+
let l = l as isize;
210+
(l & -l) != l
211+
}
212+
} {}
213+
self.n
214+
}
215+
216+
pub fn min_left<G>(&mut self, mut r: usize, g: G) -> usize
217+
where
218+
G: Fn(<F::M as Monoid>::S) -> bool,
219+
{
220+
assert!(r <= self.n);
221+
assert!(g(F::identity_element()));
222+
if r == 0 {
223+
return self.n;
224+
}
225+
r += self.size;
226+
for i in (1..=self.log).rev() {
227+
self.push((r - 1) >> i);
228+
}
229+
let mut sm = F::identity_element();
230+
while {
231+
// do
232+
r -= 1;
233+
while r > 1 && r % 2 != 0 {
234+
r >>= 1;
235+
}
236+
if !g(F::binary_operation(self.d[r].clone(), sm.clone())) {
237+
while r < self.size {
238+
self.push(r);
239+
r = 2 * r + 1;
240+
let res = F::binary_operation(self.d[r].clone(), sm.clone());
241+
if g(res.clone()) {
242+
sm = res;
243+
r -= 1;
244+
}
245+
}
246+
return r + 1 - self.size;
247+
}
248+
sm = F::binary_operation(self.d[r].clone(), sm);
249+
// while
250+
{
251+
let r = r as isize;
252+
(r & -r) != r
253+
}
254+
} {}
255+
0
256+
}
257+
}
258+
259+
pub struct LazySegtree<F>
260+
where
261+
F: MapMonoid,
262+
{
263+
n: usize,
264+
size: usize,
265+
log: usize,
266+
d: Vec<<F::M as Monoid>::S>,
267+
lz: Vec<F::F>,
268+
}
269+
impl<F> LazySegtree<F>
270+
where
271+
F: MapMonoid,
272+
{
273+
fn update(&mut self, k: usize) {
274+
self.d[k] = F::binary_operation(self.d[2 * k].clone(), self.d[2 * k + 1].clone());
275+
}
276+
fn all_apply(&mut self, k: usize, f: F::F) {
277+
self.d[k] = F::mapping(f, self.d[k].clone());
278+
if k < self.size {
279+
self.lz[k] = F::composition(f, self.lz[k]);
280+
}
281+
}
282+
fn push(&mut self, k: usize) {
283+
self.all_apply(2 * k, self.lz[k]);
284+
self.all_apply(2 * k + 1, self.lz[k]);
285+
self.lz[k] = F::identity_map();
286+
}
287+
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub(crate) mod internal_type_traits;
2020

2121
pub use dsu::Dsu;
2222
pub use fenwicktree::FenwickTree;
23+
pub use lazysegtree::{LazySegtree, MapMonoid};
2324
pub use math::{crt, floor_sum, inv_mod, pow_mod};
2425
pub use mincostflow::MinCostFlowGraph;
2526
pub use modint::{

0 commit comments

Comments
 (0)