#include <iostream>
using namespace std;
const int M = 1e9 + 7;
const int N = 1e5 + 10;
long long tree[N];
int a[N];
int n,q;
long long qpow(long long x,int y){
long long res = 1 % M;
while(y){
if((y & 1) == 1){
res = res * x % M;
}
y = y >> 1;
x = (long long)x * x % M;
}
return res;
}
void init(){
for(int i = 1;i <= n;i++){
tree[i] = 1;
}
}
int lowbit(int i){
return i & -i;
}
void update(int i,long long val){
while(i <= n){
tree[i] = tree[i] * val % M;
i += lowbit(i);
}
}
long long query(int i){
long long res = 1;
while(i > 0){
res = res * tree[i] % M;
i -= lowbit(i);
}
return res;
}
long long inv(int num){
return qpow(num,M - 2);
}
int range_query(int l,int r){
return query(r) * inv(query(l - 1)) % M;
}
int main(){
cin>>n>>q;
for(int i = 1;i <= n;i++){
cin>>a[i];
}
init();
for(int i = 1;i <= n;i++){
update(i,a[i]);
}
while(q--){
int l,r;
cin>>l>>r;
cout<<range_query(l,r)<<" ";
}
return 0;
}