#include<bits/stdc++.h>
using namespace std;
#define int ll
typedef long long ll;
#define mk make_pair
#define fi first
#define se second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
#define ReadIn(s) freopen(s,"r",stdin)
#define OutPut(s) freopen(s,"w",stdout)
namespace fastio{
#define FILE_SIZE 1<<21
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}using namespace fastio;
const int N=1e4+10;
const int M=1e5+10;
const int m998=998244353;
const int m107=1e9+7;
const int inf=0x3f3f3f3f3f3f3f3f;
const int eps=0;
template <typename T>
inline int comp (const T &x,const T &y) {
if(x-y>eps) return 1;
if(y-x>eps) return -1;
return 0;
}
template <typename T>
struct line {
T k,b;
line () :k(0),b(0) {;}
line (T _k,T _b) :k(_k),b(_b) {;}
T operator () (const T &x) {
return k*x+b;
}
};
template <typename T>
inline line<T> Max(const line<T> &a,const line<T> &b,const T &x) {
return a(x)>b(x)?a:b;
}
template <typename T>
struct Node {
int ls,rs;
line<T> seg;
Node () :ls(0),rs(0),seg(line<T>()) {;}
Node (int _ls,int _rs,line<T> s) : ls(_ls),rs(_rs),seg(s) {;}
};
int g[M],V;
int tot;
int rt[N];
inline int New() {return ++tot;}
template <typename T>
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define seg(x) tr[x].seg
#define mid ((l+r)>>1)
struct Seg_Tree {
Node <T> tr[M*10];
void pushdown (int &x,int l,int r,line<T> s) {
if(!x) return tr[x=New()]=Node<T>(0,0,s),void();
if(comp(seg(x)(g[mid]),s(g[mid]))==-1) swap(seg(x),s);
if(comp(seg(x)(g[l]),s(g[l]))==-1) pushdown(ls(x),l,mid,s);
if(comp(seg(x)(g[r]),s(g[r]))==-1) pushdown(rs(x),mid+1,r,s);
}
void update(int &x,int l,int r,int L,int R,line<T> s) {
if(l>R||r<L) return ;
if(L<=l&&r<=R) return pushdown(x,l,r,L,R,s);
if(!x) x=New();
update(ls(x),l,mid,L,R,s);
update(rs(x),mid+1,r,L,R,s);
}
T query(int x,int l,int r,int aim) {
if(!x) return 0;
if(l==r) return seg(x)(g[aim]);
if(mid>=aim) return max(query(ls(x),l,mid,aim),seg(x)(g[aim]));
return max(query(rs(x),mid+1,r,aim),seg(x)(g[aim]));
}
};
Seg_Tree<int> T[N];
int n;
int s[M],dp[M];
int cnt[M],la[M];
signed main() {
read(n);
for(int i=1;i<=n;i++) {
read(s[i]);
cnt[i]=cnt[la[s[i]]]+1;
la[s[i]]=i;
g[++V]=s[i]*(cnt[i]+1);
}
sort(g+1,g+V+1);
V=unique(g+1,g+V+1)-g-1;
for(int i=1;i<=n;i++) {
T[s[i]].pushdown(rt[s[i]],1,V,line<int>(-2*cnt[i-1],dp[i-1]+cnt[i-1]*cnt[i-1]));
int t=lower_bound(g+1,g+V+1,s[i]*(cnt[i]+1))-g;
dp[i]=T[s[i]].query(rt[s[i]],1,V,t)+s[i]*(cnt[i]+1)*(cnt[i]+1);
}
cout<<dp[n];
return 0;
}

编译器为 tmd-gcc 4.9.2