给定长度为 \(n\) 的序列 \(a\) 和 \(q\) 次操作。每次操作为对 \(a\) 进行一次冒泡排序(\(a_i > a_{i + 1}\) 时交换)或者查询 \(a_l \sim a_r\) 之和。
对于一次冒泡排序,显然会把最大值挪到最后面。所以,当 \(a_1 \sim a_i\) 做完冒泡排序后,\(a’_i \leftarrow \max\limits_{j = 1} ^ i a_j\),再和 \(a_{i + 1}\) 进行比较,尝试交换。
因此得到一个结论:一次冒泡排序后 \(a’_1 \sim a_i\) 一定是原来 \(a_1 \sim a_{i + 1}\) 中最小的 \(i\) 个。
再尝试考虑两次冒泡排序。对于 \(i + 1\) 来说,\(a'_1 \sim a'_i\) 是 \(a_1 \sim a_{i + 1}\) 中小的 \(i\) 个;\(a'_1 \sim a'_{i + 1}\) 是 \(a_{1} \sim a_{i + 2}\) 中小的 \(i + 1\) 个。说明什么?说明 \(a'_{i + 1}\) 是 \(a_1 \sim a_{i + 1}\) 中最大的与 \(a_{i + 2}\) 之间小的那个。所以经过两次冒泡后 \(a''_{1} \sim a''_{i}\) 为 \(a_1 \sim a_{i + 2}\) 中小的 \(i\) 个。
这是我们就可以得(猜)到一个结论:经过 \(c\) 次冒泡排序后,\(a_1 \sim a_{i}\) 为 \(a_{1} \sim a_{i + c}\) 中最小的 \(i\) 个。
换个角度,因为一次冒泡一个元素知道只能向左移一次,所有考虑的范围也就是 \(a_1 \sim a_{i + c}\) 了。
做到这里,这个题就差不多了,\(a_1 \sim a_i\)用主席树搞一下 ,\(a_{l} \sim a_r\) 前缀和减一下即可。