#include "bits/stdc++.h"
using namespace std;
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
const int maxn = 5e5 + 5;
const int inf = 1e9;
int n, d[maxn], q;
int qt[maxn], ql[maxn], qr[maxn], ord[maxn];
int res[maxn];
int cdiv(int x, int y) {
return (x + y - 1) / y;
}
int calc(int x, int y, int u, int v) {
if (y < u || x > v) return 0;
return max(0, min(y, v) - max(x, u) + 1);
}
void solve() {
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> d[i];
}
for (int i = 2; i <= n; ++i) {
if (inf / cdiv(d[i], d[i - 1]) < d[i - 1]) {
for (int j = i; j <= n; ++j) {
d[j] = inf + 1;
}
break;
}
d[i] = cdiv(d[i], d[i - 1]) * d[i - 1];
}
vector<array<int, 3>> itv;
for (int i = 1; i <= n; ++i) {
if (d[i] > inf) {
break;
}
int cur = 0;
while (i + cur <= n and d[i] == d[i + cur]) ++cur;
itv.push_back({-(i + cur - 1), -i, d[i]});
i = i + cur - 1;
}
for (int i = 1; i <= q; ++i) {
cin >> qt[i] >> ql[i] >> qr[i];
ord[i] = i;
}
sort(ord + 1, ord + q + 1, [](const int &x, const int &y) -> bool {
return qt[x] < qt[y];
});
for (int p = 1; p <= q; ++p) {
int cur = 0, x = qt[ord[p]];
while (p + cur <= q and x == qt[ord[p + cur]]) ++cur;
int prv = x;
for (auto &[l, r, a]:itv) {
int c = (prv - r - 1) / a;
l += a * c, r += a * c;
prv = l;
}
for (int i = p; i < p + cur; ++i) {
res[ord[i]] = (ql[ord[i]] <= x and x <= qr[ord[i]]);
for (auto [l, r, a]:itv) {
res[ord[i]] += calc(l, r, ql[ord[i]], qr[ord[i]]);
}
// debug(x, ql[ord[i]], qr[ord[i]], res[ord[i]]);
}
// debug(x, itv);
p = p + cur - 1;
}
for (int i = 1; i <= q; ++i) {
cout << res[i] << '\n';
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |