自己想出来了。
他这个 $p_1$ 和 $p_n$ 的限制本质上是因为一个排列和其颠倒过来的是不可区分的,因此我们只要最后判一下即可,之前完全不需要考虑这个条件。
首先他既然说 randomness 那我们就 random。
然后我们看到 $\mod 3$ 我们应该要向同余类的方向想。
然后我们如何获得同余类?这个是好做的,对于每个点,随机取一个点,query 一下,选到同余类的点的概率为 $\cfrac{1}{3}$,因此我们期望 $3n$ 次获得同余类。
然而我们并不知道同余类哪个是 $0,1,2$ 然而其实我们只要知道循环的方向即可。然后我们发现循环的方向都不需要知道,因为循环方向变了就是排列翻转了,我们随便指定一个方向。
然后我们发现我们已经可以比较大小了,如果 $x,y$ 不在一个同余类里,则可以比较但同余类内部无法比较。
我们相当于要做这个排序。而排序本质上是用子结构堆起来。(不管是什么排序)
然而我们发现如果在当前子结构中有两个相同同余类的点对其他所有的结果都相同我们根本没法区分。
但其实我们根本不用区分,我们把这些东西打包起来,要用的时候拿我们当前的值对这些东西依次问一遍。
然后我们感觉一下我们发现这个期望并不会增加多少的询问次数。因为一个很大的连续同同余类的段的出现概率指数下降。
然后我们其中一个想法是使用插入排序,每次二分大概位置,然后暴力扫描,使用平衡树即可,但实现难度有点高。
另一个想法是,我们使用归并排序。我们每次在归并的时候,如果遇到大包就把他们两两问一遍,这个明显容易的多。