想到 \(O(nq)\) 咋做这题已经做完九成了。

不能模拟过程,我们按照编号从小往大考虑,考虑到 \(i\) 时,如果其与上一个元素不同,那么直接放进去,否则,插入到一个队列里,当不同时放进去后检查队列里是否还有元素,有的话就把队头拿出来放进去。

仔细审视这个过程,不难发现就是划分为若干段,使得每段颜色与开头相同的数与其它数个数相同,然后按照大小交替插入进去。

不妨设 \(nxt_i\) 为 \(i\) 这一段划分完后下一段的起点,显然 \(nxt_i\) 可以快速预处理。

先不考虑修改咋做,查询的话我们先跳 \(nxt\) 跳到与 \(y\) 相同的一段,然后看看 \(y\) 前面有多少与段首相同颜色的即可。

一个关键结论是,交换两个数只会更改 \(O(1)\) 个 \(nxt\),因此暴力重构一下即可。