set < pair <int, int>> tp, dw;
ll cross (int x, int y, int a, int b) {
return x *1ll* b - y *1ll* a;
}
boolintop (int x, int y) {
auto suff = tp.lower_bound ({x, -1e9});
if (suff == tp.end ()) returnfalse;
if (suff -> first == x) return y <= suff -> second;
if (suff == tp.begin ()) returnfalse;
auto prev = suff; prev --;
return cross (suff -> first - prev -> first, suff -> second - prev -> second, x - prev -> first, y - prev -> second) <=0ll;
}
boolindown (int x, int y) {
auto suff = dw.lower_bound ({x, -1e9});
if (suff == dw.end ()) returnfalse;
if (suff -> first == x) return y >= suff -> second;
if (suff == dw.begin ()) returnfalse;
auto prev = suff; prev --;
return cross (suff -> first - prev -> first, suff -> second - prev -> second, x - prev -> first, y - prev -> second) >=0ll;
}
booldel_top (set < pair <int, int>>:: iterator it) {
if (it == tp.begin ()) returnfalse;
auto jt = it, kt = it;
-- jt; ++ kt;
if (kt == tp.end ()) returnfalse;
if (cross (it -> first - jt -> first, it -> second - jt -> second, kt -> first - jt -> first, kt -> second - jt -> second) >=0)
return tp.erase (it), true;
returnfalse;
}
booldel_down (set < pair <int, int>>:: iterator it) {
if (it == dw.begin ()) returnfalse;
auto jt = it, kt = it;
-- jt; ++ kt;
if (kt == dw.end ()) returnfalse;
if (cross (it -> first - jt -> first, it -> second - jt -> second, kt -> first - jt -> first, kt -> second - jt -> second) <=0)
return dw.erase (it), true;
returnfalse;
}
voidins_top (int x, int y) {
if (intop (x, y)) return ;
auto it = tp.lower_bound ({x, -1e9});
while (it != tp.end () && it -> first == x) it = tp.erase (it);
tp.insert ({x, y});
it = tp.find ({x, y});
auto jt = it;
if (it != tp.begin ()) {
-- jt;
while (del_top (jt ++)) jt --;
}
if (++ jt != tp.end ()) while (del_top (jt --)) jt ++;
}
voidins_down (int x, int y) {
if (indown (x, y)) return ;
auto it = dw.lower_bound ({x, -1e9});
while (it != dw.end () && it -> first == x) it = dw.erase (it);
dw.insert ({x, y});
it = dw.find ({x, y});
auto jt = it;
if (it != dw.begin ()) {
-- jt;
while (del_down (jt ++)) jt --;
}
if (++ jt != dw.end ()) while (del_down (jt --)) jt ++;
}
ll cross (Point x, Point y, Point z) {
return Point (y.x - x.x, y.y - x.y) * Point (z.x - x.x, z.y - x.y);
}
voidAndrew (int& n, Point* p) {
sort (p +1, p + n +1, [&](constauto& x, constauto& y) { return x.x < y.x || (x.x == y.x && x.y < y.y); });
stk[tp =1] =1;
for (int i =2; i <= n; i ++) {
while (tp >1&& cross (p[ stk[tp -1] ], p[ stk[tp] ], p[i]) <=0) -- tp;
stk[++ tp] = i;
}
int now = tp;
for (int i = n -1; i; i --) {
while (tp > now && cross (p[ stk[tp -1] ], p[ stk[tp] ], p[i]) <=0) -- tp;
stk[++ tp] = i;
}
if (n >1) -- tp;
Point b[N];
for (int i =1; i <= n; i ++) b[i] = p[i];
n = tp;
for (int i =1; i <= n; i ++) p[i] = b[stk[i]];
p[n +1] = p[1];
}
voidReorder (int& n, Point* p) {
int pos =1;
for (int i =2; i <= n; i ++) if (p[i].y < p[pos].y || (p[i].y == p[pos].y && p[i].x < p[pos].x)) pos = i;
rotate (p +1, p + pos, p + n +1);
p[n +1] = p[1];
}
voidSolve (int& n, Point* p, int cons =0) {
for (int i =1; i <= n; i ++) {
ll x, y;
scanf ("%lld%lld", &x, &y); if (cons) x =-x, y =-y;
p[i] = Point (x, y);
}
Andrew (n, p);
}
voidMinkowski (int n, Point* A, int m, Point* B, Point* res, int& sz) {
Reorder (n, A);
Reorder (m, B);
vector <Point> dif1 (n +5, Point ()), dif2 (m +5, Point ());
for (int i =1; i <= n; i ++) dif1[i] = A[i +1] - A[i];
for (int i =1; i <= m; i ++) dif2[i] = B[i +1] - B[i];
res[sz =1] = A[1] + B[1];
int a =1, b =1;
while (a <= n && b <= m) {
++ sz;
if (dif1[a] * dif2[b] >=0) res[sz] = res[sz -1] + dif1[a ++];
else res[sz] = res[sz -1] + dif2[b ++];
}
while (a <= n) ++ sz, res[sz] = res[sz -1] + dif1[a ++];
while (b <= m) ++ sz, res[sz] = res[sz -1] + dif2[b ++];
}
intcheck (Point vec) {
if (vec * minks[2] >0|| vec * minks[sz] <0) return0;
if (vec * minks[2] ==0&& vec.size() > minks[2].size()) return0;
if (vec * minks[sz] ==0&& vec.size() > minks[sz].size()) return0;
int l =2, r = sz -1, ans =1;
while (l <= r) {
int mid = l + r >>1;
if (minks[mid] * vec >0) ans = mid, l = mid +1;
else r = mid -1;
}
return (minks[ans +1] - minks[ans]) * (vec - minks[ans]) >=0;
}
ll ans =0;
priority_queue <int> pq;
for (int i =1; i <= n; i ++) {
int a; scanf ("%d", &a);
a -= i;
if (!pq.empty () && pq.top () >= a) ans += pq.top () - a;
pq.push (a);
pq.push (a);
pq.pop ();
}
printf ("%lld\n", ans);