#include <bits/stdc++.h>
using namespace std;
const long long MaxN = 1e6 + 10;
const long long md = 1e9 + 7;
const long long Inf = 1e18;
struct el {
  long long a, b;
  long long f(long long x) { return a * x + b; }
  double X(el& t) { return 1. * (t.b - b) / (a - t.a); }
};
vector<el> Opt;
vector<long long> Xt;
void add(el t) {
  while ((Opt).size()) {
    long long x = Opt.back().X(t);
    if (x >= Xt.back()) {
      Xt.pop_back();
      Opt.pop_back();
    } else
      break;
  }
  if ((Opt).size())
    Xt.push_back(Opt.back().X(t));
  else
    Xt.push_back(Inf);
  Opt.push_back(t);
}
long long get(long long x) {
  long long Id = -1;
  long long l = 0;
  long long r = (Opt).size() - 1;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (x < Xt[mid]) {
      Id = mid;
      l = mid + 1;
    } else
      r = mid - 1;
  }
  return Opt[Id].b + x * Opt[Id].a;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cerr.tie(0);
  long long N;
  cin >> N;
  vector<long long> Mt(N);
  long long Sum = 0;
  for (int i = 0; i < N; i++) {
    cin >> Mt[i];
    Sum += (i + 1) * Mt[i];
  }
  long long pref = 0;
  long long Ans = -Inf;
  for (int i = N - 1; i >= 0; i--) {
    el t = {(i + 1), -pref};
    add(t);
    Ans = max(Ans, Sum + pref - (i + 1) * Mt[i] + get(Mt[i]));
    pref -= Mt[i];
  }
  Opt.clear();
  Xt.clear();
  pref = 0;
  for (int i = 0; i < N; i++) {
    el t = {-(i + 1), -pref};
    add(t);
    Ans = max(Ans, Sum + pref - (i + 1) * Mt[i] + get(-Mt[i]));
    pref += Mt[i];
  }
  cout << Ans << '\n';
  return 0;
}
