#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll MOD = 1e9+7;
const ll MAXV = 1e9;
const int MN = 5e5+5;
int n;
vector<int> x, y;
class SegTree {
private:
vector<ll> seg;
ll query(int node, int start, int end, int l, int r) {
if (start > r || end < l) return 1LL;
else if (start >= l && end <= r) return seg[node];
else {
int mid = (start + end) / 2;
return query(node*2+1, start, mid, l, r) * query(node*2+2, mid+1, end, l, r) % MOD;
}
}
void update(int node, int start, int end, int idx, int v) {
if (start == end) {
seg[node] = v;
}
else {
int mid = (start + end) / 2;
if (idx <= mid) update(node*2+1, start, mid, idx, v);
else update(node*2+2, mid+1, end, idx, v);
seg[node] = seg[node*2+1] * seg[node*2+2] % MOD;
}
}
public:
void init(int nn) {
seg.resize((nn + 1) * 8);
}
void upd(int idx, int v) {
update(0, 0, n-1, idx, v);
}
ll query(int l, int r) {
if (l > r) return 0;
return query(0, 0, n-1, l, r);
}
};
SegTree seg;
int get_ans() {
ll dp = y[n-1];
int idx = n-1;
for (int i = n-2; i >= max(0, n - 32); i--) {
ll dp2 = max((ll)y[i], (ll)x[i + 1] * dp);
if (dp2 > MAXV) break;
dp = dp2;
idx = i;
}
ll b4 = seg.query(0, idx);
return (b4 * dp) % MOD;
}
int init(int N, int X[], int Y[]) {
n = N;
seg.init(n);
for (int i = 0; i < n; i++) {
x.push_back(X[i]);
y.push_back(Y[i]);
seg.upd(i, X[i]);
}
return get_ans();
}
int updateX(int pos, int val) {
x[pos] = val;
seg.upd(pos, x[pos]);
return get_ans();
}
int updateY(int pos, int val) {
y[pos] = val;
return get_ans();
}
# | 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... |