# ã¯ã©ã¹ SegTree
[ã¢ãã¤ã](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8E%E3%82%A4%E3%83%89) $(S,â
:SÃSâS,eâS)$ãã¤ã¾ã
- çµåå¾: $\forall a,b,câS, (aâ
b)â
c = aâ
(bâ
c)$
- åä½å
ã®åå¨: $\forall aâS, aâ
e = eâ
a = a$
ãæºããä»£æ°æ§é ã«å¯¾ã使ç¨ã§ãããã¼ã¿æ§é ã§ãã
é·ã $N$ ã® $S$ ã®é
åã«å¯¾ãã以ä¸ã®ã¯ã¨ãªã $O(\log N)$ ã§å¦çãããã¨ãåºæ¥ã¾ãã
- è¦ç´ ã® 1 ç¹å¤æ´
- åºéã®è¦ç´ ã®ç·ç©ã®åå¾
ã $O(\log N)$ ã§è¡ããã¨ãåºæ¥ã¾ãã
ã¾ãããã®ã©ã¤ãã©ãªã¯ãªã©ã¯ã«ã¨ã㦠`op` ã使ç¨ãã¾ããããããã宿°æéã§åããã®ã¨ä»®å®ããã¨ãã®è¨ç®éãè¨è¿°ãã¾ãããªã©ã¯ã«å
é¨ã®è¨ç®éã $O(f(n))$ ã§ããå ´åã¯ãã¹ã¦ã®è¨ç®éã $O(f(n))$åã¨ãªãã¾ãã
## ã³ã³ã¹ãã©ã¯ã¿
```java
public SegTree(int n, java.util.function.BinaryOperator op, S e)
```
é·ã $n$ ã®é
å $a_0, a_1, \dots, a_{n-1}$ãä½ãã¾ã. åæå¤ã¯ãã¹ã¦ $e$ ã§ã.
è¨ç®é: $O(n)$
```java
public SegTree(S[] dat, java.util.function.BinaryOperator op, S e)
```
é·ã $n$ ã®é
å $a_0, a_1, \dots, a_{n-1}$ ã `dat` ã«ããåæåãã¾ã.
è¨ç®é: $O(n)$
## ã¡ã½ãã
### set
```java
public void set(int p, S x)
```
`a[p]=x` ã¨ãã¾ãï¼
è¨ç®é: $O(\log n)$
å¶ç´: `0 <= p < n`
### get
```java
public S get(int p)
```
`a[p]` ãåå¾ãã¾ãï¼
è¨ç®é: $O(1)$
å¶ç´: `0 <= p < n`
### prod
```java
public S prod(int l, int r)
```
`op(a[l], ..., a[r - 1])` ããã¢ãã¤ãã®æ§è³ªãæºããã¦ããã¨ä»®å®ãã¦è¨ç®ãã¾ãã`l = r` ã®ã¨ãã¯åä½å
`e` ãè¿ãã¾ãã
è¨ç®é: $O(n)$
å¶ç´: `0 <= l <= r <= n`
### allProd
```java
public S allProd()
```
`op(a[0], ..., a[n - 1])` ããã¢ãã¤ãã®æ§è³ªãæºããã¦ããã¨ä»®å®ãã¦è¨ç®ãã¾ãã`n = 0` ã®ã¨ãã¯åä½å
`e` ãè¿ãã¾ãã
è¨ç®é: $O(1)$
### maxRight
```java
public int maxRight(int l, java.util.function.Predicate f)
```
`S` ã弿°ã«ã¨ã `boolean` ãè¿ã颿°ã渡ãã¦ä½¿ç¨ãã¾ãã
以ä¸ã®æ¡ä»¶ãä¸¡æ¹æºãã `r` ã (ããããä¸ã¤) è¿ãã¾ãã
- `r = l` ããã㯠`f(op(a[l], a[l + 1], ..., a[r - 1])) = true`
- `r = n` ããã㯠`f(op(a[l], a[l + 1], ..., a[r])) = false`
`f` ãå調ã ã¨ããã°ã`f(op(a[l], a[l + 1], ..., a[r - 1])) = true` ã¨ãªãæå¤§ã® `r`ãã¨è§£éãããã¨ãå¯è½ã§ãã
å¶ç´
- `f` ãåã弿°ã§å¼ãã æãè¿ãå¤ã¯çãã(=å¯ä½ç¨ã¯ãªã)
- __`f(e) = true`__
- `0 <= l <= n`
è¨ç®é
$O(\log n)$
### minLeft
```java
public int minLeft(int r, java.util.function.Predicate f)
```
`S` ã弿°ã«ã¨ã `boolean` ãè¿ã颿°ãªãã¸ã§ã¯ããæ¸¡ãã¦ä½¿ç¨ãã¾ãã
以ä¸ã®æ¡ä»¶ãä¸¡æ¹æºãã `l` ã (ããããä¸ã¤) è¿ãã¾ãã
- `l = r` ããã㯠`f(op(a[l], a[l + 1], ..., a[r - 1])) = true`
- `l = 0` ããã㯠`f(op(a[l - 1], a[l + 1], ..., a[r - 1])) = false`
fãå調ã ã¨ããã°ã`f(op(a[l], a[l + 1], ..., a[r - 1])) = true` ã¨ãªãæå°ã® `l`ãã¨è§£éãããã¨ãå¯è½ã§ãã
å¶ç´
- `f` ãåã弿°ã§å¼ãã æãè¿ãå¤ã¯çãã(=å¯ä½ç¨ã¯ãªã)
- `f(e) = true`
- `0 <= r <= n`
è¨ç®é
$O(\log n)$
## 使ç¨ä¾
[AtCoder Library Practice Contest J - Segment Tree](https://atcoder.jp/contests/practice2/submissions/16646450)