이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// In the name of Allah
#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
typedef long long int ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef complex<ld> cld;
#define all(x) (x).begin(),(x).end()
#define len(x) ((ll) (x).size())
#define F first
#define S second
#define pb push_back
#define sep ' '
#define endl '\n'
#define Mp make_pair
#define kill(x) cout << x << '\n', exit(0)
#define set_dec(x) cout << fixed << setprecision(x);
#define file_io(x,y) freopen(x, "r", stdin); freopen(y, "w", stdout);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
struct node {
ll mul, val, valx;
ll ans, ansx;
};
const int maxn = (1 << 19) + 4;
const int maxlg = 20;
const int mod = 1e9 + 7;
const ll oo = 1e9 + 7;
int n; pll A[maxn];
node t[2 * maxn], ca;
int R; ll valx;
node f(node a, node b) {
node res;
res.mul = a.mul * b.mul % mod;
res.val = min(oo, a.val * b.val);
res.ans = min(oo, max(a.ans, a.val * b.ans));
res.valx = a.valx * b.valx;
res.ansx = max(a.ansx, a.valx * b.ansx);
return res;
}
void build(int v, int tl, int tr) {
if (tr - tl == 1) {
t[v].mul = A[tl].F; t[v].val = A[tl].F; t[v].valx = A[tl].F;
t[v].ans = min(oo, A[tl].F * A[tl].S);
t[v].ansx = A[tl].F * A[tl].S;
return ;
}
int mid = (tl + tr) / 2;
build(2 * v + 1, tl, mid); build(2 * v + 2, mid, tr);
t[v] = f(t[2 * v + 1], t[2 * v + 2]);
}
void upd(int v, int tl, int tr, int i) {
if (i >= tr || i < tl) return ;
if (tr - tl == 1) {
t[v].mul = A[tl].F; t[v].val = A[tl].F; t[v].valx = A[tl].F;
t[v].ans = min(oo, A[tl].F * A[tl].S);
t[v].ansx = A[tl].F * A[tl].S;
return ;
}
int mid = (tl + tr) / 2;
upd(2 * v + 1, tl, mid, i); upd(2 * v + 2, mid, tr, i);
t[v] = f(t[2 * v + 1], t[2 * v + 2]);
}
pll get_ind(int v, int tl, int tr) {
node res = ca;
while (tr - tl > 1) {
int mid = (tl + tr) / 2;
node resx = f(t[2 * v + 2], res);
if (resx.ans < oo) {
res = resx;
v = 2 * v + 1; tr = mid;
}
else {
v = 2 * v + 2; tl = mid;
}
}
res = f(t[v], res);
return Mp(tl, res.ansx);
}
ll get_mul(int v, int tl, int tr, int l, int r) {
l = max(l, tl); r = min(r, tr);
if (l >= tr || r <= tl) return ca.mul;
if (l == tl && r == tr) return t[v].mul;
int mid = (tl + tr) / 2;
return get_mul(2 * v + 1, tl, mid, l, r) * get_mul(2 * v + 2, mid, tr, l, r) % mod;
}
ll get_ans(int ind) {
if (ind >= R) {
auto f = get_ind(0, 0, n);
R = f.F; valx = f.S;
}
return valx * get_mul(0, 0, n, 0, R) % mod;
}
int init(int N, int X[], int Y[]) {
n = N;
for (int i = 0; i < n; i++) A[i] = Mp(X[i], Y[i]);
ca.mul = 1; ca.val = 1; ca.valx = 1;
ca.ans = 1; ca.ansx = 1;
build(0, 0, n); R = -1;
return get_ans(n);
}
int updateX(int i, int val) {
A[i].F = val;
upd(0, 0, n, i);
return get_ans(i);
}
int updateY(int i, int val) {
A[i].S = val;
upd(0, 0, n, i);
return get_ans(i);
}
컴파일 시 표준 에러 (stderr) 메시지
horses.cpp: In function 'll get_ans(int)':
horses.cpp:15:17: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
15 | #define F first
| ^
horses.cpp:103:9: note: in expansion of macro 'F'
103 | R = f.F; valx = f.S;
| ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:114:16: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
114 | return get_ans(n);
| ~~~~~~~^~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:120:16: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
120 | return get_ans(i);
| ~~~~~~~^~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:126:16: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
126 | return get_ans(i);
| ~~~~~~~^~~
# | 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... |