这个其实是我在做cc的时候不会做lca告诉我的
猫锟写的够好了,我就不说了
下面是CC那个题的代码:
const int N=1048587;
int Log[N],n,p,M;
int a[N],B[N];
int pool[N*41],*f[N],fm[N*2],*cur;
inline void build(int o,int l,int r){
if(l==r) return;
int m=l+r>>1;
build(o<<1,l,m),build(o<<1|1,m+1,r);
fm[o]=m,f[o]=cur+m-l+1,cur+=r-l+1;
f[o][0]=1;rep(i,1,r-m)f[o][i]=1LL*f[o][i-1]*a[m+i]%p;
f[o][0]=a[m];per(i,l-m,-1)f[o][i]=1LL*f[o][i+1]*a[m+i]%p;
}
inline int solve(int l,int r){
int L=l+M,R=r+M,t=(L>>Log[L^R]),m=fm[t];
return 1LL*f[t][l-m]*f[t][r-m]%p;
}
int main(){
#ifdef flukehn
freopen("test.txt","r",stdin);
#endif
rep(i,1,N-5)Log[i]=Log[i>>1]+1;
int T=rd();
while(T--){
n=rd(),p=rd();
cur=pool;
int q=rd(),x=0,l,r;
rep(i,0,n-1)a[i]=rd()%p;
M=1;while(M<n)M<<=1;
build(1,0,M-1);
rep(i,0,q/64+1)B[i]=rd();
rep(i,0,q-1){
if(i%64==0)l=(B[i/64]+x)%n,r=(B[i/64+1]+x)%n;
else (l+=x)%=n,(r+=x)%=n;
if(l>r)swap(l,r);
if(l==r) x=a[l];
else x=solve(l,r);
(++x)%=p;
}
printf("%d
",x);
}
}