维护不可差分不可重复贡献的信息
复杂度同st表
void build(int l,int r,int k){
if(l+1==r) return;
int mid=(l+r)>>1;
f[k][mid-1]=a[mid-1];
f[k][mid]=a[mid];
for(int i=mid-2;i>=l;i--) f[k][i]=(ll)f[k][i+1]*a[i]%mo;
for(int i=mid+1;i< r;i++) f[k][i]=(ll)f[k][i-1]*a[i]%mo;
build(l,mid,k+1);
build(mid,r,k+1);
}
int ask(int l,int r){
if(l==r) return a[l];
int k=20-highbit[l^r];
return (ll)f[k][l]*f[k][r]%mo;
}