#include<bits/stdc++.h>
#include "horses.h"
using namespace std;
#define pii pair<int,int>
#define int long long
int mod = 1e9+7;
const int STEPS = 30;
int exp(int a, int k){
if(k == 0) return 1;
int res = exp(a,k/2);
if(k % 2 == 0){
return (res*res)%mod;
}else{
return ((res*a%mod)*res)%mod;
}
}
int inv(int a){
return exp(a,mod-2);
}
struct SegmentTree{
int len = 1;
vector<int> S;
SegmentTree(){}
SegmentTree(int n){
while(len < n) len <<= 1;
S.resize(2*len, 1);
}
int query(int ql, int qr, int l= 0, int r = -2, int i = 1){
if(r == -2) r = len;
if(ql <= l && r <= qr) return S[i];
if(r <= ql || qr <= l) return 1;
int mid = (l+r)/2;
return (query(ql,qr,l,mid,i*2) * query(ql,qr,mid,r,i*2+1)) % mod;
}
void upd(int i, int v){
i += len;
S[i] = v;
for(i /= 2; i > 0; i /= 2){
S[i] = (S[i*2] * S[i*2+1])% mod;
}
}
};
int n;
vector<int> X;
vector<int> Y;
SegmentTree seg;
int res = 0;
int32_t init(int32_t N, int32_t mult[], int32_t cost[]) {
n = N;
X.resize(n);
Y.resize(n);
seg = SegmentTree(n);
for(int i = 0; i < n; i++){
X[i] = mult[i];
Y[i] = cost[i];
}
for(int i = 0;i < n; i++){
seg.upd(i, X[i]);
}
int cur = seg.query(0,n-STEPS);
for(int i = max(0LL,n-STEPS); i < n; i++){
cur *= X[i];
cur %= mod;
int c = 1;
bool valid = false;
for(int j = i+1; j < n; j++){
c *= X[j];
if(c > Y[i] || c *Y[j] > Y[i]){
valid = true;
break;
}
}
if(!valid){
res = (cur * Y[i])% mod;
return res;
}
}
res = (cur*Y[n-1])%mod;
return res;
}
int32_t updateX(int32_t pos, int32_t val) {
X[pos] = val;
seg.upd(pos,val);
int cur = seg.query(0,n-STEPS);
for(int i = max(0LL,n-STEPS); i < n; i++){
cur *= X[i];
cur %= mod;
int c = 1;
bool valid = false;
for(int j = i+1; j < n; j++){
c *= X[j];
if(c > Y[i] || c *Y[j] > Y[i]){
valid = true;
break;
}
}
if(!valid){
return (cur * Y[i])% mod;
}
}
return (cur*Y[n-1])%mod;
}
int32_t updateY(int32_t pos, int32_t val) {
Y[pos] = val;
int cur = seg.query(0,n-STEPS);
for(int i = max(0LL,n-STEPS); i < n; i++){
cur *= X[i];
cur %= mod;
int c = 1;
bool valid = false;
for(int j = i+1; j < n; j++){
c *= X[j];
if(c > Y[i] || c *Y[j] > Y[i]){
valid = true;
break;
}
}
if(!valid){
return (cur * Y[i])% mod;
}
}
return (cur*Y[n-1])%mod;
}
# | 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... |