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'; } }