This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#ifdef NYAOWO
#include "grader.cpp"
#endif
#include "horses.h"
#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i, a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
#define int LL
using namespace std;
using LL = long long;
using pii = pair<int, int>;
const int MAXN = 500'000;
const int MOD = 1'000'000'007;
const int INF = 2'000'000'000;
#define L(id) ((id) * 2 + 1)
#define R(id) ((id) * 2 + 2)
struct SegTree {
int a[MAXN * 4 + 10];
int b[MAXN * 4 + 10];
void build() {
fill(a, a + sizeof(a) / sizeof(int), 1);
fill(b, b + sizeof(b) / sizeof(int), 1);
}
void upd(int id, int l, int r, int i, int x) {
if(l == r) {
a[id] = x;
b[id] = x;
return;
}
int m = (l + r) / 2;
if(i <= m) upd(L(id), l, m, i, x);
else upd(R(id), m + 1, r, i, x);
a[id] = min(INF, a[L(id)] * a[R(id)]);
b[id] = b[L(id)] * b[R(id)] % MOD;
}
int qry(int id, int l, int r, int L, int R) {
if(l >= L && r <= R) return a[id];
int m = (l + r) / 2;
int res = 1;
if(L <= m) res = min(INF, res * qry(L(id), l, m, L, R));
if(R > m) res = min(INF, res * qry(R(id), m + 1, r, L, R));
return res;
}
int qry_mod(int id, int l, int r, int L, int R) {
if(l >= L && r <= R) return b[id];
int m = (l + r) / 2;
int res = 1;
if(L <= m) res *= qry(L(id), l, m, L, R);
if(R > m) res *= qry(R(id), m + 1, r, L, R);
return res % MOD;
}
} seg;
int n;
int x[MAXN + 10];
int y[MAXN + 10];
bool smol(const int &a, const int &b) {
if(a == b) return false;
if(a > b) return !smol(b, a);
return y[a] < seg.qry(0, 0, n - 1, a + 1, b) * y[b];
}
struct Ayaya {
bool operator()(const int &a, const int &b) const {
return smol(a, b);
}
};
set<int, Ayaya> st;
int32_t eval(int pos) {
return (int32_t)(y[pos] * seg.qry_mod(0, 0, n - 1, 0, pos) % MOD);
}
int32_t solve() {
int pos = *prev(st.end());
// For(i, 0, n - 1) {
// cerr << eval(i);
// cerr << seg.qry_mod(0, 0, n - 1, 0, i);
// cerr << " \n"[i == n - 1];
// }
// for(auto &i:st) cerr << i << " ";
// cerr << "\n";
return eval(pos);
}
int32_t init(int32_t N, int32_t X[], int32_t Y[]) {
n = N;
seg.build();
For(i, 0, n - 1) {
x[i] = X[i];
seg.upd(0, 0, n - 1, i, x[i]);
}
For(i, 0, n - 1) {
y[i] = Y[i];
st.insert(i);
}
return solve();
}
int32_t updateX(int32_t pos, int32_t val) {
x[pos] = val;
seg.upd(0, 0, n - 1, pos, val);
return solve();
}
int32_t updateY(int32_t pos, int32_t val) {
st.erase(pos);
y[pos] = val;
st.insert(pos);
return solve();
}
# | 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... |