#include using namespace std; using VI = vector; using VVI = vector; using PII = pair; using LL = long long; using VL = vector; using VVL = vector; using PLL = pair; using VS = vector; #define ALL(a) begin((a)),end((a)) #define RALL(a) (a).rbegin(), (a).rend() #define PB push_back #define EB emplace_back #define MP make_pair #define SZ(a) int((a).size()) #define SORT(c) sort(ALL((c))) #define RSORT(c) sort(RALL((c))) #define UNIQ(c) (c).erase(unique(ALL((c))), end((c))) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define FF first #define SS second #define DUMP(x) cout<<#x<<":"<<(x)< istream& operator>>(istream& is, pair& p){ return is >> p.FF >> p.SS; } template istream& operator>>(istream& is, vector& xs){ for(auto& x: xs) is >> x; return is; } template ostream& operator<<(ostream& os, const pair& p){ return os << p.FF << " " << p.SS; } template ostream& operator<<(ostream& os, const vector& xs){ for(unsigned int i=0;i void maxi(T& x, T y){ if(x < y) x = y; } template void mini(T& x, T y){ if(x > y) x = y; } const double EPS = 1e-10; const double PI = acos(-1.0); const LL MOD = 1e9+7; template struct ConvexHullTrick{ using Line = pair; deque lines; ConvexHullTrick(){ //lines.emplace_back(0, 0); } bool check(Line l1, Line l2, Line l3){ if(l1 < l3) swap(l1, l3); return (l3.SS - l2.SS) * (l2.FF - l1.FF) >= (l2.SS - l1.SS) * (l3.FF - l2.FF); } // y = ax + b void add(T a, T b){ Line l(a, b); while(lines.size() >= 2 && check(*(lines.end()-2), *(lines.end()-1), l)) lines.pop_back(); lines.emplace_back(l); } T f(Line l, T x){ return l.FF * x + l.SS; } T getmin(T x){ int lb = -1, ub = lines.size()-1; while(ub-lb > 1){ int m = (lb + ub) / 2; (f(lines[m], x) > f(lines[m+1], x)? lb: ub) = m; } return f(lines[ub], x); } }; int main(){ cin.tie(0); ios_base::sync_with_stdio(false); LL N, A, B, W; cin >> N >> A >> B >> W; VL ds(N+1); cin >> ds; VL dp(N+1, 1e18); ConvexHullTrick cht; LL ans = N*(N+1)/2*B - N*A; for(LL i=1;i<=N;++i){ dp[i] = i * (i+1) / 2 * B - i*A + ds[i]; if(i>1) mini(dp[i], ds[i] - (i-1)*A + (i*i-i)/2*B + cht.getmin(i)); cht.add(-B * i, dp[i] + i*A + i*(i+1)/2*B); mini(ans, dp[i] + (N-i-1)*(N-i)/2*B - (N-i-1)*A); } cout << ans+W << endl; return 0; }