P11318 [RMI 2021] 奇树 / Weirdtree

题目背景

译自 [9th Romanian Master of Informatics, RMI 2021](https://rmi.lbi.ro/rmi_2021/) D2T3。$\texttt{1s,0.5G}$。 提交时,需要在文件头添加 ```cpp void initialise(int N, int Q, int h[]); void cut(int l, int r, int k); void magic(int i, int x); long long int inspect(int l, int r); ``` 请使用 C++17 或更高版本提交。

题目描述

**这是一道(函数式)交互题。** 你需要维护一个长度为 $N$ 的非负整数序列 $h_1,h_2,\cdots,h_N$。有三种操作,一共 $Q$ 次: - 操作 1(砍树)。给定 $l,r,k$。执行 $k$ 次以下操作: - 若区间 $[l,r]$ 的最大值为 $0$,无事发生; - 否则,将最大值减去 $1$(如果存在多个,取下标最小的一个)。 形式化地: - 若 $\displaystyle \max_{i\in [l,r]} \{h_i\}=0$,无事发生。 - 否则,记 $\displaystyle x=\min\argmax_{i\in [l,r]}\{h_i\}$(换句话说,满足 $x\in [l,r],h_x=\max_{i\in [l,r]}\{h_i\}$ 的最小的 $x$)。令 $h_x\gets h_x-1$。 - 操作 2(施法)。给定 $x,v$,令 $h_x\gets v$。 - 操作 3(查询)。给定 $l,r$,求 $\displaystyle \sum_{i\in [l,r]} h_i$。 ### 实现细节 你不需要,也不应该实现 `main` 函数。你应当实现以下函数: ```cpp void initialise(int N, int Q, int h[]); void cut(int l, int r, int k); void magic(int i, int x); long long int inspect(int l, int r); ``` - `initialise` 函数: - 将在最开始被调用恰好一次。 - `N`:数组长度。 - `Q`:询问次数。 - `h[]`:长度为 $(N+1)$ 的数组,`h[i]`($1\le i\le N$)表示数列中的第 $i$ 个数。 - `cut` 函数: - 见操作 1。 - `magic` 函数: - 见操作 2。 - `inspect` 函数: - 见操作 3。 - 返回一个整数表示答案。 你可以自由使用全局变量,STL 库等。 为了方便选手本地测试,我们在附件中提供了 $\texttt{grader.cpp}$。下面的输入输出格式均表示 sample grader 的输入输出格式。

输入格式

第一行,两个正整数 $N,Q$; 第二行,$N$ 个整数 $h_1,\cdots,h_N$; 接下来 $Q$ 行,每行若干个整数:第一个整数表示操作类型,接下来若干个数表示参数。

输出格式

对于每个操作 3,输出一行表示答案。

说明/提示

对于 $100\%$ 的数据,保证: - $1\le N, Q\le 3\times 10^5$; - $1\le i\le N$; - $1\le l\le r\le N$; - $0\le x,k,h_i\le 10^9$。 | 子任务编号 | $N,Q\le $ | 特殊性质 |得分 | | :--: | :--: | :--: | :--: | | $ 1 $ | $ 10^3 $ | A | $5$ | | $ 2 $ | $ 8\times 10^4 $ | A | $8$ | | $ 3 $ | $ 10^3 $ | B | $8$ | | $ 4 $ | $ 3\times 10^5 $ | B | $19$ | | $ 5 $ | $ 3\times 10^5 $ | C | $10$ | | $ 6 $ | $ 8\times 10^4 $ | | $21$ | | $ 7 $ | $ 3\times 10^5 $ | | $29$ | - 特殊性质 A:$k=1$。 - 特殊性质 B:没有操作 2。 - 特殊性质 C:$l=1,r=N$(这对操作 $1,3$ 都有效)。