#include<stdio.h>
#include<algorithm>
using namespace std;
struct dfsd{
long long val,cnt;
}red[100100];
long long N,R,nr[100100],sol,rasp,cr;
long long p[100100];
struct arbore{
long long v,val;
}arb[400400];
void cstr(int st,int dr,int poz){
if(st==dr){
p[st]=poz;
return;
}
int mij=(st+dr)/2;
cstr(st,mij,poz*2);
cstr(mij+1,dr,2*poz+1);
}
inline long long maxim(long long a,long long b){
return a>b?a:b;
}
void update(long long x,long long va,int poz){
poz=p[poz];
arb[poz].v=x;
arb[poz].val=va;
poz>>=1;
while(poz>=1){
if(arb[poz*2].v>arb[poz*2+1].v){
arb[poz].v=arb[poz*2].v;
arb[poz].val=arb[poz*2].val;
}
else{
arb[poz].v=arb[poz*2+1].v;
arb[poz].val=arb[poz*2+1].val;
}
poz>>=1;
}
}
void query(int st,int dr,int x,int y,int poz){
if(y<st || dr<x)
return;
if(st<=x && y<=dr){
if(arb[poz].v>sol){
sol=arb[poz].v;
cr=arb[poz].val;
}
return;
}
int mij=(x+y)/2;
query(st,dr,x,mij,poz*2);
query(st,dr,mij+1,y,poz*2+1);
}
int main(){
freopen("avioane.in","r",stdin);
freopen("avioane.out","w",stdout);
long long i,x,ax;
scanf("%lld",&N);
for(i=0;i<N;++i)
scanf("%lld",&nr[i]);
sort(nr,nr+N);
R=0;
for(i=0;i<N;++i){
if(nr[i]==red[R].val)
++red[R].cnt;
else{
red[++R].val=nr[i];
red[R].cnt=1;
}
}
cstr(1,R,1);
x=N;
for(i=1;i<=R;++i){
ax=x*red[i].val;
update(ax,red[i].val,i);
x-=red[i].cnt;
}
x=0;
for(i=R+1;i>0;--i){
x+=red[i].cnt;
ax=x*red[i].val;
sol=-1;
if(i>1){
query(1,i-1,1,R,1);
sol-=cr*x;
}
else
sol=0;
if(sol+ax>rasp)
rasp=sol+ax;
}
printf("%lld\n",rasp);
fclose(stdin);
fclose(stdout);
return 0;
}