#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream fin("biscuiti.in");
ofstream fout("biscuiti.out");
typedef long long int64;
const int MAX_N = 100100;
const int64 INF = 1 << 30;
int N;
int64 result;
int64 segTree[8 * MAX_N];
int64 needUpdate[8 * MAX_N];
void update(int nod, int lo, int hi, int a, int b, int val);
int query(int nod, int lo, int hi);
int delPos;
int main() {
fin >> N;
for (int i = 1; i <= N; ++i) {
int x;
fin >> x;
update(1, 1, N, i, i, x);
result -= x;
}
for (int t = 1; t <= N; ++t) {
result += query(1, 1, N);
update(1, 1, N, 1, delPos, t);
//cerr << endl << segTree[1] << endl;
}
fout << result;
}
void update(int nod, int lo, int hi, int a, int b, int val) {
if (lo >= a && hi <= b) {
segTree[nod] += val;
needUpdate[nod] += val;
} else {
int mid = lo + (hi - lo) / 2;
if (a <= mid) {
update(nod * 2, lo, mid, a, b, val);
}
if (b > mid) {
update(nod * 2 + 1, mid + 1, hi, a, b, val);
}
segTree[nod] = min(segTree[nod*2], segTree[nod*2+1]);
}
}
int query(int nod, int lo, int hi) {
//cerr << lo << ' ' << hi << endl;
segTree[nod*2] += needUpdate[nod];
segTree[nod*2+1] += needUpdate[nod];
needUpdate[nod*2] += needUpdate[nod];
needUpdate[nod*2+1] += needUpdate[nod];
needUpdate[nod] = 0;
int result;
if (lo == hi) {
//cerr << segTree[nod] << endl;
result = segTree[nod];
segTree[nod] = INF;
delPos = lo;
return result;
}
int mid = lo + (hi - lo) / 2;
if (segTree[nod*2] <= segTree[nod*2+1]) {
result = query(nod * 2, lo, mid);
} else {
result = query(nod * 2 + 1, mid + 1, hi);
}
segTree[nod] = min(segTree[nod*2], segTree[nod*2+1]);
return result;
}