首先将排列和整个序列以及询问都反过来,问题变成给定一个位置$x$,问它经过若干轮置换后会到达哪个位置. 每次置换之后窗口都会往右滑动一个,因此其实真实置换是$p[i]-1$. 对于每个询问,求出轮数,倍增找到最终位置,注意当中途走到$0$时,说明离开了窗口,应及时终止. 时间复杂度$O((m+q)\log n)$. #include<cstdio> const int N=100010,M=30; int n,m,q,i,j,x,r,k,a[M][N]; inline void read(in…