小苯的蓄水池(hard)
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

小苯有一个大的蓄水场,其中有恰好 n 个蓄水池排成一排,编号分别为 1 到 n,其中第 i 个蓄水池中的水量为 a_i

起初每两个相邻蓄水池之间都有一个隔板,而现在小苯希望在蓄水场维护一些操作和查询,具体的:
\bullet\ 1\ \ l\ \ r 表示将第 l 个水池和第 r 个水池之间所有的挡板拿走。(保证:1 \leq l < r \leq n
\bullet\ 2\ \ i 表示查询第 i 个水池目前的水量。
(如果挡板被拿走,则原本挡板两侧水会混合在一起,最终对应的水量会变为平均值,具体可以看样例解释。)

请你帮他回答每次查询吧。
(注意:因本题输入输出数据量较大,请选手选择快速的输入输出方式。)

输入描述:

输入包含 m + 2 行。
第一行输入两个正整数 1 \leq n, m \leq 2 \times 10^5,分别表示蓄水场中水池的个数,以及操作的次数。
第二行 n 个整数 a_i\ (1 \leq a_i \leq 10^9),表示每个水池初始时的水量。
接下来 m 行,每行第一个整数 \ op (1 \leq op \leq 2) 表示操作。
\bullet 如果 op = 1,则表示取掉挡板操作,再输入两个正整数 l, r\ (1 \leq l < r \leq n)
\bullet 如果 op = 2,则表示查询操作,再输入一个正整数 i\ (1 \leq i \leq n)
(注意:已经拿走的挡板在以后的操作中都是“被拿走”的状态。)
(数据保证至少有一次查询操作。)

输出描述:

输出包含若干行,每行一个实数,表示对每个 op=2 的询问做出的回答。
(与正确答案的绝对误差不超过 10^{-4} 则视为正确。)
示例1

输入

复制
4 6
1 2 4 5
1 1 3
2 1
2 3
1 1 4
2 1
2 4

输出

复制
2.3333333333
2.3333333333
3.0000000000
3.0000000000

说明

打开 1 到 3 号之间所有的挡板,则 1 2 3 号水池中的水会混合,水量为他们的平均值:7/3=2.333...。
再打开 1 到 4 号之间所有的挡板,则 1 2 3 4 号水池中的水都会混合,水量为他们的平均值:12/4 = 3。