题面
每走一步相当于进行一次置换,我们可以用一棵线段树来维护一个序列走完一段区间之后会变成什么.询问的时候先算出走了多少圈整,用快速幂求解,再把余数走掉.修改的时候直接在线段树上修改即可.
Code
一开始合并两个区间写的是这样
inline void add(data& res,data& a,data& b)
{
LL i;
fo(i,1,n) res.a[i]=b.a[a.a[i]];
}
然后调了两天之后
inline void add(data& res,data& a,data& b)
{
LL i;
fo(i,1,n) tempa.a[i]=a.a[i],tempb.a[i]=b.a[i];
fo(i,1,n) res.a[i]=tempb.a[tempa.a[i]];
}