ac-library-rb 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/unittest.yml +16 -0
- data/.gitignore +11 -0
- data/.rubocop.yml +198 -0
- data/Gemfile +3 -0
- data/LICENSE +116 -0
- data/README.ja.md +56 -0
- data/README.md +41 -0
- data/Rakefile +11 -0
- data/ac-library-rb.gemspec +32 -0
- data/bin/console +8 -0
- data/bin/lock_lib.rb +27 -0
- data/bin/setup +8 -0
- data/document_en/binary_index_tree.md +3 -0
- data/document_en/convolution.md +67 -0
- data/document_en/dsu.md +132 -0
- data/document_en/fenwick_tree.md +99 -0
- data/document_en/index.md +79 -0
- data/document_en/lazy_segtree.md +141 -0
- data/document_en/math.md +104 -0
- data/document_en/max_flow.md +165 -0
- data/document_en/min_cost_flow.md +132 -0
- data/document_en/modint.md +263 -0
- data/document_en/priority_queue.md +119 -0
- data/document_en/segtree.md +134 -0
- data/document_en/string.md +106 -0
- data/document_en/two_sat.md +91 -0
- data/document_en/union_find.md +3 -0
- data/document_ja/convolution.md +64 -0
- data/document_ja/dsu.md +183 -0
- data/document_ja/fenwick_tree.md +83 -0
- data/document_ja/index.md +89 -0
- data/document_ja/lazy_segtree.md +135 -0
- data/document_ja/math.md +116 -0
- data/document_ja/max_flow.md +129 -0
- data/document_ja/min_cost_flow.md +105 -0
- data/document_ja/modint.md +349 -0
- data/document_ja/priority_queue.md +103 -0
- data/document_ja/scc.md +65 -0
- data/document_ja/segtree.md +145 -0
- data/document_ja/string.md +105 -0
- data/document_ja/two_sat.md +87 -0
- data/lib/ac-library-rb/version.rb +3 -0
- data/lib/convolution.rb +124 -0
- data/lib/core_ext/modint.rb +19 -0
- data/lib/crt.rb +52 -0
- data/lib/dsu.rb +44 -0
- data/lib/fenwick_tree.rb +48 -0
- data/lib/floor_sum.rb +21 -0
- data/lib/inv_mod.rb +26 -0
- data/lib/lazy_segtree.rb +149 -0
- data/lib/lcp_array.rb +23 -0
- data/lib/max_flow.rb +137 -0
- data/lib/min_cost_flow.rb +143 -0
- data/lib/modint.rb +170 -0
- data/lib/pow_mod.rb +13 -0
- data/lib/priority_queue.rb +89 -0
- data/lib/scc.rb +77 -0
- data/lib/segtree.rb +140 -0
- data/lib/suffix_array.rb +128 -0
- data/lib/two_sat.rb +34 -0
- data/lib/z_algorithm.rb +32 -0
- data/lib_helpers/ac-library-rb/all.rb +22 -0
- data/lib_lock/ac-library-rb.rb +22 -0
- data/lib_lock/ac-library-rb/convolution.rb +126 -0
- data/lib_lock/ac-library-rb/core_ext/modint.rb +19 -0
- data/lib_lock/ac-library-rb/crt.rb +54 -0
- data/lib_lock/ac-library-rb/dsu.rb +46 -0
- data/lib_lock/ac-library-rb/fenwick_tree.rb +50 -0
- data/lib_lock/ac-library-rb/floor_sum.rb +23 -0
- data/lib_lock/ac-library-rb/inv_mod.rb +28 -0
- data/lib_lock/ac-library-rb/lazy_segtree.rb +151 -0
- data/lib_lock/ac-library-rb/lcp_array.rb +25 -0
- data/lib_lock/ac-library-rb/max_flow.rb +139 -0
- data/lib_lock/ac-library-rb/min_cost_flow.rb +145 -0
- data/lib_lock/ac-library-rb/modint.rb +172 -0
- data/lib_lock/ac-library-rb/pow_mod.rb +15 -0
- data/lib_lock/ac-library-rb/priority_queue.rb +91 -0
- data/lib_lock/ac-library-rb/scc.rb +79 -0
- data/lib_lock/ac-library-rb/segtree.rb +142 -0
- data/lib_lock/ac-library-rb/suffix_array.rb +130 -0
- data/lib_lock/ac-library-rb/two_sat.rb +36 -0
- data/lib_lock/ac-library-rb/z_algorithm.rb +34 -0
- metadata +158 -0
@@ -0,0 +1,263 @@
|
|
1
|
+
# ModInt
|
2
|
+
|
3
|
+
This is a library that can be used for problems where the answer is divided by a certain number and the remainder is output.
|
4
|
+
|
5
|
+
It automatically takes the remainder when calculating, thus reducing errors.
|
6
|
+
|
7
|
+
## Caution
|
8
|
+
|
9
|
+
The use of this library ModInt may slow down the execution time.
|
10
|
+
|
11
|
+
Please be careful when using it.
|
12
|
+
|
13
|
+
## Example usage
|
14
|
+
|
15
|
+
First, set the remainder law with `ModInt.set_mod` or `ModInt.mod =`.
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
ModInt.set_mod(11)
|
19
|
+
ModInt.mod #=> 11
|
20
|
+
|
21
|
+
a = ModInt(10)
|
22
|
+
b = 3.to_m
|
23
|
+
|
24
|
+
p -b # 8 mod 11
|
25
|
+
|
26
|
+
p a + b # 2 mod 11
|
27
|
+
p 1 + a # 0 mod 11
|
28
|
+
p a - b # 7 mod 11
|
29
|
+
p b - a # 4 mod 11
|
30
|
+
|
31
|
+
p a * b # 8 mod 11
|
32
|
+
p b.inv # 4 mod 11
|
33
|
+
|
34
|
+
p a / b # 7 mod 11
|
35
|
+
|
36
|
+
a += b
|
37
|
+
p a # 2 mod 11
|
38
|
+
a -= b
|
39
|
+
p a # 10 mod 11
|
40
|
+
a *= b
|
41
|
+
p a # 8 mod 11
|
42
|
+
a /= b
|
43
|
+
p a # 10 mod 11
|
44
|
+
|
45
|
+
p ModInt(2)**4 # 5 mod 11
|
46
|
+
|
47
|
+
puts a #=> 10
|
48
|
+
|
49
|
+
p ModInt.raw(3) #=> 3 mod 11
|
50
|
+
```
|
51
|
+
|
52
|
+
## output with puts and p
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
ModInt.mod = 11
|
56
|
+
a = 12.to_m
|
57
|
+
|
58
|
+
puts a #=> 1
|
59
|
+
p a #=> 1 mod 11
|
60
|
+
```
|
61
|
+
|
62
|
+
`ModInt` defines `to_s` and `inspect`.
|
63
|
+
|
64
|
+
This causes `puts` to use `to_s` and `p` to use `inspect` internally, so the output is modified.
|
65
|
+
|
66
|
+
Note that the `puts` method is useful because it behaves no differently than the output of `Integer`, but conversely, it is indistinguishable.
|
67
|
+
|
68
|
+
## Singular methods.
|
69
|
+
|
70
|
+
### new(val = 0) -> ModInt
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
a = ModInt.new(10)
|
74
|
+
b = ModInt(3)
|
75
|
+
```
|
76
|
+
|
77
|
+
We have a syntax sugar `Kernel#ModInt` that does not use `new`.
|
78
|
+
|
79
|
+
#### [Reference] Integer#to_m, String#to_m
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
5.to_m
|
83
|
+
'2'.to_m
|
84
|
+
```
|
85
|
+
|
86
|
+
Converts `Integer` and `String` instances to `ModInt`.
|
87
|
+
|
88
|
+
**aliases** `to_modint`, `to_m`.
|
89
|
+
|
90
|
+
### set_mod(mod)
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
ModInt.set_mod(10**9 + 7)
|
94
|
+
ModInt.mod = 10**9 + 7
|
95
|
+
```
|
96
|
+
|
97
|
+
Use this method first to set the mod.
|
98
|
+
|
99
|
+
This is set to the global variable `$_mod` as an internal implementation.
|
100
|
+
|
101
|
+
It also internally checks whether `$_mod` is prime or not, and assigns a boolean value to the global variable `$_mod_is_prime`.
|
102
|
+
|
103
|
+
Note that you may not have many chances to use the return value of this method, but `mod=` returns the assigned argument as it is, while `set_mod` returns `[mod, mod.prime?]
|
104
|
+
|
105
|
+
**aliases** `set_mod`, `mod=`
|
106
|
+
|
107
|
+
### mod -> Integer
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
ModInt.mod
|
111
|
+
```
|
112
|
+
Returns mod.
|
113
|
+
|
114
|
+
This returns the global variable `$_mod` as an internal implementation.
|
115
|
+
|
116
|
+
### raw(val) -> ModInt
|
117
|
+
|
118
|
+
Returns
|
119
|
+
|
120
|
+
````ruby
|
121
|
+
ModInt.raw(2, 11) # 2 mod 11
|
122
|
+
````
|
123
|
+
|
124
|
+
Returns ModInt instead of taking mod for `val`.
|
125
|
+
|
126
|
+
This is a constructor for constant-fold speedup.
|
127
|
+
|
128
|
+
If `val` is guaranteed to be greater than or equal to `0` and not exceed `mod`, it is faster to generate `ModInt` here.
|
129
|
+
|
130
|
+
## Instance methods.
|
131
|
+
|
132
|
+
### val -> Integer
|
133
|
+
|
134
|
+
```ruby
|
135
|
+
ModInt.mod = 11
|
136
|
+
m = 12.to_m # 1 mod 11
|
137
|
+
n = -1.to_m # 10 mod 11
|
138
|
+
|
139
|
+
p i = m.val #=> 1
|
140
|
+
p j = n.to_i #=> 10
|
141
|
+
```
|
142
|
+
|
143
|
+
Returns the value of the body from an instance of the ModInt class.
|
144
|
+
|
145
|
+
As an internal implementation, it returns `@val`.
|
146
|
+
|
147
|
+
Use it to convert to `integer`.
|
148
|
+
|
149
|
+
**Aliases**
|
150
|
+
|
151
|
+
- `val`
|
152
|
+
- `to_i`.
|
153
|
+
|
154
|
+
#### Additional information about aliases
|
155
|
+
|
156
|
+
There is no difference between `val` and `to_i` as an alias for the instance method of `ModInt`. However, the `Integer` class also has a `to_i` method, so `to_i` is more flexible and Ruby-like. In the internal implementation, `to_i` is used so that either argument can be used. Note that `val` is the name of the function in the original, and `@val` is the name of the instance variable in the internal implementation.
|
157
|
+
|
158
|
+
### inv -> ModInt
|
159
|
+
|
160
|
+
```rb
|
161
|
+
ModInt.mod = 11
|
162
|
+
m = 3.to_m
|
163
|
+
|
164
|
+
p m.inv #=> 4 mod 11
|
165
|
+
```
|
166
|
+
|
167
|
+
It returns `y` such that `xy ≡ 1 (mod ModInt.mod)`.
|
168
|
+
|
169
|
+
That is, it returns the modulus inverse.
|
170
|
+
|
171
|
+
### pow(other) -> ModInt
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
ModInt.mod = 11
|
175
|
+
m = 2.to_m
|
176
|
+
|
177
|
+
p m**4 #=> 5 mod 11
|
178
|
+
p m.pow(4) #=> 5 mod 11
|
179
|
+
```
|
180
|
+
|
181
|
+
Only `integer` can be taken as argument.
|
182
|
+
|
183
|
+
### Various operations.
|
184
|
+
|
185
|
+
As with the `Integer` class, you can perform arithmetic operations between `ModInt` and `Integer`, or between `Integer` and `ModInt`.
|
186
|
+
See the usage examples for details.
|
187
|
+
|
188
|
+
```ruby
|
189
|
+
ModInt.mod = 11
|
190
|
+
|
191
|
+
p 5.to_m + 7.to_m #=> 1 mod 11
|
192
|
+
p 0 + -1.to_m #=> 10 mod 11
|
193
|
+
p -1.to_m + 0 #=> 10 mod 11
|
194
|
+
|
195
|
+
p 12.to_m == 23.to_m #=> true
|
196
|
+
p 12.to_m == 1 #=> true
|
197
|
+
```
|
198
|
+
|
199
|
+
#### [Note] How to compare Integer and ModInt
|
200
|
+
|
201
|
+
`Integer` and `ModInt` can be compared by `==`, `! =`, but some behaviors are different from the original ACL.
|
202
|
+
|
203
|
+
The `Integer` to be compared returns true or false in the range of [0, mod), but always returns `false` in other ranges. This library has a restriction in the range of [0, mod), but the original library does not, so it differs in this point.
|
204
|
+
|
205
|
+
## Verified
|
206
|
+
|
207
|
+
- [ABC156: D \- Bouquet](https://atcoder.jp/contests/abc156/tasks/abc156_d) held on 2020/2/22
|
208
|
+
- [AC Code 138ms 2020/10/5](https://atcoder.jp/contests/abc156/submissions/17205940)
|
209
|
+
- [ARC009: C \- Takahashi, 24 years old](https://atcoder.jp/contests/arc009/tasks/arc009_3) held on 2012/10/20
|
210
|
+
- [AC Code 1075ms 2020/10/5](https://atcoder.jp/contests/arc009/submissions/17206081)
|
211
|
+
- [AC code 901ms 2020/10/5](https://atcoder.jp/contests/arc009/submissions/17208378)
|
212
|
+
|
213
|
+
## Speedup Tips.
|
214
|
+
|
215
|
+
The methods `+`, `-`, `*`, and `/` use the methods `add!`, `sub!`, `mul!`, and `div!` for the ones that are internally duplicated with `dup`, respectively. If you can destructively change the receiver's `ModInt`, this method may be faster on a constant-duple basis.
|
216
|
+
|
217
|
+
## Reference links
|
218
|
+
|
219
|
+
- This library
|
220
|
+
- [The code of this library modint.rb(GitHub)](https://github.com/universato/ac-library-rb/blob/master/lib/modint.rb)
|
221
|
+
- Our library [Our code modint_test.rb(GitHub)](https://github.com/universato/ac-library-rb/blob/master/lib/modint.rb)
|
222
|
+
- The original library
|
223
|
+
- [Our implementation code modint.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/modint.hpp)
|
224
|
+
- Test code of the main library [modint_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/modint.hpp)
|
225
|
+
- Documentation of the original modint.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_ja/modint.md)
|
226
|
+
- Ruby Reference Manual
|
227
|
+
- [class Numeric \(Ruby 2\.7\.0 Reference Manual\)](https://docs.ruby-lang.org/ja/latest/class/Numeric.html)
|
228
|
+
- Others
|
229
|
+
- [Why don't you try using the modint struct? \(C\cH000000)}Noshi91's Notes](https://noshi91.hatenablog.com/entry/2019/03/31/174006)(Mar 31, 2019)
|
230
|
+
- [Implementing modint in Python \- Qiita](https://qiita.com/wotsushi/items/c936838df992b706084c)(Apr 1, 2019)
|
231
|
+
- [Documentation of the C# version of ModInt](https://github.com/key-moon/ac-library-cs/blob/master/document_ja/modint.md)
|
232
|
+
|
233
|
+
|
234
|
+
## Q&A.
|
235
|
+
|
236
|
+
### Why include it if it may slow down the execution time?
|
237
|
+
|
238
|
+
- Reproduction of the original library.
|
239
|
+
- Reproduction to the essential part of the code.
|
240
|
+
- To measure how slow it really is. As a benchmark.
|
241
|
+
- To increase the number of users, to check the demand, and to appeal for inclusion in Ruby itself.
|
242
|
+
|
243
|
+
### Advantages of ModInt
|
244
|
+
|
245
|
+
Ruby, unlike C/C++, has the following features.
|
246
|
+
|
247
|
+
- Definition of a negative number divided by a positive number that still returns a positive number
|
248
|
+
- Multiple length integers, no overflow (* If the number is too large, the calculation becomes slower)
|
249
|
+
|
250
|
+
Therefore, compared to C/C++, the advantages of using ModInt are diminished in some areas, but
|
251
|
+
|
252
|
+
- Improved readability
|
253
|
+
- There is no need to worry about forgetting to take ModInt.
|
254
|
+
|
255
|
+
The following are some of the advantages.
|
256
|
+
|
257
|
+
### The intention of using global variables is
|
258
|
+
|
259
|
+
We are using global variables `$_mod` and `$_mod_is_prime`.
|
260
|
+
|
261
|
+
Global variables are to be avoided, especially in practice.
|
262
|
+
|
263
|
+
Translated with www.DeepL.com/Translator (free version)
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# PriorityQueue
|
2
|
+
|
3
|
+
PriorityQueue
|
4
|
+
|
5
|
+
**Alias**
|
6
|
+
|
7
|
+
- `HeapQueue`
|
8
|
+
|
9
|
+
## Class Methods
|
10
|
+
|
11
|
+
### new(array = []) -> PriorityQueue
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
PriorityQueue.new
|
15
|
+
pq = PriorityQueue.new([1, -1, 100])
|
16
|
+
pq.pop # => 100
|
17
|
+
pq.pop # => 1
|
18
|
+
pq.pop # => -1
|
19
|
+
```
|
20
|
+
|
21
|
+
It creates a `PriorityQueue` to initialized to `array`.
|
22
|
+
|
23
|
+
**Complexity**
|
24
|
+
|
25
|
+
- `O(n)` (`n` is the number of elements of `array`)
|
26
|
+
|
27
|
+
### new(array = []) {|x, y| ... } -> PriorityQueue
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
PriorityQueue.new([1, -1, 100]) {|x, y| x < y }
|
31
|
+
pq.pop # => -1
|
32
|
+
pq.pop # => 1
|
33
|
+
pq.pop # => 100
|
34
|
+
```
|
35
|
+
|
36
|
+
Constructs a prioritized queue from an array given as an argument.
|
37
|
+
A comparison function can be passed in the block. When a comparison function is passed, it is used to calculate the priority of the elements.
|
38
|
+
|
39
|
+
Any object can be an element of the queue if it can be compared with the comparison function.
|
40
|
+
|
41
|
+
**Complexity**
|
42
|
+
|
43
|
+
- `O(n)` (`n` is the number of elements of `array`)
|
44
|
+
|
45
|
+
## Instance Methods
|
46
|
+
|
47
|
+
### push(item)
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
pq.push(10)
|
51
|
+
```
|
52
|
+
|
53
|
+
It adds the element.
|
54
|
+
|
55
|
+
**Alias**
|
56
|
+
|
57
|
+
- `<<`
|
58
|
+
- `append`
|
59
|
+
|
60
|
+
**Complexity**
|
61
|
+
|
62
|
+
- `O(log n)` (`n` is the number of elements of priority queue)
|
63
|
+
|
64
|
+
### pop -> Highest priority element | nil
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
pq.pop # => 100
|
68
|
+
```
|
69
|
+
|
70
|
+
It removes the element with the highest priority from the queue and returns it. If the queue is empty, it rerurns `nil`.
|
71
|
+
|
72
|
+
**Complexity**
|
73
|
+
|
74
|
+
- `O(log n)` (`n` is the number of elements of priority queue)
|
75
|
+
|
76
|
+
### get -> Highest priority element | nil
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
pq.get # => 10
|
80
|
+
```
|
81
|
+
|
82
|
+
It returns the value of the highest priority element without removing it.
|
83
|
+
|
84
|
+
If the queue is empty, it returns `nil`.
|
85
|
+
|
86
|
+
**Alias**
|
87
|
+
|
88
|
+
- `top`
|
89
|
+
|
90
|
+
**Complexity**
|
91
|
+
|
92
|
+
- `O(1)`
|
93
|
+
|
94
|
+
### empty? -> bool
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
pq.empty? # => false
|
98
|
+
```
|
99
|
+
|
100
|
+
It returns `true` if the queue is empty, `false` otherwise.
|
101
|
+
|
102
|
+
**Complexity** `O(1)`
|
103
|
+
|
104
|
+
### heap -> Array[elements of priority queue]
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
pq.heap
|
108
|
+
```
|
109
|
+
|
110
|
+
It returns the binary heap that the priority queue has internally.
|
111
|
+
|
112
|
+
## Verified
|
113
|
+
|
114
|
+
- [Aizu Online Judge ALDS1_9_C Priority Queue](https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_9_C)
|
115
|
+
- [AC code](https://onlinejudge.u-aizu.ac.jp/solutions/problem/ALDS1_9_C/review/4835681/qsako6/Ruby)
|
116
|
+
|
117
|
+
## Links
|
118
|
+
|
119
|
+
- [cpython/heapq.py at master - python/cpython](https://github.com/python/cpython/blob/master/Lib/heapq.py)
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# Segtree
|
2
|
+
|
3
|
+
Segment Tree
|
4
|
+
|
5
|
+
## Class Methods
|
6
|
+
|
7
|
+
### new(n, e, &op) -> Segtree
|
8
|
+
|
9
|
+
```rb
|
10
|
+
seg = Segtree.new(n, e) { |x, y| ... }
|
11
|
+
```
|
12
|
+
|
13
|
+
It creates an array `a` of length `n`. All the elements are initialized to `e`.
|
14
|
+
|
15
|
+
- `block`: returns `op(x, y)`
|
16
|
+
- `e`: identity element.
|
17
|
+
|
18
|
+
### new(ary, e, &op) -> Segtree
|
19
|
+
|
20
|
+
```rb
|
21
|
+
seg = Segtree.new(ary, e) { |x, y| ... }
|
22
|
+
```
|
23
|
+
|
24
|
+
It creates an array `seg` of length `n` = `ary.size`, initialized to `ary`.
|
25
|
+
|
26
|
+
- `block`: returns `op(x, y)`
|
27
|
+
- `e`: identity element.
|
28
|
+
|
29
|
+
**complexty**
|
30
|
+
|
31
|
+
- `O(n)`
|
32
|
+
|
33
|
+
<details>
|
34
|
+
<summary>Monoid Exmaples</summary>
|
35
|
+
|
36
|
+
```rb
|
37
|
+
n = 10**5
|
38
|
+
inf = (1 << 60) - 1
|
39
|
+
|
40
|
+
Segtree.new(n, 0) { |x, y| x.gcd y } # gcd
|
41
|
+
Segtree.new(n, 1) { |x, y| x.lcm y } # lcm
|
42
|
+
Segtree.new(n, -inf) { |x, y| [x, y].max } # max
|
43
|
+
Segtree.new(n, inf) { |x, y| [x, y].min } # min
|
44
|
+
Segtree.new(n, 0) { |x, y| x | y } # or
|
45
|
+
Segtree.new(n, 1) { |x, y| x * y } # prod
|
46
|
+
Segtree.new(n, 0) { |x, y| x + y } # sum
|
47
|
+
```
|
48
|
+
|
49
|
+
</details>
|
50
|
+
|
51
|
+
## Instance Methods
|
52
|
+
|
53
|
+
### set
|
54
|
+
|
55
|
+
```rb
|
56
|
+
seg.set(pos, x)
|
57
|
+
```
|
58
|
+
|
59
|
+
It assigns `x` to `a[pos]`.
|
60
|
+
|
61
|
+
**Complexity** `O(logn)`
|
62
|
+
|
63
|
+
### get
|
64
|
+
|
65
|
+
```rb
|
66
|
+
seg.get(pos)
|
67
|
+
```
|
68
|
+
|
69
|
+
It returns `a[pos]`
|
70
|
+
|
71
|
+
**Complexity** `O(1)`
|
72
|
+
|
73
|
+
### prod
|
74
|
+
|
75
|
+
```rb
|
76
|
+
seg.prod(l, r)
|
77
|
+
```
|
78
|
+
|
79
|
+
It returns `op(a[l], ..., a[r - 1])` .
|
80
|
+
|
81
|
+
**Constraints**
|
82
|
+
|
83
|
+
- `0 ≦ l ≦ r ≦ n`
|
84
|
+
|
85
|
+
**Complexity**
|
86
|
+
|
87
|
+
- `O(logn)`
|
88
|
+
|
89
|
+
### all_prod
|
90
|
+
|
91
|
+
```rb
|
92
|
+
seg.all_prod
|
93
|
+
```
|
94
|
+
|
95
|
+
It returns `op(a[0], ..., a[n - 1])`.
|
96
|
+
|
97
|
+
**Complexity**
|
98
|
+
|
99
|
+
- `O(1)`
|
100
|
+
|
101
|
+
### max_right(l, &f) -> Integer
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
seg.max_right(l, &f)
|
105
|
+
```
|
106
|
+
|
107
|
+
It applies binary search on the segment tree.
|
108
|
+
|
109
|
+
### min_left(r, &f) -> Integer
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
seg.min_left(r, &f)
|
113
|
+
```
|
114
|
+
|
115
|
+
It applies binary search on the segment tree.
|
116
|
+
|
117
|
+
## Verified
|
118
|
+
|
119
|
+
- [ALPC: J \- Segment Tree](https://atcoder.jp/contests/practice2/tasks/practice2_j)
|
120
|
+
- [F \- Range Xor Query](https://atcoder.jp/contests/abc185/tasks/abc185_f)
|
121
|
+
- [AC Code(1538ms)](https://atcoder.jp/contests/abc185/submissions/18746817): Segtree(xor)
|
122
|
+
- [AC Code(821ms)](https://atcoder.jp/contests/abc185/submissions/18769200): FenwickTree(BIT) xor
|
123
|
+
|
124
|
+
## 参考リンク
|
125
|
+
|
126
|
+
- ac-library
|
127
|
+
- [Code segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/segtree.rb)
|
128
|
+
- [Test segtree_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/segtree_test.rb)
|
129
|
+
- AtCoder Library
|
130
|
+
- [Document HTML](https://atcoder.github.io/ac-library/document_en/segtree.html)
|
131
|
+
- [Documetn appendix.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_en/appendix.md)
|
132
|
+
- [Code segtree.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/segtree.hpp)
|
133
|
+
- [Test segtree_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/unittest/segtree_test.cpp)
|
134
|
+
- [Sample code segtree_practice.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/example/segtree_practice.cpp)
|