Beispiel #1
0
int main(){
    init();
    int n,q; cin>>n>>q;
    for(int i=1;i<=n;++i)cin>>a[i];
    build(root=&pool[++__ptr],1,n);
    for(int z=0;z<50;++z){
        for(int i=1,D=1;D<n;++i,D<<=1){
            for(int j=1;j+D<=n;++j){
                st[z][i][j]=max(st[z][i-1][j],st[z][i-1][j+D]);
            }
        }
    }
    for(int z=0;z<50;++z){
        prepw[z][0]=1;
        for(int i=1;i<30;++i){
            prepw[z][i]=1ll*prepw[z][i-1]*pm[z]%mod;
        }
    }
    while(q--){
        int l,r; cin>>l>>r;
        query(root,1,n,l,r);
        int ans=1;
        int d=r-l+1,j=0;
        while(d)d>>=1,++j; --j;
        // cout<<"j: "<<j<<endl;
        for(int z=0;z<50;++z){
            if(l==r)ans=1ll*ans*prepw[z][st[z][0][l]]%mod;
            else ans=1ll*ans*prepw[z][max(st[z][j][l],st[z][j][r-(1<<j)+1])]%mod;
        }
        for(int pos=bp._Find_first();pos<5140;pos=bp._Find_next(pos)){
            ans=1ll*ans*pm[pos]%mod;
            bp[pos]=0;
        }
        cout<<ans<<'\n';
    }
}