#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
const int MOD = 1e9+7;
int n, t=1;
vector<int> x;
multiset<pii> s;
struct node{
int s, e, m, val;
node *l, *r;
node(int S, int E){
s = S, e = E, m = (s+e)/2;
val=0;
if (s!=e){
l = new node(s, m);
r = new node(m+1, e);
}
}
void up(int ind, int nv){
if (s==e)val=nv;
else{
if (ind<=m)l->up(ind, nv);
else r->up(ind, nv);
val = max(l->val, r->val);
}
}
int query(int left, int right){
if (s==left && e==right)return val;
if (right<=m)return l->query(left, right);
else if (left>m)return r->query(left, right);
else return max(l->query(left, m), r->query(m+1, right));
}
}*st;
int inv(int num){
int p=MOD, res=1, y=0;
while (num>1){
int q=num/p, t=p;
p=num%p, num=t, t=y, y=res-q*y, res=t;
}
if (res<0)res+=MOD;
return res;
}
int query(){
int res=1, c=t;
for (auto a:s){
int i=-a.fi, v=a.se;
res=max(res, st->query(i, n-1));
res*=v;
c=(c*inv(v))%MOD;
if (res>1e9)break;
}
res%=MOD;
return (c*res)%MOD;
}
signed init(signed N, signed X[], signed y[]){
n=N;
x.resize(n);
st = new node(0, n-1);
for (int i=0; i<n; ++i){
x[i]=X[i];
if (x[i]>1)s.insert(mp(-i, x[i]));
t=(t*x[i])%MOD;
st->up(i, y[i]);
}
s.insert(mp(0, 1));
return query();
}
signed updateX(signed pos, signed val){
if (x[pos]>1)s.erase(s.find(mp(-pos, x[pos])));
t=(((t*inv(x[pos]))%MOD)*val)%MOD;
x[pos]=val;
if (val>1)s.insert(mp(-pos, x[pos]));
return query();
}
signed updateY(signed pos, signed val) {
st->up(pos, val);
return query();
}
# | 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... |