Skip to content

Commit 2952ba9

Browse files
committed
better stree impl
1 parent 3b2c7d5 commit 2952ba9

3 files changed

Lines changed: 43 additions & 27 deletions

File tree

src/rust_solutions/2179_count-good-triplets-in-an-array.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,23 @@ impl STree {
3737
}
3838
}
3939

40-
fn query(&mut self, idx_1: usize, idx_2: usize) -> i32 {
41-
let (mut lp, mut rp) = (self.n + idx_1 - 1, self.n + idx_2);
40+
fn query(&self, idx_1: usize, idx_2: usize) -> i32 {
41+
let (mut lp, mut rp) = (self.n + idx_1 - 1, self.n + idx_2 - 1);
4242

4343
let mut res = 0;
4444

45-
while lp < rp {
45+
loop {
4646
if lp % 2 == 0 {
4747
res += self.tree[lp];
4848
lp += 1;
4949
}
50-
if rp % 2 == 0 {
51-
res += self.tree[rp - 1];
50+
if rp % 2 == 1 {
51+
res += self.tree[rp];
52+
rp -= 1;
53+
}
54+
55+
if lp > rp {
56+
break;
5257
}
5358

5459
lp = (lp - 1) / 2;
@@ -83,7 +88,7 @@ impl Solution {
8388
l_tree.update(pos, 1);
8489
r_tree.update(pos, 0);
8590

86-
let left = l_tree.query(0, pos - 1);
91+
let left = if pos > 0 { l_tree.query(0, pos - 1) } else {0 };
8792
let right = r_tree.query(pos + 1, nums1.len() - 1);
8893
count += left as i64 * right as i64;
8994
}

src/rust_solutions/2411_smallest-subarrays-with-maximum-bitwise-or.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,30 @@ impl STree {
3838
}
3939
}
4040

41-
fn query(&self, l_idx: usize, r_idx: usize) -> i32 {
42-
let (mut l_ptr, mut r_ptr) = (self.n + l_idx - 1, self.n + r_idx);
41+
fn query(&self, idx_1: usize, idx_2: usize) -> i32 {
42+
let (mut lp, mut rp) = (self.n + idx_1 - 1, self.n + idx_2 - 1);
4343

44-
let mut sum = 0;
44+
let mut res = 0;
4545

46-
while l_ptr < r_ptr {
47-
if l_ptr % 2 == 0 {
48-
sum |= self.tree[l_ptr];
49-
l_ptr += 1;
46+
loop {
47+
if lp % 2 == 0 {
48+
res |= self.tree[lp];
49+
lp += 1;
5050
}
51-
if r_ptr % 2 == 0 {
52-
sum |= self.tree[r_ptr - 1];
51+
if rp % 2 == 1 {
52+
res |= self.tree[rp];
53+
rp -= 1;
5354
}
5455

55-
l_ptr = (l_ptr - 1) / 2;
56-
r_ptr = (r_ptr - 1) / 2;
56+
if lp > rp {
57+
break;
58+
}
59+
60+
lp = (lp - 1) / 2;
61+
rp = (rp - 1) / 2;
5762
}
5863

59-
sum
64+
res
6065
}
6166
}
6267

src/rust_solutions/3355_zero-array-transformation-i.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,26 @@ impl STree {
4040
}
4141

4242
fn query(&self, idx_1: usize, idx_2: usize) -> i32 {
43-
let (mut l_ptr, mut r_ptr) = (self.n + idx_1 - 1, self.n + idx_2);
43+
let (mut lp, mut rp) = (self.n + idx_1 - 1, self.n + idx_2 - 1);
44+
4445
let mut res = 0;
4546

46-
while l_ptr < r_ptr {
47-
if l_ptr % 2 == 0 {
48-
res += self.v[l_ptr];
49-
l_ptr += 1;
47+
loop {
48+
if lp % 2 == 0 {
49+
res += self.v[lp];
50+
lp += 1;
51+
}
52+
if rp % 2 == 1 {
53+
res += self.v[rp];
54+
rp -= 1;
5055
}
51-
if r_ptr % 2 == 0 {
52-
res += self.v[r_ptr - 1];
56+
57+
if lp > rp {
58+
break;
5359
}
5460

55-
l_ptr = (l_ptr - 1) / 2;
56-
r_ptr = (r_ptr - 1) / 2;
61+
lp = (lp - 1) / 2;
62+
rp = (rp - 1) / 2;
5763
}
5864

5965
res

0 commit comments

Comments
 (0)