#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#  include <intrin.h>
#  define __builtin_popcount __popcnt
#endif

#define _USE_MATH_DEFINES

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <stack>
#include <list>
#include <math.h>
#include <bitset>
#include <iterator>
#include <map>
#include <iomanip>
#include <functional>
#include <string>
#include <algorithm>
#include <queue>
#include <random>
#include <numeric>
#include <set>
#include <cassert>
#include <fstream>
#include <cmath>
#include <cinttypes>

using namespace std;

template<class T> ostream& operator<<(ostream& os, const vector<T>& v) { for (auto i = begin(v); i != end(v); i++) os << *i << (i == end(v) - 1 ? "" : " "); return os; }
template<class T> istream& operator>>(istream& is, vector<T>& v) { for (auto i = begin(v); i != end(v); i++) is >> *i; return is; }
struct fast_io {
	fast_io& operator>> (int& target) { scanf("%" PRId32, &target);  return *this; }
	fast_io& operator>> (unsigned int& target) { scanf("%" PRIu32, &target);  return *this; }
	fast_io& operator>> (long long& target) { scanf("%" PRId64, &target);  return *this; }
	fast_io& operator>> (unsigned long long& target) { scanf("%" PRIu64, &target);  return *this; }
	template<typename T, typename U> fast_io& operator>> (pair<T, U>& target) { *this >> target.first >> target.second; return *this; }
	template<typename T> fast_io& operator>> (vector<T>& target) { for (auto& value : target) { *this >> value; } return *this; }
	fast_io& operator<< (const int value) { printf("%" PRId32, value); return *this; }
	fast_io& operator<< (const unsigned int value) { printf("%" PRIu32, value); return *this; }
	fast_io& operator<< (const long long value) { printf("%" PRId64, value); return *this; }
	fast_io& operator<< (const unsigned long long value) { printf("%" PRIu64, value); return *this; }
	fast_io& operator<< (const string& value) { printf("%s", value.c_str()); return *this; }
	template<typename T> fast_io& operator<< (const vector<T>& target) { for (auto& value : target) { *this << value << " "; } return *this; }
}; fast_io fio;

template<class ForwardIt, class UnaryPredicate>
ForwardIt first_true(ForwardIt first, ForwardIt last, UnaryPredicate predicate) {
	ForwardIt it;
	typename std::iterator_traits<ForwardIt>::difference_type count, step; count = std::distance(first, last);
	while (count > 0) {
		it = first;	step = count / 2;
		std::advance(it, step);
		if (!predicate(*it)) { first = ++it; count -= step + 1; }
		else count = step;
	}
	return first;
}

#define MOD 1000000007
#define pii pair<int,int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define sort_all(x) sort(all(x))
#define make_unique(x) (x).erase(unique(all(x)), (x).end())


bool check(int m, vector<int>& vec, int val_cnt)
{
	vector<int> values(val_cnt + 10, 0);
	set<int> ava,valued;
	if (m > 1)
	{
		for (int i = 0; i < values.size(); i++)
			ava.insert(i);
	}

	
	int prev_val = -1;
	for (int u : vec)
	{
		if (prev_val < 0)
		{
			// skip first
			prev_val = u;
			continue;
		}

		if (prev_val < u)
		{
			prev_val = u;
			continue;
		}
		prev_val = u;

		auto it = ava.lower_bound(u);
		if (it == ava.begin())
			return false;
		it--;
		values[*it]++;
		valued.insert(*it);

		while (valued.size() > 0 && *valued.rbegin() > *it)
		{
			int x = *valued.rbegin();
			values[x] = 0;
			ava.insert(x);
			valued.erase(x);
		}

		if (values[*it] == m-1)
			ava.erase(it);
	}

	return true;
}

int main() {

#if defined(_DEBUG) 
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	cin.sync_with_stdio(0);
	cin.tie(0);

	int n;
	fio >> n;
	vector<int> vec(n);
	fio >> vec;
	if (n == 1)
	{
		fio << 1;
		return 0;
	}
	
	int prev_max = n+1;
	for (int& u : vec)
	{
		if (u > prev_max)
		{
			u = prev_max + 1;
			prev_max = u;
		}
	}

	
	int left = 1, right = n + 5;
	while (left < right) {
		int m = (left + right) / 2;
		if (check(m, vec, prev_max))
		{
			right = m;
		}
		else
			left = m + 1;
	}
	fio << left;

	return 0;
}


Measured memory_bytes: 24252