Advertisement
mrlolthe1st

Untitled

Sep 23rd, 2021
791
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. pair<int, pair<int, int>> solve(vi& a, int l, int r) {
  2.     if (l == r) {
  3.         return { (long long)a[l] * a[l], {l, r} };
  4.     }
  5.     int m = (l + r) >> 1;
  6.     auto a1 = max(solve(a, l, m), solve(a, m + 1, r));
  7.     int L = m, R = m + 1;
  8.     int sl = a[L], sr = a[R];
  9.     int ml = a[L], mr = a[R];
  10.     pair<int, pair<int, int>> ans = { min(ml, mr) * (sl + sr), {L, R} };
  11.     while (L > l || R < r) {
  12.         bool ok = 1;
  13.         while (L > l) {
  14.             --L;
  15.             if (min(ml, a[L]) >= mr) {
  16.                 ml = min(ml, a[L]);
  17.                 sl += a[L];
  18.                 ans = max(ans, { (long long)mr * (sl + sr) , {L, R} });
  19.                 ok = 0;
  20.             }
  21.             else {
  22.                 ++L;
  23.                 break;
  24.             }
  25.         }
  26.         if (R < r) {
  27.             ++R;
  28.             ok = 0;
  29.             mr = min(mr, a[R]);
  30.             sr += a[R];
  31.             ans = max(ans, { mr * (sl + sr) , {L, R} });
  32.         }
  33.         if (ok) break;
  34.     }
  35.     L = m, R = m + 1;
  36.     sl = a[L], sr = a[R];
  37.     ml = a[L], mr = a[R];
  38.     while (L > l || R < r) {
  39.         bool ok = 1;
  40.         while (R < r) {
  41.             ++R;
  42.             if (min(mr, a[R]) >= ml) {
  43.                 mr = min(mr, a[R]);
  44.                 sr += a[R];
  45.                 ans = max(ans, { ml * (sl + sr) , {L, R} });
  46.                 ok = 0;
  47.             }
  48.             else {
  49.                 --R;
  50.                 break;
  51.             }
  52.         }
  53.         if (L > l) {
  54.             --L;
  55.             ok = 0;
  56.             ml = min(ml, a[L]);
  57.             sl += a[L];
  58.             ans = max(ans, { ml * (sl + sr) , {L, R} });
  59.         }
  60.         if (ok) break;
  61.     }
  62.  
  63.     return max(ans, a1);
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement