#include #define unlikely(x) __builtin_expect(!!(x), 0) struct char_reader { FILE *f; char *buf, *p1, *p2; int size; char_reader(FILE *fin, int bufsize = 1 << 16) { f = fin; size = bufsize; p1 = p2 = 0; buf = new char[size]; } ~char_reader() { delete[] buf; } inline int operator()() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, size, f), p1 == p2) ? EOF : *p1++; } }; struct char_writer { FILE *f; char *buf, *p, *end; int size; char_writer(FILE *fout, int bufsize = 1 << 16) { f = fout; size = bufsize; buf = new char[size]; p = buf; end = buf + bufsize; } ~char_writer() { fwrite(buf, p - buf, 1, f); delete[] buf; } inline char operator()(char ch) { if (unlikely(end == p)) { fwrite(buf, end - buf, 1, f); p = buf; } return *p++ = ch; } }; char_reader gch(stdin); char_writer wch(stdout); template inline int read(T &t) { bool f = false; int ch; while (ch = gch(), !((ch >= '0' && ch <= '9') || ch == '-')) { if (ch == EOF) return 0; } t = 0; if (ch == '-') f = true, ch = gch(); t = ch ^ 48; while (ch = gch(), ch >= '0' && ch <= '9') t = (t << 3) + (t << 1) + (ch ^ 48); if (f) t = -t; return 1; } inline int read(char &c) { c = 0; int ch; while (ch = gch(), (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')) { if (ch == EOF) return 0; } c = ch; return 1; } inline int read(char *s) { int ch; while (ch = gch(), (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')) { if (ch == EOF) return 0; } *s++ = ch; while (ch = gch(), !(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t') && ch != EOF) *s++ = ch; *s++ = 0; return 1; } inline int read(const char *s) { return read((char *)s); } inline int readline(char *s) { int ch; while (ch = gch(), (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')) { if (ch == EOF) return 0; } *s++ = ch; while (ch = gch(), !(ch == '\n' || ch == '\r') && ch != EOF) *s++ = ch; *s++ = 0; return 1; } inline int readline(const char *s) { return readline((char *)s); } template inline void write(T t) { int stk[20], cnt = 0; if (t == 0) { wch('0'); return; } if (t < 0) { wch('-'); t = -t; } while (t > 0) { stk[cnt++] = t % 10; t /= 10; } while (cnt) wch(stk[--cnt] + '0'); } inline void write(char t) { wch(t); } inline void write(char *s) { while (*s) wch(*s++); } inline void write(const char *s) { write((char *)s); } #if __cplusplus >= 201103L template inline int read(T &t, Args &...args) { return read(t) + read(args...); } template inline void write(T t, Args... args) { write(t); write(args...); } #else template inline int read(A_t &a, B_t &b) { return read(a) + read(b); } template inline int read(A_t &a, B_t &b, C_t &c) { return read(a) + read(b) + read(c); } template inline int read(A_t &a, B_t &b, C_t &c, D_t &d) { return read(a) + read(b) + read(c) + read(d); } template inline void write(A_t a, B_t b) { write(a); write(b); } template inline void write(A_t a, B_t b, C_t c) { write(a); write(b); write(c); } template inline void write(A_t a, B_t b, C_t c, D_t d) { write(a); write(b); write(c); write(d); } #endif #include using namespace std; typedef long long LL; const int kMaxN = 1000000 + 10; const int kMaxS = 1000 + 10; int n, tot[kMaxS]; LL s[kMaxN], c[kMaxN], f[kMaxN]; vector stk[kMaxS]; inline LL X(int i) { return c[i]; } inline LL Y(int i) { return f[i - 1] + s[i] * c[i] * c[i] - 2 * s[i] * c[i]; } inline double Slope(int i, int j) { return (Y(i) - Y(j)) / double(X(i) - X(j)); } inline LL Calc(int i, int j) { return f[j - 1] + s[i] * (c[i] - c[j] + 1) * (c[i] - c[j] + 1); } int main() { #ifdef local freopen("pro.in", "r", stdin); #endif read(n); for (int i = 1; i <= n; ++i) { read(s[i]); c[i] = ++tot[s[i]]; } for (int i = 1; i <= n; ++i) { int t = s[i]; while (stk[t].size() >= 2 && Slope(stk[t][stk[t].size() - 2], i) >= Slope(stk[t][stk[t].size() - 2], stk[t][stk[t].size() - 1])) stk[t].pop_back(); stk[t].push_back(i); while (stk[t].size() >= 2 && Calc(i, stk[t][stk[t].size() - 1]) <= Calc(i, stk[t][stk[t].size() - 2])) stk[t].pop_back(); f[i] = Calc(i, stk[t][stk[t].size() - 1]); } write(f[n], '\n'); return 0; }