Advertisement
MetB

Untitled

Feb 23rd, 2020
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3.  
  4. using namespace __gnu_pbds;
  5.  
  6. #define N 1000001
  7.  
  8. using namespace std;
  9.  
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12.  
  13. const ll INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;
  14.  
  15. ll n, pr[N], sf[N], m[N], mx, a[N];
  16. ll s[N];
  17.  
  18. struct SegTree {
  19.     ll t[4 * N], start;
  20.  
  21.     void build (ll n, ll v) {
  22.         start = 1;
  23.         while (start < n) start <<= 1;
  24.         fill (t, t + 2 * start, v);
  25.     }
  26.  
  27.     void update (ll x, ll d) {
  28.         x += start;
  29.         t[x] = d;
  30.         x >>= 1;
  31.  
  32.         while (x) {
  33.             t[x] = max (t[x], d);
  34.             x >>= 1;
  35.         }
  36.     }
  37.  
  38.     ll get (ll l, ll r) {
  39.         if (r < l) return -1e9;
  40.         l += start;
  41.         r += start + 1;
  42.  
  43.         ll mx = -1e9;
  44.  
  45.         while (l < r) {
  46.             if (l & 1) mx = max (mx, t[l++]);
  47.             if (r & 1) mx = max (mx, t[--r]);
  48.             l >>= 1, r >>= 1;
  49.         }
  50.  
  51.         return mx;
  52.     }
  53. } t;
  54.  
  55. ll find (ll x) {
  56.     return lower_bound (s, s + n, x) - s;
  57. }
  58.  
  59. int main () {
  60.     ios::sync_with_stdio (0);
  61.     cin.tie (0);
  62.     cin >> n;
  63.  
  64.     for (ll i = 0; i < n; i++) {
  65.         cin >> m[i];
  66.         s[i] = m[i];
  67.     }
  68.  
  69.     sort (s, s + n);
  70.     t.build (n, -1e9);
  71.  
  72.     for (ll i = 0; i < n; i++) {
  73.         ll x = t.get (0, find (m[i]));
  74.         if (x == -1e9) pr[i] = (i + 1) * m[i];
  75.         else pr[i] = pr[x] + (i - x) * m[i];
  76.         t.update (find (m[i]), i);
  77.     }
  78.  
  79.     t.build (n, -1e9);
  80.  
  81.     for (ll i = n - 1; i >= 0; i--) {
  82.         ll x = -t.get (0, find (m[i]));
  83.         if (x == 1e9) pr[i] = (n - i) * m[i];
  84.         else sf[i] = sf[x] + (x - i) * m[i];
  85.         t.update (find (m[i]), -i);
  86.     }
  87.  
  88.     for (ll i = 0; i < n; i++) {
  89.         if (pr[i] + sf[i] - m[i] > pr[mx] + sf[mx] - m[mx]) mx = i;
  90.     }
  91.  
  92.     a[mx] = m[mx];
  93.  
  94.     for (ll i = mx - 1; i >= 0; i--) {
  95.         a[i] = min (m[i], a[i+1]);
  96.     }
  97.  
  98.     for (ll i = mx + 1; i < n; i++) {
  99.         a[i] = min (m[i], a[i-1]);
  100.     }
  101.  
  102.     for (ll i = 0; i < n; i++) {
  103.         cout << a[i] << ' ';
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement