ac-library-rb 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -0
  3. data/README.ja.md +102 -4
  4. data/README.md +73 -1
  5. data/Rakefile +2 -1
  6. data/ac-library-rb.gemspec +3 -2
  7. data/bin/lock_lib.rb +13 -7
  8. data/document_en/dsu.md +2 -2
  9. data/document_en/lazy_segtree.md +20 -4
  10. data/document_en/max_flow.md +1 -1
  11. data/document_en/min_cost_flow.md +1 -1
  12. data/document_en/segtree.md +36 -3
  13. data/document_en/two_sat.md +1 -1
  14. data/document_ja/dsu.md +1 -3
  15. data/document_ja/lazy_segtree.md +63 -19
  16. data/document_ja/max_flow.md +1 -1
  17. data/document_ja/min_cost_flow.md +1 -1
  18. data/document_ja/scc.md +4 -3
  19. data/document_ja/segtree.md +49 -8
  20. data/document_ja/two_sat.md +1 -1
  21. data/lib/ac-library-rb/version.rb +1 -1
  22. data/lib/convolution.rb +21 -0
  23. data/lib/core_ext/all.rb +11 -0
  24. data/lib/dsu.rb +9 -6
  25. data/lib/fenwick_tree.rb +22 -8
  26. data/lib/floor_sum.rb +33 -10
  27. data/lib/lazy_segtree.rb +83 -10
  28. data/lib/max_flow.rb +10 -4
  29. data/lib/min_cost_flow.rb +13 -7
  30. data/lib/modint.rb +3 -1
  31. data/lib/scc.rb +21 -13
  32. data/lib/segtree.rb +38 -26
  33. data/lib/suffix_array.rb +8 -8
  34. data/lib/two_sat.rb +5 -3
  35. data/lib_lock/ac-library-rb.rb +2 -0
  36. data/lib_lock/ac-library-rb/convolution.rb +21 -0
  37. data/lib_lock/ac-library-rb/core_ext/all.rb +11 -0
  38. data/lib_lock/ac-library-rb/core_ext/modint.rb +3 -3
  39. data/lib_lock/ac-library-rb/dsu.rb +9 -6
  40. data/lib_lock/ac-library-rb/fenwick_tree.rb +22 -8
  41. data/lib_lock/ac-library-rb/floor_sum.rb +33 -10
  42. data/lib_lock/ac-library-rb/lazy_segtree.rb +83 -10
  43. data/lib_lock/ac-library-rb/max_flow.rb +10 -4
  44. data/lib_lock/ac-library-rb/min_cost_flow.rb +13 -7
  45. data/lib_lock/ac-library-rb/modint.rb +3 -1
  46. data/lib_lock/ac-library-rb/scc.rb +21 -13
  47. data/lib_lock/ac-library-rb/segtree.rb +38 -26
  48. data/lib_lock/ac-library-rb/suffix_array.rb +8 -8
  49. data/lib_lock/ac-library-rb/two_sat.rb +5 -3
  50. metadata +20 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a727abb00ad78ee815885a24058313b8d5d2d74dca890a7f86acec05a1409c29
4
- data.tar.gz: 2cf27a5f5c961d3c66c42327820046ee282d461bab07fcc5d3137c1ef070667c
3
+ metadata.gz: f191f90563fea038c7181e2bf9d13e1dc8caa0e816a364176e46b67c8d63f471
4
+ data.tar.gz: c89db082816046146cb60faa3747e046877394bfff776a3defe8063fb2d1c390
5
5
  SHA512:
6
- metadata.gz: 409b1168b103fcfb0addb14166550ea6558481e19cd614996952b0059f488a2244dfec992686039e8b84e573c24639a0722dcf1898988335b52896645b524af5
7
- data.tar.gz: 9ada51ba77c9101ca49a91a086b9204407ca526621e7a5621e797a16f1399e330aeb7ef9fdbb1ae2b8b5a1825f2bc06c6b82efe9367a961e97531d899ab6b6fe
6
+ metadata.gz: '0114099d09f9566741d84ed2b5e43427b62592bb8b2a6b90d25b9f68288d2a387f34899351d18a7b3e0c93ec72af9cae4aac2f1d38f5fe517e30ec850e33429e'
7
+ data.tar.gz: cdb1eac1808855f86c00c991b4c66ae3489035420ef0fdb8c88915712ace8faa5db02da074a78734e0c4235058ac1e2a62a0fc9cc0523e6c85aff4617b47ae39
data/.rubocop.yml CHANGED
@@ -91,6 +91,7 @@ Naming/FileName:
91
91
  - 'lib_lock/ac-library-rb.rb'
92
92
  Naming/AccessorMethodName:
93
93
  Exclude:
94
+ - 'lib/lazy_segtree.rb'
94
95
  - 'lib/modint.rb'
95
96
  Naming/MethodName:
96
97
  Exclude:
@@ -100,6 +101,9 @@ Naming/MethodName:
100
101
  - 'test/convolution_test.rb'
101
102
  Naming/MethodParameterName:
102
103
  Enabled: false
104
+ Naming/VariableNumber:
105
+ Exclude:
106
+ - 'test/max_flow_test.rb'
103
107
  Style/AndOr:
104
108
  Enabled: false
105
109
  Style/ArrayCoercion:
@@ -117,12 +121,19 @@ Style/BlockDelimiters:
117
121
  - 'test/z_algorithm_test.rb'
118
122
  Style/Documentation:
119
123
  Enabled: false
124
+ tyle/EmptyElse:
125
+ Exclude:
126
+ - 'test/segtree_test.rb'
120
127
  Style/GlobalVars:
121
128
  AutoCorrect: false
122
129
  Exclude:
123
130
  - 'lib/modint.rb'
131
+ - 'test/lazy_segtree_test.rb'
124
132
  Style/FrozenStringLiteralComment:
125
133
  Enabled: false
134
+ Style/InfiniteLoop:
135
+ Exclude:
136
+ - 'lib/floor_sum.rb'
126
137
  Style/InverseMethods:
127
138
  AutoCorrect: false
128
139
  Exclude:
@@ -176,6 +187,7 @@ Style/SelfAssignment:
176
187
  Style/Semicolon:
177
188
  Exclude:
178
189
  - 'lib/lazy_segtree.rb'
190
+ - 'test/lazy_segtree_test.rb'
179
191
  Style/SlicingWithRange:
180
192
  Enabled: false
181
193
  Style/SpecialGlobalVars:
