#include "horses.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll MOD = 1E9 + 7;
const int MAXN = 500050;
int n;
vector<int> x(MAXN);
vector<int> y(MAXN);
struct ST {
int n;
vector<ll> seg;
ST(int N) : n(N), seg(2*N) {}
void update(int pos, int val) {
pos += n;
seg[pos] = val;
pos >>= 1;
while (pos > 0) {
seg[pos] = (seg[pos*2] * seg[pos*2 + 1])%MOD;
pos >>= 1;
}
}
ll query(int l, int r) {
l += n;
r += n;
ll ret = 1;
while (l < r) {
if (l&1) { ret *= seg[l++]; ret %= MOD; }
if (r&1) { ret *= seg[--r]; ret %= MOD; }
l >>= 1;
r >>= 1;
}
return ret%MOD;
}
};
ST tree(MAXN);
int find_best(int start) {
int bestInd = start;
ll tot = 1;
for (int i = start+1; i < n; i++) {
tot *= x[i];
if (tot * y[i] >= y[bestInd]) {
bestInd = i;
tot = 1;
}
}
return bestInd;
}
int solve() {
int num = max(0, n-32);
int ind = find_best(num);
ll horseNum = tree.query(0, ind+1);
ll cashNum = y[ind];
// cout << horseNum << " " << cashNum << endl;
return (tree.query(0, ind+1) * y[ind])%MOD;
}
int init(int N, int X[], int Y[]) {
n = N;
for (int i = 0; i < N; i++) {
x[i] = X[i];
y[i] = Y[i];
tree.update(i, x[i]);
}
return solve();
}
int updateX(int pos, int val) {
x[pos] = val;
tree.update(pos, val);
return solve();
}
int updateY(int pos, int val) {
y[pos] = val;
return solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |