This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
set<int> xge2;
const int MOD = 1e9 + 7;
const int MX = 5e5 + 5;
struct ST
{
int size;
vector<ll> mul, mx;
ST(int _size) : size(_size), mul(2 * _size, 1), mx(2 * _size) {}
ll qmx(int l, int r)
{
ll ret = 0;
for (l += size, r += size; l < r; l /= 2, r /= 2)
{
if (l & 1)
ret = max(ret, mx[l++]);
if (r & 1)
ret = max(ret, mx[--r]);
}
return ret;
}
ll qmul(int l, int r)
{
ll ret = 1;
for (l += size, r += size; l < r; l /= 2, r /= 2)
{
if (l & 1)
ret = (ret * mul[l++]) % MOD;
if (r & 1)
ret = (ret * mul[--r]) % MOD;
}
return ret;
}
void umx(int i, ll v)
{
mx[i += size] = v;
for (i /= 2; i; i /= 2)
mx[i] = max(mx[2 * i], mx[2 * i + 1]);
}
void umul(int i, ll v)
{
mul[i += size] = v;
for (i /= 2; i; i /= 2)
mul[i] = (mul[2 * i] * mul[2 * i + 1]) % MOD;
}
} st(2 * MX);
int n, x[MX], y[MX];
int ans()
{
ll s = 1;
int hi = n;
auto it = xge2.rbegin();
vector<ll> a, b, c;
while (it != xge2.rend())
{
int v = *it;
a.push_back(v);
b.push_back(s);
c.push_back(st.qmx(v, hi));
if (s > MOD)
break;
s *= x[v];
hi = v;
it++;
}
pair<ll, int> mx_ans = {-1, -1};
for (int i = 0; i < (int)a.size(); i++)
{
mx_ans = max(mx_ans, {s / b[i] * c[i], i});
}
ll ans = (st.qmul(0, a[mx_ans.second] + 1) * c[mx_ans.second]) % MOD;
// cerr << "ret = " << ans << '\n';
return ans;
}
int init(int N, int X[], int Y[])
{
n = N;
for (int i = 0; i < N; ++i)
{
if (X[i] >= 2)
xge2.insert(i);
st.umul(i, X[i]);
st.umx(i, Y[i]);
}
copy(X, X + N, x);
copy(Y, Y + N, y);
return ans();
}
int updateX(int pos, int val)
{
if (val == 1 && xge2.find(pos) != xge2.end())
xge2.erase(pos);
else
xge2.insert(pos);
st.umul(pos, x[pos] = val);
return ans();
}
int updateY(int pos, int val)
{
st.umx(pos, y[pos] = val);
return ans();
}
Compilation message (stderr)
horses.cpp: In function 'int ans()':
horses.cpp:78:40: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
78 | ll ans = (st.qmul(0, a[mx_ans.second] + 1) * c[mx_ans.second]) % MOD;
horses.cpp:80:9: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
80 | return 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... |