#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define REP(i, n)    for(int (i) = 0;   (i) < (n); ++(i))
#define FOR(i, a, b) for(int (i) = (a); (i) < (b); ++(i))

int N;
vector<int> A;

void extend(vector<pair<int, int>> &v, int sz) {
    if (v.size() == 0) v.emplace_back(0, sz);
    else if (v.back().first == 0) v.back().second += sz;
    else v.emplace_back(0, sz);
}

void connect(vector<pair<int, int>> &v, pair<int, int> p) {
    if (v.size() == 0) v.emplace_back(p);
    else {
        if (v.back().first == p.first) v.back().second += p.second;
        else v.emplace_back(p);
    }
}

bool increment(int mid, vector<pair<int, int>> &v) {
    if ((int)v.size() == 1) {
        if (v[0].first == mid - 1) return false;
        if (v[0].second == 1) v[0].first++;
        else {
            pair<int, int> nw = {v[0].first + 1, 1};
            v[0].second--;
            connect(v, nw);
        }
        return true;
    }
    if (v.back().first == mid - 1) {
        pair<int, int>    bck = v.back();   v.pop_back();   bck.first = 0;
        pair<int, int> bckbck = v.back();   v.pop_back();
        if (bckbck.second == 1) {
            bckbck.first++;
            connect(v, bckbck);
        } else {
            pair<int, int> nw = {bckbck.first + 1, 1};
            bckbck.second--;
            connect(v, bckbck);
            connect(v, nw);
        }
        connect(v, bck);
    } else {
        if (v.back().second == 1) {
            pair<int, int> nw = v.back();   v.pop_back();
            nw.first++;
            connect(v, nw);
        } else {
            pair<int, int> nw = {v.back().first + 1, 1};
            v.back().second--;
            connect(v, nw);
        }
    }
    return true;
}

void cut(vector<pair<int, int>> &v, int bef, int aft) {
    while (bef > aft) {
        assert(v.size() >= 1);
        if (bef - aft >= v.back().second) {
            bef -= v.back().second;
            v.pop_back();
        } else {
            int sz = bef - aft;
            v.back().second -= sz;
            bef -= sz;
        }
    }
}

void print(vector<pair<int, int>> &v) {
    cout << v.size() << endl;
    for (auto& p: v) {
        cout << p.first << ' ' << p.second << endl;
    }
    cout << endl;
}

/*
    ランレングス圧縮した状態で操作を行う
    文字数を増やすときは, 最後に0をその個数分つなげる
    文字数が同じときは, 最後の要素をインクリメントする
    文字数を減らすときは, その文字数まで減らしてからインクリメントする
*/
bool check(int mid) {
    vector<pair<int, int>> arr;
    extend(arr, A[0]);
    FOR(i, 1, N) {
        int bef = A[i - 1];
        int aft = A[i];
        if (bef < aft) {
            extend(arr, aft - bef);
        } else if (bef == aft) {
            if (not increment(mid, arr)) return false;
        } else {
            cut(arr, bef, aft);
            if (not increment(mid, arr)) return false;
        }
        // print(arr);
    }
    return true;
}

signed main() {

    cin >> N;

    A.resize(N);
    REP(i, N) cin >> A[i];

    // vector<pair<int, int>> v;
    // v.emplace_back(1, 2);
    // v.emplace_back(0, 1);
    // print(v);
    // increment(10, v);
    // print(v);

    // cout << check(3) << endl;
    // cout << check(4) << endl;
    // REP(i, 100) {
    //     cout << i << ' ' << check(i) << endl;
    // }
    // return 0;

    ll ok = 1ll << 33, ng = 0;
    while (abs(ok - ng) > 1) {
        ll mid = (ok + ng) >> 1;
        if (check(mid)) {
            ok = mid;
        } else {
            ng = mid;
        }
    }

    cout << ok << endl;

}

Measured memory_bytes: 1152