data/README.ja.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # ac-library-rb
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/ac-library-rb.svg)](https://badge.fury.io/rb/ac-library-rb)
4
+
3
5
  ac-library-rbは、AtCoder Library (ACL)のRuby版です。
4
6
 
5
7
  ACLの詳細は、以下をご覧ください.
@@ -15,13 +17,88 @@ ACLの詳細は、以下をご覧ください.
15
17
 
16
18
  [ライブラリ目次: index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)
17
19
 
18
- `lib`ディレクトリにコードがあります。
20
+ 公式に、ac-library-rbの利用として、以下の方法を想定しています。
21
+ - 直接コピペして使う方法
22
+ - `lib`ディレクトリに、ac-library-rbのライブラリのコードがあります。
23
+ - `lib_lock`ディレクトリに、Gem用にモジュール化されたコードがあります。
24
+ (別途モジュール化するの、ちょっとトリッキーですが……)
25
+ - Gemとして使う方法(詳細は後述)
26
+
27
+ 他に、有志作成のバンドルツール[expander-rb](https://github.com/surpace/expander-rb)(by surpaceさん)を利用する方法もあります。
28
+
29
+ 目次は、[index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)をご覧ください。
30
+
31
+ ## Gemとなったac-library-rbを使う方法
32
+
33
+ コピペ以外にGemとなったac-library-rbを使う方法を紹介します。
34
+
35
+ ### gemのインストール方法
36
+
37
+ ac-library-rbに限った話ではないですが、一般的な2種類のgemのインストール方法を紹介します。
38
+
39
+ - Gemとして使う方法
40
+ - `gem`コマンドにより、`gem install ac-library-rb`
41
+ - gemのbundlerを用いる方法
42
+
43
+ #### gemコマンドによるインストール方法
44
+
45
+ Ruby本体に付属のgemコマンドを用い、そのまま`gem install ac-library-rb`を実行します。
46
+
47
+ #### gemのbundlerを用いたインストール方法
48
+
49
+ bundlerをインストールしてない場合は、`gem install bundler`というコマンドを打ちインストールします。
50
+
51
+ 次に、ac-library-rbを使いたいディレクトリ配下にGemfileを置きます。Gemfileという名称のファイルです。
52
+ このGemfileの中で、次のように書きます。
53
+ ```
54
+ gem "ac-library-rb"
55
+ ```
56
+ そして、`budnle install`というコマンドにより、Gemfileに書かれたac-library-rbをインストールします。
57
+
58
+ このとき、bundlerを通してRubyファイルを実行する必要があるため、`bundle exec`コマンドを用います。
59
+
60
+ `$ bundle exec ruby sample.rb`
61
+
62
+ ### (インストール後の)Rubyファイルでの書き方
63
+
64
+ #### 一括ロード
19
65
 
20
- 現状、この中から探してもらい、コピペして使って下さい。
66
+ Rubyファイル上で一括でac-library-rbのライブラリを使えるようにするには、下記のように書きます。
21
67
 
22
- 目次(および進捗情報)は、[index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)をご覧ください。
68
+ ```ruby
69
+ require "ac-library-rb/all"
23
70
 
24
- また、コピペ以外の方法として、バンドルツール[expander-rb](https://github.com/surpace/expander-rb)(by surpaceさん)を利用する方法もあります。
71
+ dsu = AcLibraryRb::DSU.new
72
+
73
+ include AcLibraryRb
74
+ dsu = DSU.new
75
+ ```
76
+
77
+ `include AcLibraryRb`とモジュールをインクルードすることで、
78
+ 何度も`AcLibraryRb`といわゆる名前空間を書く必要がなくなります。
79
+
80
+ また、`/all`なしで`require "ac-library-rb"`とした場合は、`include AcLibraryRb`も同時に実行されます。
81
+ ```ruby
82
+ require "ac-library-rb"
83
+
84
+ dsu = DSU.new
85
+ ```
86
+
87
+ #### 個別ロード
88
+
89
+ 特定のライブラリのみをインストールしたいときは下記のように`ac-library-rb/`のあとにライブラリ名を指定します。
90
+
91
+ ```ruby
92
+ require "ac-library-rb/dsu"
93
+ dsu = AcLibraryRb::DSU.new
94
+
95
+ require "ac-library-rb/priority_queue"
96
+ pq = AcLibraryRb::PriorityQueue.new
97
+ ```
98
+
99
+ 本gem名はハイフン区切りですが、ac-library-rb内のライブラリ名はアンダースコア区切りであるため、注意して下さい。
100
+ 一般的にRubyのライブラリ名はアンダースコアが推奨されていますが、
101
+ ACL本家のレポジトリ名がac-libraryとハイフン区切りで、それに合わせているため、レポジトリ名・gem名がハイフン区切りとなっています。
25
102
 
26
103
  ## Rubyバージョン
27
104
 
@@ -39,12 +116,33 @@ ACLの詳細は、以下をご覧ください.
39
116
 
40
117
  宣伝・バグ報告などしてもらえると嬉しいです。
41
118
 
119
+ ## ac-library-rbを開発したい方向けの情報
120
+
121
+ ### コーディングスタイル
122
+
123
+ Rubocop(Rubyのlintツール)の設定ファイル`.rubocop.yml`は、参考に置いています。
124
+ Rubocopのルールを守ることが必ずしもよくなかったり、ルールを守ることが難しかったりもするので、Rubocopの適用は必須ではないです。
125
+
126
+ 推奨スタイル
127
+ - インデントは、半角スペース2文字
128
+ - 行末の余計なスペースは削除
129
+
130
+ ### ディレクトリの説明
131
+
132
+ `lib`ディレクトリ内に各種のデータ構造などのライブラリがあります。
133
+ `lib_lock`は、Gem用にモジュール化させるため`lib`の内容をコピーする形でモジュール化させています。
134
+ `bin/lock_lib.rb`を実行することで、`lib`から`lib_lock`にモジュール化させる形でコピーします。
135
+ なお、`rake`コマンドでテストを実行させると、自動的に`require_relative "./bin/lock_lib.rb"`により、コピーが行われます。
136
+ このあたりはトリッキーで、予定は未定ですが、今後全てモジュール化される等に統一される可能性があります。
137
+
42
138
  ## その他の情報
43
139
 
44
140
  ### RubyのSlackのAtCoderチャンネル
45
141
 
46
142
  [ruby-jp](https://ruby-jp.github.io/) に"atcoder"というチャンネルがあります。
47
143
 
144
+ ここで、バグ報告などすると、競プロ詳しい人などが反応しやすいかもしれません。
145
+
48
146
  Slackに3000人、atcoderチャンネルに250人以上の登録者がいるので、お気軽に参加してください。
49
147
 
50
148
  ### 他言語のライブラリ
data/README.md CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  # ac-library-rb
9
9
 
10
+ [![Gem Version](https://badge.fury.io/rb/ac-library-rb.svg)](https://badge.fury.io/rb/ac-library-rb)
11
+
10
12
  ac-library-rb is a ruby port of AtCoder Library (ACL).
11
13
 
12
14
  See below for ACL.
@@ -25,6 +27,69 @@ Therefore, 2.7.1 is recommended and may not work with other versions.
25
27
 
26
28
  Please read [index.md](https://github.com/universato/ac-library-rb/blob/master/document_en/index.md).
27
29
 
30
+ ## How to use ac-library-rb as a Gem
31
+
32
+ We will show you how to use ac-library-rb as a gem.
33
+ ## How to install
34
+
35
+ This is not limited to ac-library-rb, but I will show you how to install the two common types of gem.
36
+
37
+ - By `gem` command, `gem install ac-library-rb`.
38
+ - By using the gem bundler's commands.
39
+
40
+ #### By gem command, `gem install ac-library-rb`
41
+
42
+ Execute `gem install ac-library-rb` by using the gem command included in Ruby itself.
43
+
44
+ #### How to use the gem bundler
45
+
46
+ If you have not installed bundler, type `gem install bundler` to install it.
47
+
48
+ Next, place Gemfile under the directory where you want to use ac-library-rb.
49
+
50
+ In this Gemfile, write:
51
+
52
+ ```ruby
53
+ gem "ac-library-rb".
54
+ ```
55
+
56
+ Then, install ac-library-rb by using the command `budnle install`.
57
+
58
+ At this point, we need to run the Ruby file through bundler, so we use the command `bundle exec`.
59
+
60
+ `$ bundle exec ruby sample.rb`.
61
+
62
+ ### How to write in Ruby files (after installation)
63
+
64
+ #### Bulk loading
65
+
66
+ To enable the ac-library-rb library to be used in bulk on Ruby files, write as follows.
67
+
68
+ ```ruby
69
+ require "ac-library-rb/all"
70
+
71
+ dsu = AcLibraryRb::DSU.new
72
+
73
+ include AcLibraryRb
74
+ dsu = DSU.new
75
+ ```
76
+
77
+ #### Individual loading
78
+
79
+ If you want to install only a specific library, specify the library name after `ac-library-rb/` as shown below.
80
+
81
+ ```ruby
82
+ require "ac-library-rb/dsu"
83
+ dsu = AcLibraryRb::DSU.new
84
+
85
+ require "ac-library-rb/priority_queue"
86
+ pq = AcLibraryRb::PriorityQueue.new
87
+ ```
88
+
89
+ Note that the gem names are separated by hyphens, but the library names in ac-library-rb are separated by underscores.
90
+ In general, underscores are recommended for Ruby library names.
91
+ However, the repository names in the original ACL are separated by a hyphen, ac-library, so ac-library-rb is also separated by a hyphen.
92
+
28
93
  ## Development
29
94
 
30
95
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -35,7 +100,14 @@ $ rake
35
100
  $ ruby test/fenwick_tree_test.rb
36
101
  ```
37
102
 
38
- # Other language Japanese version
103
+ # Other
104
+
105
+ ## Other languages's ac-library
106
+
107
+ - [Unofficial Portings of AtCoder Library](https://docs.google.com/spreadsheets/d/19jMAqUbv98grVkLV_Lt54x5B8ILoTcvBzG8EbSvf5gY/edit#gid=0) (by [not522-san](https://github.com/not522))
108
+
109
+
110
+ ## Other language Japanese version
39
111
 
40
112
  [README 日本語バージョン(ver. Japanese)](README.ja.md)
41
113
  - [ライブラリ目次: index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)
data/Rakefile CHANGED
@@ -2,7 +2,8 @@ require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- require_relative "./bin/lock_lib.rb"
5
+ require_relative "./bin/lock_lib.rb" # for copy
6
+ t.warning = false
6
7
  t.libs << "test"
7
8
  t.libs << "lib"
8
9
  t.test_files = FileList["test/**/*_test.rb"]
@@ -13,17 +13,18 @@ Gem::Specification.new do |spec|
13
13
  spec.description = gem_description
14
14
  spec.homepage = "https://github.com/universato/ac-library-rb"
15
15
  spec.license = "CC0"
16
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
17
17
 
18
18
  spec.metadata["homepage_uri"] = spec.homepage
19
19
  spec.metadata["source_code_uri"] = "https://github.com/universato/ac-library-rb"
20
20
 
21
21
  spec.add_development_dependency "minitest"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "simplecov"
23
24
 
24
25
  # Specify which files should be added to the gem when it is released.
25
26
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
27
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
27
28
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
29
  end
29
30
  spec.bindir = "exe"
data/bin/lock_lib.rb CHANGED
@@ -1,27 +1,33 @@
1
1
  require 'pathname'
2
2
 
3
3
  # copy libraries from `lib` to `lib_lock/ac-library` and add `module AcLibraryRb`
4
- lib_path = File.expand_path('../../lib/**', __FILE__)
5
- lock_dir = File.expand_path('../../lib_lock/ac-library-rb', __FILE__)
4
+ lib_path = File.expand_path('../lib/**', __dir__)
5
+ lock_dir = File.expand_path('../lib_lock/ac-library-rb', __dir__)
6
6
  Dir.glob(lib_path) do |file|
7
7
  next unless FileTest.file?(file)
8
8
 
9
9
  path = Pathname.new(lock_dir) + Pathname.new(file).basename
10
10
  File.open(path, "w") do |f|
11
+ library_code = File.readlines(file).map{ |line| line == "\n" ? "\n" : ' ' + line }
12
+
11
13
  f.puts "module AcLibraryRb"
12
- f.puts File.readlines(file).map{ |line| line == "\n" ? "\n" : ' ' + line }
14
+ f.puts library_code
13
15
  f.puts "end"
14
16
  end
15
17
  end
16
18
 
17
- # cope library from `lib/core_ext` to `lib_lock/ac-library-rb/core_ext`
18
- lib_path = File.expand_path('../../lib/core_ext/**', __FILE__)
19
- lock_dir = File.expand_path('../../lib_lock/ac-library-rb/core_ext', __FILE__)
19
+ # copy library from `lib/core_ext` to `lib_lock/ac-library-rb/core_ext`
20
+ ac_library_rb_classes = %w[ModInt FenwickTree PriorityQueue]
21
+ replaces = ac_library_rb_classes.to_h{ |cls| ["#{cls}.new", "AcLibraryRb::#{cls}.new"] }
22
+ pattern = Regexp.new(replaces.keys.join('|'))
23
+
24
+ lib_path = File.expand_path('../lib/core_ext/**', __dir__)
25
+ lock_dir = File.expand_path('../lib_lock/ac-library-rb/core_ext', __dir__)
20
26
  Dir.glob(lib_path) do |file|
21
27
  next unless FileTest.file?(file)
22
28
 
23
29
  path = Pathname.new(lock_dir) + Pathname.new(file).basename
24
30
  File.open(path, "w") do |f|
25
- f.puts File.readlines(file)
31
+ f.puts File.readlines(file).map{ |text| text.gsub(pattern, replaces) }
26
32
  end
27
33
  end
data/document_en/dsu.md CHANGED
@@ -27,7 +27,7 @@ p d.size(2) # => 2
27
27
 
28
28
  ## Class Method
29
29
 
30
- ### new(n = 0) -> DSU
30
+ ### new(n) -> DSU
31
31
 
32
32
  ```rb
33
33
  d = DSU.new(n)
@@ -41,7 +41,7 @@ It creates an undirected graph with `n` vertices and `0` edges.
41
41
 
42
42
  **alias**
43
43
 
44
- - `DSU`, `DisjointSetUnion`, `UnionFind`, `UnionFindTree`
44
+ - `DSU`, `UnionFind`
45
45
 
46
46
  ## Instance Methods
47
47
 
@@ -105,13 +105,29 @@ seg.range_apply(l, r, val)
105
105
 
106
106
  - `O(log n)`
107
107
 
108
- ### max_right.
108
+ ### max_right(l){ } -> Integer
109
109
 
110
- [TODO] Someone with some free time will write.
110
+ It applies binary search on the LazySegtree.
111
111
 
112
- ### min_left
112
+ **Constraints**
113
+
114
+ - `0 ≦ l ≦ n`
115
+
116
+ **Complexity**
117
+
118
+ - `O(log n)`
119
+
120
+ ### min_left(r){ } -> Integer
113
121
 
114
- [TODO] The code side is not implemented yet.
122
+ It applies binary search on the LazySegtree.
123
+
124
+ **Constraints**
125
+
126
+ - `0 ≦ r ≦ n`
127
+
128
+ **Complexity**
129
+
130
+ - `O(log n)`
115
131
 
116
132
  ## Verified
117
133
 
@@ -5,7 +5,7 @@ Library for solving [Maximum flow problem](https://en.wikipedia.org/wiki/Maximum
5
5
 
6
6
  ## Class Methods.
7
7
 
8
- ### new(n = 0) -> MaxFlow
8
+ ### new(n) -> MaxFlow
9
9
 
10
10
  ```ruby
11
11
  graph = Maxflow.new(10)
@@ -4,7 +4,7 @@ It solves [Minimum\-cost flow problem](https://en.wikipedia.org/wiki/Minimum-cos
4
4
 
5
5
  ## Class Methods.
6
6
 
7
- ### new(n = 0) -> MinCostFlow
7
+ ### new(n) -> MinCostFlow
8
8
 
9
9
  ```ruby
10
10
  graph = MinCostFlow.new(10)
@@ -4,7 +4,8 @@ Segment Tree
4
4
 
5
5
  ## Class Methods
6
6
 
7
- ### new(n, e, &op) -> Segtree
7
+ ### new(n, e){ |x, y| ... } -> Segtree
8
+ ### new(n, op, e) -> Segtree
8
9
 
9
10
  ```rb
10
11
  seg = Segtree.new(n, e) { |x, y| ... }
@@ -15,7 +16,9 @@ It creates an array `a` of length `n`. All the elements are initialized to `e`.
15
16
  - `block`: returns `op(x, y)`
16
17
  - `e`: identity element.
17
18
 
18
- ### new(ary, e, &op) -> Segtree
19
+
20
+ ### new(ary, e){ |x, y| ... } -> Segtree
21
+ ### new(ary, op, e) -> Segtree
19
22
 
20
23
  ```rb
21
24
  seg = Segtree.new(ary, e) { |x, y| ... }
@@ -106,17 +109,47 @@ seg.max_right(l, &f)
106
109
 
107
110
  It applies binary search on the segment tree.
108
111
 
112
+ It returns an index `r` that satisfies both of the following.
113
+
114
+ - `r = l` or `f(prod(l, r)) = true`
115
+ - `r = n` or `f(prod(l, r + 1)) = false`
116
+
117
+
118
+ **Constraints**
119
+
120
+ - `f(e) = true`
121
+ - `0 ≦ l ≦ n`
122
+
123
+ **Complexity**
124
+
125
+ - `O(log n)`
126
+
109
127
  ### min_left(r, &f) -> Integer
110
128
 
111
129
  ```ruby
112
130
  seg.min_left(r, &f)
113
131
  ```
114
132
 
115
- It applies binary search on the segment tree.
133
+ It applies binary search on the segment tree.
134
+ It returns an index l that satisfies both of the following.
135
+
136
+ - `l = r` or `f(prod(l, r)) = true`
137
+ - `l = 0` or `f(prod(l - 1, r)) = false`
138
+
139
+ **Constraints**
140
+
141
+ - `f(e) = true`
142
+ - `0 ≦ r ≦ n`
143
+
144
+ **Complexity**
145
+
146
+ - `O(log n)`
116
147
 
117
148
  ## Verified
118
149
 
119
150
  - [ALPC: J \- Segment Tree](https://atcoder.jp/contests/practice2/tasks/practice2_j)
151
+ - [AC Code(884ms) max_right](https://atcoder.jp/contests/practice2/submissions/23196480)
152
+ - [AC Code(914ms) min_left](https://atcoder.jp/contests/practice2/submissions/23197311)
120
153
  - [F \- Range Xor Query](https://atcoder.jp/contests/abc185/tasks/abc185_f)
121
154
  - [AC Code(1538ms)](https://atcoder.jp/contests/abc185/submissions/18746817): Segtree(xor)
122
155
  - [AC Code(821ms)](https://atcoder.jp/contests/abc185/submissions/18769200): FenwickTree(BIT) xor