This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define form2(i, a, b) for (int i = (a); i < (b); ++i)
#define ford2(i, a, b) for (int i = (a-1); i >= (b); --i)
#define form(i, n) form2(i, 0, n)
#define ford(i, n) ford2(i, n, 0)
#define chmax(x, v) x = max(x, (v))
#define chmin(x, v) x = min(x, (v))
#define fi first
#define se second
const long long BIG = 1000000000000000000LL;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
void solve();
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
solve();
return 0;
}
const int borne = 500*1000 + 5;
int nbGens, nbReq;
int sn[borne];
int coeff[borne];
int getPos(int iPer, int tps)
{
if (iPer == nbGens) return -BIG;
if (iPer == -1) return BIG;
int wo = tps / coeff[iPer];
int pos = wo * coeff[iPer] - iPer - 1;
return pos;
}
void solve()
{
cin >> nbGens >> nbReq;
form(i, nbGens) cin >> sn[i];
coeff[0] = sn[0];
form2(i, 1, nbGens) {
int numer = sn[i];
int denom = coeff[i-1];
coeff[i] = (numer+denom-1) / denom;
coeff[i] *= coeff[i-1];
}
form(i, nbReq) {
int tps, gauche, droite;
cin >> tps >> gauche >> droite;
int lo = -1, ri = nbGens;
while (lo < ri) {
int mid = (lo+ri+6+1) / 2 - 3;
int pos = getPos(mid, tps);
if (pos < gauche) ri = mid-1;
else lo = mid;
}
int borneDr = lo;
lo = -1; ri = nbGens;
while (lo < ri) {
int mid = (lo+ri+6) / 2 - 3;
int pos = getPos(mid, tps);
if (pos > droite) lo = mid+1;
else ri = mid;
}
int borneGa = lo;
if (gauche <= tps && tps <= droite) ++borneDr;
cout << max(0LL, borneDr-borneGa+1) << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |