이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
using ll=long long;
using ii=pair<int,int>;
const int mxN = 5e5+5;
const int mod = 1e9+7;
int N, X[mxN], Y[mxN];
struct node {
int s, e, m;
int px, idx;
long double v, lz;
node *l, *r;
node(int s, int e): s(s), e(e), m((s+e)/2), px(0), idx(s), v(0), lz(0) {
if (s != e) {
l = new node(s,m);
r = new node(m+1,e);
}
}
long double val() {
if (lz != 0) {
v += lz;
if (s != e) {
l->lz += lz;
r->lz += lz;
}
lz = 0;
}
return v;
}
void recalc() {
if (l->val() > r->val()) v = l->val(), idx = l->idx;
else v = r->val(), idx = r->idx;
}
void ux(int i, int x) {
if (s == e) { px = x; return; }
if (i <= m) l->ux(i,x);
else r->ux(i,x);
px = 1LL * l->px * r->px % mod;
}
void av(int i, double x) {
if (s == e) { v += x; return; }
else if (i <= m) l->av(i,x);
else r->av(i,x);
val();
recalc();
}
void av(int i, int j, double x) {
if (s == i && e == j) { lz += x; return; }
if (j <= m) l->av(i,j,x);
else if (i > m) r->av(i,j,x);
else l->av(i,m,x), r->av(m+1,j,x);
val();
recalc();
}
int qx(int i, int j) {
if (s == i && e == j) return px;
if (j <= m) return l->qx(i,j);
if (i > m) return r->qx(i,j);
return 1LL * l->qx(i,m) * r->qx(m+1,j) % mod;
}
void dbg() {
if (s == e) {
cout << s << " :: " << px _ idx _ v _ lz << endl;
} else l->dbg(), r->dbg();
}
} *root;
int calc() { return 1LL * root->qx(0,root->idx) * Y[root->idx] % mod; }
int init(int _N, int _X[], int _Y[]) {
N = _N;
root = new node(0,N-1);
FOR(i,0,N-1) {
X[i] = _X[i], Y[i] = _Y[i];
root->ux(i,X[i]);
root->av(i,N-1,log10(X[i]));
root->av(i,log10(Y[i]));
}
return calc();
}
int updateX(int pos, int val) {
root->av(pos,N-1,-log10(X[pos]));
X[pos] = val;
root->ux(pos,val);
root->av(pos,N-1,log10(val));
return calc();
}
int updateY(int pos, int val) {
root->av(pos,-log10(Y[pos]));
Y[pos] = val;
root->av(pos,log10(val));
return calc();
}
컴파일 시 표준 에러 (stderr) 메시지
horses.cpp: In constructor 'node::node(int, int)':
horses.cpp:25:23: warning: declaration of 'e' shadows a member of 'node' [-Wshadow]
node(int s, int e): s(s), e(e), m((s+e)/2), px(0), idx(s), v(0), lz(0) {
^
horses.cpp:20:12: note: shadowed declaration is here
int s, e, m;
^
horses.cpp:25:23: warning: declaration of 's' shadows a member of 'node' [-Wshadow]
node(int s, int e): s(s), e(e), m((s+e)/2), px(0), idx(s), v(0), lz(0) {
^
horses.cpp:20:9: note: shadowed declaration is here
int s, e, m;
^
horses.cpp: In member function 'void node::ux(int, int)':
horses.cpp:53:34: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
px = 1LL * l->px * r->px % mod;
~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In member function 'int node::qx(int, int)':
horses.cpp:77:48: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
return 1LL * l->qx(i,m) * r->qx(m+1,j) % mod;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int calc()':
horses.cpp:87:64: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
int calc() { return 1LL * root->qx(0,root->idx) * Y[root->idx] % mod; }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
# | 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... |