이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
using ll = long long;
const ll MOD = ((ll) 1e9) + 7;
ll n;
vector < ll > ma;
vector < ll > bit;
int sts = 1;
vector < ll > mst;
set < ll > cs;
ll
binpow (ll a, ll b)
{
ll ans = 1;
while (b)
{
if (b % 2) (ans *= a) %= MOD;
b /= 2;
if (b) (a *= a) %= MOD;
}
return ans;
}
ll
bitp (ll x)
{
ll ans = 1;
while (x >= 0)
{
(ans *= bit[x]) %= MOD;
x -= (x + 1) & -(x + 1);
}
return ans;
}
ll
bitr (ll l, ll r)
{
ll ans = bitp (r);
if (l) (ans *= binpow (bitp (l - 1), MOD - 2)) %= MOD;
return ans;
}
ll
stm (ll l, ll r)
{
l += sts, r += sts;
ll mx = -1;
while (l <= r)
{
if (l % 2 == 1) mx = max (mx, mst[l++]);
if (r % 2 == 0) mx = max (mx, mst[r--]);
l /= 2, r /= 2;
}
return mx;
}
int
calc ()
{
auto it = cs.end (), pit = prev (it);
ll vl = 0;
while (vl < MOD)
{
--it, --pit;
vl = max (vl, mst[sts + *it]);
vl *= ma[*it];
if (vl >= MOD) break;
if (*it && *pit + 1 <= *it - 1)
vl = max (vl, stm (*pit + 1, *it - 1));
if (!*pit) ++pit;
if (!*it) break;
}
vl %= MOD;
if (*it)
(vl *= bitp (*it - 1)) %= MOD;
return vl;
}
int init(int N, int x[], int y[]) {
n = N;
ma.resize (n);
bit.resize (n);
while (sts < n) sts *= 2;
mst.resize (sts * 2);
for (int i = 0; i < n; ++i)
{
if (x[i] > 1) cs.insert (i);
ma[i] = x[i];
mst[sts + i] = y[i];
bit[i] = x[i] * (i ? bitr (i - ((i + 1) & -(i + 1)) + 1, i - 1) : 1ll);
}
for (int i = sts - 1; i > 0; --i) mst[i] = max (mst[i * 2], mst[i * 2 + 1]);
cs.insert (0);
cs.insert (n - 1);
return calc ();
}
int updateX(int pos, int val) {
cs.erase (pos);
if (val > 1) cs.insert (pos);
ll dl = val * binpow (ma[pos], MOD - 2) % MOD;
ma[pos] = val;
for (int i = pos; i < n; i += (i + 1) & -(i + 1)) (bit[i] *= dl) %= MOD;
cs.insert (0);
cs.insert (n - 1);
return calc ();
}
int updateY(int pos, int val) {
int i = sts + pos;
mst[i] = val;
for (i /= 2; i > 0; i /= 2) mst[i] = max (mst[i * 2], mst[i * 2 + 1]);
return calc ();
}
컴파일 시 표준 에러 (stderr) 메시지
horses.cpp: In function 'int calc()':
horses.cpp:81:10: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
81 | return vl;
| ^~
# | 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... |