#include "horses.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
const int MAXV=1e9;
const int MOD=1e9+7;
int n;
int x[MAXN];
struct SegmentTree
{
int tree[4*MAXN];
void init()
{
fill(tree,tree+4*n,0);
}
void update(int node,int l,int r,int pos,int val)
{
if(l==r)
{
tree[node]=val;
return;
}
int mid=(l+r)/2;
if(pos<=mid) update(2*node,l,mid,pos,val);
if(mid<pos) update(2*node+1,mid+1,r,pos,val);
tree[node]=max(tree[2*node], tree[2*node+1]);
}
int query(int node,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr) return tree[node];
int ret=0;
int mid=(l+r)/2;
if(ql<=mid) ret=max(ret, query(2*node,l,mid,ql,qr));
if(mid<qr) ret=max(ret, query(2*node+1,mid+1,r,ql,qr));
return ret;
}
void update(int pos,int val)
{
update(1,1,n,pos,val);
}
int query(int l,int r)
{
return query(1,1,n,l,r);
}
};
SegmentTree tree;
long long prod=1;
set<int> big;
int fastPow(long long x,int pwr)
{
long long ret=1;
while(pwr)
{
if(pwr&1) ret=ret*x%MOD;
pwr/=2;
x=x*x%MOD;
}
return ret;
}
int inv(int x)
{
return fastPow(x,MOD-2);
}
int query()
{
vector<pair<int,int> > cur;
long long curProd=prod;
long long tmp=1;
int r=n;
for(auto it=big.rbegin(); it!=big.rend(); it++)
{
int ind=(*it);
if(tmp*x[ind]>MAXV)
{
cur.push_back({1,tree.query(ind,r)});
break;
}
curProd=curProd*inv(x[ind])%MOD;
tmp*=x[ind];
cur.push_back({x[ind], tree.query(ind,r)});
r=ind-1;
}
reverse(cur.begin(), cur.end());
long long ret=1;
long long pref=1;
for(auto p: cur)
{
pref*=p.first;
ret=max(ret, pref*p.second);
}
ret%=MOD;
return ret*curProd%MOD;
}
int init(int N, int X[], int Y[])
{
n=N;
for(int i=1;i<=n;i++) x[i]=X[i-1];
tree.init();
for(int i=1;i<=n;i++) tree.update(i,Y[i-1]);
big.insert(1);
for(int i=2;i<=n;i++)
{
if(x[i]>1) big.insert(i);
}
prod=1;
for(int i=1;i<=n;i++) prod=prod*x[i]%MOD;
return query();
}
int updateX(int pos, int val)
{
pos++;
prod=prod*inv(x[pos])%MOD;
prod=prod*val%MOD;
if(pos==1) x[pos]=val;
else
{
if(val>1) big.insert(pos);
else if(x[pos]>1) big.erase(pos);
x[pos]=val;
}
return query();
}
int updateY(int pos, int val)
{
pos++;
tree.update(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... |