要开ull。。被卡了好久
#include <bits/stdc++.h>
using namespace std;
struct node{
unsigned long long s,las,nxt,num,loc;
};
unsigned long long n,s[200005];
unsigned long long dp[200005];
node q[200005];
unsigned long long tot=0;
unsigned long long l[10005],r[10005];
unsigned long long now_cnt[10005];
unsigned long long g;
inline unsigned long long y(unsigned long long i){return dp[q[i].loc-1]+q[i].num*q[i].num*g;}
inline unsigned long long x(unsigned long long i){return q[i].num*g;}
int main(){//6
scanf("%llu",&n);
for(unsigned long long i=1;i<=n;i++) {
scanf("%llu",&s[i]);
if(l[s[i]]==0){
++tot;q[tot].las=-1;q[tot].nxt=0;q[tot].loc=0;
q[tot].s=s[i];q[tot].num=0;l[s[i]]=tot;r[s[i]]=tot;
}
}
for(unsigned long long i=1;i<=n;i++){
dp[i]=dp[i-1]+s[i];g=s[i];
if(l[s[i]]<r[s[i]]&&q[l[s[i]]].num==0) l[s[i]]=q[l[s[i]]].nxt;
while(l[s[i]]<r[s[i]] &&
(y(r[s[i]])-y(q[r[s[i]]].las))
<2*(now_cnt[s[i]]+2)*(x(r[s[i]])-x(q[r[s[i]]].las))){
r[s[i]]=q[r[s[i]]].las;
}
if(q[r[s[i]]].loc>0)
dp[i]=max(dp[i],dp[q[r[s[i]]].loc-1]+q[r[s[i]]].num*q[r[s[i]]].num*s[i]
+s[i]*(now_cnt[s[i]]+2)*(now_cnt[s[i]]+2)
-2*(now_cnt[s[i]]+2)*x(r[s[i]]));
while(l[s[i]]<r[s[i]] &&
(y(r[s[i]])-y(q[r[s[i]]].las))*(s[i]*(now_cnt[s[i]]+1)-x(r[s[i]]))
<(dp[i-1]+(now_cnt[s[i]]+1)*(now_cnt[s[i]]+1)*s[i]
-y(r[s[i]]))*(x(r[s[i]])-x(q[r[s[i]]].las)) ){
r[s[i]]=q[r[s[i]]].las;
}
now_cnt[s[i]]++;
++tot;
q[tot].las=r[s[i]];
q[r[s[i]]].nxt=tot;
q[tot].num=now_cnt[s[i]];
q[tot].loc=i;q[tot].s=s[i];
q[tot].nxt=0;r[s[i]]=tot;
}
printf("%llu\n",dp[n]);
return 0;
}