P11236 [KTSC 2024 R1] 水果游戏
题目背景
**请勿用 C++14 (GCC 9) 提交**
你需要在程序开头加入如下代码:
```cpp
#include
void prepare_game(std::vector A);
int play_game(int l, int r);
void update_game(int p, int v);
```
题目描述
**题目译自 [2024년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사](https://www.ioikorea.kr/archives/ioitst/2024/) T2 「[과일 게임](https://assets.ioikorea.kr/ioitst/2024/1/fruitgame/fruitgame_statement.pdf)」**
水果游戏是一款将各种水果合并成更大水果的游戏。游戏板可以表示为一个序列 $X[0], X[1], \cdots, X[K-1]$,其中每个数字代表一种水果的编号,编号越大,水果越大。
玩家可以执行合并操作,将相邻且相同的两个水果合并成更大的水果。合并操作定义如下:
合并:在表示为 $X[0], X[1], \cdots, X[K-1]$ 的游戏板上,选择一个整数 $0 \leq i \leq K-2$,如果 $X[i]=X[i+1]$,则将游戏板变为 $X[0], \cdots, X[i-1], X[i]+1, X[i+2], \cdots, X[K-1]$。
玩家的目标是,在给定初始游戏板的情况下,通过 $0$ 次或多次合并操作,尽可能生成更大的水果。
例如,游戏板 $X=[2,1,1,3,2]$,因为 $X[1]=X[2]$,选择 $i=1$ 进行合并操作,游戏板变为 $X=[2,2,3,2]$。然后,因为 $X[0]=X[1]$,选择 $i=0$ 进行合并操作,游戏板变为 $X=[3,3,2]$。最后,因为 $X[0]=X[1]$,选择 $i=0$ 进行合并操作,游戏板变为 $X=[4,2]$。这样可以得到编号为 $4$ 的水果,这是可以得到的最大水果编号。
给定一个长度为 $N$ 的序列 $A$,序列中的元素可以在中途发生变化,并且这些变化是累积的。每当给定一个满足 $0 \leq l \leq r \leq N-1$ 的整数对 $(l, r)$ 时,你需要计算由 $A[l], \cdots, A[r]$ 表示的游戏板上可以得到的最大水果编号。序列的元素变化或给定的整数对的次数总共为 $Q$ 次。
你需要实现以下函数:
```cpp
void prepare_game(std::vector A);
```
- `A`:大小为 $N$ 的整数数组。
- 该函数只会被调用一次,并且在其他所有函数调用之前调用。
- 如果需要进行预处理或设置全局变量,可以在此函数中实现。
```cpp
int play_game(int l, int r);
```
- 该函数应返回由 $A[l], \cdots, A[r]$ 组成的游戏板上可以得到的最大水果编号。
- 该函数会被调用多次。
```cpp
void update_game(int p, int v);
```
- 该函数应将 $A[p]$ 的值更改为 $v$。
- `play_game` 函数或 `update_game` 函数的调用次数总共为 $Q$ 次。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 $1$ 行:$N$
- 第 $2$ 行:$A[0]\,A[1]\,\cdots\,A[N-1]$
- 第 $3$ 行:$Q$
- 第 $3+i$ $(1 \leq i \leq Q)$ 行:如果调用 `play_game` 函数,则为 `1 l r`;如果调用 `update_game` 函数,则为 `2 p v`
输出格式
示例评测程序输出:
- 第 $i$ 行:第 $i$ 次调用 `play_game` 函数返回的值
说明/提示
对于所有输入数据,满足:
- $1 \leq N, Q \leq 10^5$
- 对于所有 $i$ $(0 \leq i \leq N-1)$,$1 \leq A[i] \leq 10$
- 对于所有 `play_game` 调用,$0 \leq l \leq r \leq N-1$
- 对于所有 `update_game` 调用,$0 \leq p \leq N-1, 1 \leq v \leq 10$
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
| :-: | :-: | :-: |
| $1$ | $5$ | $N \leq 10,Q \leq 10$ |
| $2$ | $6$ | $N \leq 600,Q \leq 600$ |
| $3$ | $8$ | $N \leq 4000,Q \leq 4000$;对于所有 $i$ $(0 \leq i \leq N-1)$,$A[i] \leq 2$;对于所有 `update_game` 调用,$v \leq 2$ |
| $4$ | $15$ | $N \leq 4000,Q \leq 4000$ |
| $5$ | $12$ | 对于所有 $i$ $(0 \leq i \leq N-1)$,$A[i] \leq 2$;对于所有 `update_game` 调用,$v \leq 2$ |
| $6$ | $14$ | 不会调用 `update_game` |
| $7$ | $40$ | 无附加限制 |