#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define mod 998244353LL
#define eps 1e-13
// #define PI 3.141592653589793238L
#define INF 1000000011
#define INFLL 1000000000000000011LL
#define vi vector<int>
#define vll vector<long long>
#define pii pair<int, int>
#define pll pair<long long, long long>
#define pil pair<int, long long>
#define pli pair<long long, int>
#define mp make_pair
#define F first
#define S second
#define pb push_back
#define fo(i,a,n) for(i = (a); i < (n); i++)
#define gtl(x) getline(cin, (x))
#define flsh fflush(stdout)
#define sws ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define gcd __gcd
#define all(a) (a).begin(), (a).end()
#define sz(a) (int)((a).size())
#define io_file freopen("D:/Coding Problems/Contest/input_file.in", "r", stdin); freopen("D:/Coding Problems/Contest/output_file.out", "w", stdout)

ll modx(ll Base, ll exponent)
{
	ll ans = 1;
	if(Base == 1)
		return Base;
	while(exponent)
	{
		if(exponent & 1)
			ans = (ans * Base)%mod;
		Base = (Base * Base)%mod;
		exponent = exponent >> 1;
	}
	return ans;
}

ll inmodx(ll num)
{
	return (modx(num, mod-2LL));
}

bool cmp(pair < pii, int > a, pair < pii, int > b)//true for a before b
{
	if(a.F.F/300 < b.F.F/300)
		return 1;
	if(a.F.F/300 > b.F.F/300)
		return 0;
	if(a.F.S < b.F.S)
		return 1;
	if(a.F.S > b.F.S)
		return 0;
	if(a.F <= b.F)
		return 1;
	return 0;
}

const int N = (2e5) + 9;
const int M = (N<<2) + 9;
const int LOGN = ((int)log2(N)) + 3;
const int LOGM = ((int)log2(M)) + 3;
const int BUCK = 2*550;
const int SQRT = BUCK+9;

int n;
vector < pii > arr;
int a[N];

bool func(int x)
{
	int i, z, val, last_char;
	pii last;
	arr.clear();
	arr.pb({0,a[1]});
	fo(i,2,n+1)
	{
		if(a[i] > a[i-1])
		{
			if(arr.back().F == 0)
				arr.back().S += (a[i]-a[i-1]);
			else
				arr.pb({0,a[i]-a[i-1]});
		}
		else
		{
			z = a[i-1]-a[i];
			while(z > 0)
			{
				val = min(z, arr.back().S);
				z -= val;
				arr.back().S -= val;
				if(arr.back().S == 0)
					arr.pop_back();
			}
			last = {-1,-1};
			if(arr.back().F == x-1)
			{
				last = arr.back();
				arr.pop_back();
				if(arr.empty())
					return 0;
			}
			last_char = arr.back().F;
			arr.back().S--;
			if(arr.back().S == 0)
				arr.pop_back();
			assert(last_char < x-1);
			last_char++;
			if(!arr.empty() && arr.back().F == last_char)
				arr.back().S++;
			else
				arr.pb({last_char,1});
			if(last != mp(-1,-1))
			{
				last.F = 0;
				arr.pb(last);
			}
		}
	}
	return 1;
}

int binsea(int l, int r)
{
	if(l > r)
		return INF;
	int mid = (l+r)>>1;
	if(func(mid))
		return min(mid, binsea(l,mid-1));
	return binsea(mid+1,r);
}

void solve()
{
	int i, ans;
	cin >> n;
	fo(i,1,n+1)
		cin >> a[i];
	ans = binsea(1,1000000000);
	cout << ans << '\n';
	return;
}

int main()
{
	sws;
	clock_t clk;
	clk = clock();
	// io_file;
	// srand (time(NULL));

	//Code here
	int t = 1, cs;
	cout << fixed << setprecision(9);
	// cin >> t;
	fo(cs,1,t+1)
	{
		// cout << "Case #" << cs << ": ";
		solve();
	}
	// Code ends here

	clk = clock() - clk;
	cerr << fixed << setprecision(6) << "Time: " << ((double)clk)/CLOCKS_PER_SEC << "\n";
	return 0;
}

Measured memory_bytes: 1024