Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- using namespace __gnu_pbds;
- #define N 1000001
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const ll INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;
- ll n, pr[N], sf[N], m[N], mx, a[N];
- ll s[N];
- struct SegTree {
- ll t[4 * N], start;
- void build (ll n, ll v) {
- start = 1;
- while (start < n) start <<= 1;
- fill (t, t + 2 * start, v);
- }
- void update (ll x, ll d) {
- x += start;
- t[x] = d;
- x >>= 1;
- while (x) {
- t[x] = max (t[x], d);
- x >>= 1;
- }
- }
- ll get (ll l, ll r) {
- if (r < l) return -1e9;
- l += start;
- r += start + 1;
- ll mx = -1e9;
- while (l < r) {
- if (l & 1) mx = max (mx, t[l++]);
- if (r & 1) mx = max (mx, t[--r]);
- l >>= 1, r >>= 1;
- }
- return mx;
- }
- } t;
- ll find (ll x) {
- return lower_bound (s, s + n, x) - s;
- }
- int main () {
- ios::sync_with_stdio (0);
- cin.tie (0);
- cin >> n;
- for (ll i = 0; i < n; i++) {
- cin >> m[i];
- s[i] = m[i];
- }
- sort (s, s + n);
- t.build (n, -1e9);
- for (ll i = 0; i < n; i++) {
- ll x = t.get (0, find (m[i]));
- if (x == -1e9) pr[i] = (i + 1) * m[i];
- else pr[i] = pr[x] + (i - x) * m[i];
- t.update (find (m[i]), i);
- }
- t.build (n, -1e9);
- for (ll i = n - 1; i >= 0; i--) {
- ll x = -t.get (0, find (m[i]));
- if (x == 1e9) pr[i] = (n - i) * m[i];
- else sf[i] = sf[x] + (x - i) * m[i];
- t.update (find (m[i]), -i);
- }
- for (ll i = 0; i < n; i++) {
- if (pr[i] + sf[i] - m[i] > pr[mx] + sf[mx] - m[mx]) mx = i;
- }
- a[mx] = m[mx];
- for (ll i = mx - 1; i >= 0; i--) {
- a[i] = min (m[i], a[i+1]);
- }
- for (ll i = mx + 1; i < n; i++) {
- a[i] = min (m[i], a[i-1]);
- }
- for (ll i = 0; i < n; i++) {
- cout << a[i] << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement