#include<bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;
struct node {
int l, r, sum;
} tree[4 * 100010];
const int mod = 1e9 + 7;
void slove() {
int n, q;
std::cin >> n >> q;
std::vector<int> a(n + 1);
for (int i = 1; i <= n; i++) std::cin >> a[i];
auto build = [&](auto&& build, int p, int l, int r)->void{
tree[p].l = l, tree[p].r = r;
if (l == r) {
tree[p].sum = a[l] % mod;
return ;
}
int mid = l + r >> 1;
build(build, p * 2, l, mid);
build(build, p * 2 + 1, mid + 1, r);
tree[p].sum = (tree[p * 2].sum* tree[p * 2 + 1].sum) % mod;
};
build(build, 1, 1, n);
auto qurey = [&](auto&& qurey, int p, int l, int r)->int{
if (tree[p].l >= l && tree[p].r <= r) return tree[p].sum;
int ans = 1LL;
int mid = tree[p].l + tree[p].r >> 1;
if (mid >= l) ans = (ans * qurey(qurey, p * 2, l, r)) % mod;
if (mid < r) ans = (ans * qurey(qurey, p * 2 + 1, l, r)) % mod;
return ans % mod;
};
while (q--) {
int l, r;
std::cin >> l >> r;
std::cout << qurey(qurey, 1, l, r) << " ";
}
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int T = 1;
//std::cin>>T;
while (T--) {
slove();
}
return 0;
}
流口水了,写个线段树仅供参考。



京公网安备 11010502036488号