#include "shortcut.h"
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
#pragma GCC target("popcnt")
using namespace std;
 
using ll = long long;
using ull = unsigned long long;
using lld = long double;
using ii = pair<int,int>;
using pll = pair<ll, ll>;
 
using vi = vector<int>;
using vll = vector<ll>;
using vii = vector<ii>;
using vpll = vector<pll>;
using vlld = vector<lld>;
 
#define all(x) x.begin(),x.end()
#define lsb(x) x&(-x)
#define gcd(a,b) __gcd(a,b)
#define sz(x) (int)x.size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define fls cout.flush()
 
#define fore(i, l, r) for (auto i = l; i < r; i++)
#define fo(i, n) fore (i, 0, n)
#define forex(i, r, l) for (auto i = r-1; i >= l; i--)
#define ffo(i, n) forex (i, n, 0)
 
bool cmin(ll &a, ll b) { if (b < a) { a=b; return 1; } return 0; }
bool cmax(ll &a, ll b) { if (b > a) { a=b; return 1; } return 0; }
 
const ll INF = 1e18;
long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c) {
    vll pf(n, 0);
    fore (i, 1, n) pf[i] = pf[i-1] + l[i-1]; 
    // ll ans = INF;
    // fo (l, n) {
    //     fore (r, l+1, n) {
    //         ll mx = 0;
    //         fo (i, n) {
    //             fore (j, i+1, n) {
    //                 mx = max(mx, min(abs(pf[j] - pf[i]), abs(pf[l] - pf[i]) + c + abs(pf[r] - pf[j])) + d[i] + d[j]);
    //             }
    //         }
    //         ans = min(ans, mx);
    //     }
    // }
    ll lb = 1, rb = 4e12;
    while (lb <= rb) {
        ll m = (lb+rb)/2;
        vector<vll> c1(n+1, vll(n+1, INF)), c2(n+1, vll(n+1, INF)), c3(n+1, vll(n+1, INF)), c4(n+1, vll(n+1, INF));
        fo (i, n) {
            fore (j, i+1, n) {
                // este ya funciona
                if (pf[j]-pf[i] + d[i] + d[j] <= m) continue;
                /*
                abs(pf[l] - pf[i]) + c + abs(pf[r] - pf[j]) + d[i] + d[j] <= m
                abs(pf[l] - pf[i]) + abs(pf[r] - pf[j]) <= m - c - d[i] - d[j]
                caso 1: l<=i && r<=j
                - pf[l] - pf[r] <= m - c - d[i] - d[j] - pf[i] - pf[j]
                caso 2: l>i && r<=j
                + pf[l] - pf[r] <= m - c - d[i] - d[j] + pf[i] - pf[j]
                caso 3: l<=i && r>j
                - pf[l] + pf[r] <= m - c - d[i] - d[j] - pf[i] + pf[j]
                caso 2: l>i && r>j
                + pf[l] + pf[r] <= m - c - d[i] - d[j] + pf[i] + pf[j]
                */
                c1[i][j] = m - c - d[i] - d[j] - pf[i] - pf[j];
                c2[i][j] = m - c - d[i] - d[j] + pf[i] - pf[j];
                c3[i][j] = m - c - d[i] - d[j] - pf[i] + pf[j];
                c4[i][j] = m - c - d[i] - d[j] + pf[i] + pf[j];
            }
        }
        ffo (i, n) {
            ffo (j, n) {
                c1[i][j] = min({c1[i+1][j], c1[i][j+1], c1[i][j]});
            }
        }
        fo (i, n) {
            ffo (j, n) {
                c2[i][j] = min({(i>0 ? c2[i-1][j] : INF), c2[i][j+1], c2[i][j]});
            }
        }
        ffo (i, n) {
            fo (j, n) {
                c3[i][j] = min({c3[i+1][j], (j>0 ? c3[i][j-1] : INF), c3[i][j]});
            }
        }
        fo (i, n) {
            fo (j, n) {
                c4[i][j] = min({(i>0 ? c4[i-1][j] : INF), (j>0 ? c4[i][j-1] : INF), c4[i][j]});
            }
        }
        bool can = 0;
        fo (l, n) {
            fore (r, l+1, n) {
                bool f = 1;
                f &= (- pf[l] - pf[r] <= c1[l][r]); 
                if (l > 0) f &= (+ pf[l] - pf[r] <= c2[l-1][r]); 
                if (r > 0) f &= (- pf[l] + pf[r] <= c3[l][r-1]); 
                if (l > 0 && r > 0) f &= (+ pf[l] + pf[r] <= c4[l-1][r-1]); 
                can |= f;
                if (can) break;
            }
            if (can) break;
        }
        if (can) rb = m-1;
        else lb = m+1;
    }
    return lb;
}
Compilation message (stderr)
shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |