/* Aa^~ kokoro ga pyompyon suru n jaa^~
// ZZZXXkXkkkZ!``` ``` ``` ``` ``` ``` ``` ``` ``` ``` ``` ```?Wfpppbpbbpbbpbbbkbkk
// ppbbbpbbpVr`` `` ` ` ` ` ```` `` ` ` ``  ` ` ` ` ` ` ` ` `  dppbbkkkkkkkkkkqkqkk
// HkqqqqqkkWr`` ` ` ``` ``` `?G, ` ` ``.JC!```` ` ` `` `` ````(Wpbkkkkkkkkqkkkkkqk
// mmmmmqqqqpr` `` `` ```````.+zT=`` `` 7TO-.```````` `` `` ```(yppbkkkkkkkkkkkkkkk
// ggmgmmqqqH$ ``````````....````` `  ````````.`````` `` ``````.yfpppbbbbkkkkqqqqqH
// gmmmmmqqqkW<```` `````...`````  .,.`  ````....````` ``````` (Wbqqmgmmgmggggggggg
// qmmmqqqqkkWk.``````````````````` ;:<`` `````.`````````````-_<-?WHHqmmmmmmgmmgggg
// @@@@@@@gggHH6- ``````````````` `` _ `` ```````````````` ._~~_.`-?Wkqmmmmmmmggg@g
// @@@@g@gggHY~.-<_- `````````````````````````````````` ._~~(<-``.`.(WHqqqmmggggmmm
// @@g@gggHH=.`..._<-___..```````````````````````. .-_~~~_(!``-.``.`` OHHWUWHmqHWXW
// gggggmqK1.``..~.. _<<+-(____..  ````````  ..__~~_((<<!.`.``` .``.`` j0C1XUHmHIdW
// ggmmqH0!,_``.>`````` _<<;<v<<<++((((((((((<<<<<<~_. (-.``~``.>..```  jOuWHHqHIdH
// gmmqkW!`(_ J>`    `` ` _~<`_~~~~<<<<<<<~~__````````` ?1. ._`(__```    zXWHg@HkXH
// gHHWS{``(lJ<!``.``.```(:+>`._`````.` <..`` - ``. `   _ ?&._.I`_`````` .XyVfppppW
// HHHSv``.(X:_..... _..(;+<!.(<..-.....-.-_..+_`..<.`.`..`_IJd}  .`..````jqg@@@@@@
// XHWZ{..<Jk~!.`.. (<.-(+>(_.(1.(_..`.`.`.<_.+<_..<<-..._..-zy>.`_`...```.WH@HHHHH
// bkWt~.-jCz(_..`.(+<.(;< ._-<=_(<_..-....(_.<1<..(<<.`._..-JUS-._.`...```dHmH9VUH
// WUUO..(f.(c...__+z<-(+~` _-+<_(><..__.`.(<._.z_.(1;_..__.(C(zT-(..`...``(WHR<+Xk
// kkkk._(_.->..._(z;:_><.._>_+_<(1>_._<...(v<<.(<.(+z<..-_(Z~_<_j+_..`...`(WHKz1ZW
// @@gR._+_..~..-<+z<<?<>```_.<_.(+1><_;_..(1_:`.<<??1z--(+Z!..<_.j<....`..(bgHAAQX
// @@mR.(j:..~.._<z!`.(>~``` ~(_.(+<1><><_.(((_`.<__`.<_.(X>...<_.(<.....`.JUWWWyWW
// @gmH_(zl..(.._+>```<+_````.~>``(+.<?>>_._(<```(<<``(__<>....<.._<.......dXkkkHHH
// mmqHl(dk_.(_.-=~`.`.1-..._~-1.``_:`(??<_~(`.--.&_.`.<(;<...._.._<..`..._Xg@@@@@@
// qHkpk(dX<.(;..j_```.(((JJ&a&-~``````.1<_```-(((e+.-(/`(>...._..(<......(Wmggg@@g
// HVHbWcz><__+_.(_.(dWWHHH@HHc~````````.+~`` (jHMMMHHHm&.?..._<..(<_..._.(WqqHHmHg
// 0>vWWkzZwl~<o.__`__~X@@HM@Hb ```.`.``. ```` d@@HHH@@K?76...(<..(<_...(_(ppWWWWHq
// X0XWHKXXw$<(z<.( `` WHHMHHHH_``````````````.WHHMNMHHH_`(...(<_.(z_..._<(fWVC174W
// XuXWHHWWz>__+z+.!`..??CZYCOX_`````````````.`~.OvTUZUS_`~.._+?_.(_~_.._zjO=1+~+jy
// kkkkkkkkX:._<z=1(_`` << ``->``.``.``.``.```` ?<`` (v!`._..(??_.(1._.._=dUOOzzzwX
// @@@@@@@@H<...1O=v<_...__ -_````````````````.`` `` ~.`` :.~+=?~.(;_(...jdQQQQQkkk
// H@@@@@@@H~...(==>.~~~~~....`.`````````.`````.`........->.(===~~<<.(...(dg@@@@@@@
// @@@H@@HHH_.__(=l>~.~~~~~....``.``.``.```..`......~~~~~(<_+=l=~_<.->..~_dqggggg@g
// @H@@@@MHH_._<(=l>...........```````````````.`...~~~~~~+<(=lz=~((j=z_..~jWqmmgggm
// @@H@@HHWH_._<(lll-.......```.````.``.`..`````........_z<+llZz~(lOO=<...(VYUUUW9Y
// @@HMMHWZf>~_=:=llw+.`````````.`.```__~~_``.`````.....(z+llOOz_zllOlz~..~<<1+dW>_
// MMM#MHHWXl~_=>1ltwOl&.`.``.`````.``````````````.````.(llttwtz(OltwOz<..__zwOwwOz
// HM#HMHUUI<._1z+ttOZttlt&....``.``.`.````.``...``...(zZtttOktzjttttwlz_._<(Xkkkkk
// HHHmHSZu:(_~+OztttXtttOZZttO+-..............-(+ztOttwttttd0tOZttttwOl<~.(_dMMHHH
// rvuuXuuI~~<~(uttttwvOwwwkQQHMMHHHHHHHHHMMMNmgey?OwwwrtttwXOtwttttttXtO-~.((wZyyy
// HHHHHHK>(~(-(dOrtrrl(QgMHMMMHHHHHHHHHHHHHHHH##HMNkX0rrrrXXrd%`` (Ctwwtz_~.<(Wg@H
// NNNNNHD(~(zo~zXrrrQdHHMMNMHHHHHHHHHHHHHHHHHHHHHH##HNmyrdKkwZ ` _``-zwrt1~~_<(MNM
// MMMMM#<<_jwr:(Z4QHHMMHMHHHHHHHHHHHHHHHHHHHHHHHHHHHH###NHSXZ>` ~````.OXtt>~._<?MM
*/

#include <bits/stdc++.h>
using namespace std;

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define ALL(a)  begin((a)),end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define MT make_tuple
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

#define FF first
#define SS second

template<class S, class T>
istream& operator>>(istream& is, pair<S,T>& p){
  return is >> p.FF >> p.SS;
}
template<class T>
istream& operator>>(istream& is, vector<T>& xs){
  for(auto& x: xs)
	is >> x;
  return is;
}
template<class S, class T>
ostream& operator<<(ostream& os, const pair<S,T>& p){
  return os << p.FF << " " << p.SS;
}
template<class T>
ostream& operator<<(ostream& os, const vector<T>& xs){
  for(unsigned int i=0;i<xs.size();++i)
	os << (i?" ":"") << xs[i];
  return os;
}
template<class T>
void maxi(T& x, T y){
  if(x < y) x = y;
}
template<class T>
void mini(T& x, T y){
  if(x > y) x = y;
}
void debug(istringstream&){}
template <char sep=',', class Head, class... Tail>
void debug(istringstream& iss, Head&& head, Tail&&... tail)
{
  string name;
  getline(iss, name, ',');
  cout << sep << name << "=" << head;
  debug(iss, forward<Tail>(tail)...);
}
#define DEBUG(...) \
  do{ \
    istringstream ss(#__VA_ARGS__); \
    debug<' '>(ss, __VA_ARGS__); \
    cout<<endl; \
  }while(0)



const double EPS = 1e-10;
const double PI  = acos(-1.0);
const LL MOD = 1e9+7;

template<class T>
struct RangeSet{
  map<T,T> range;

  // return true if i is in range
  bool contain(T i){
	auto it = range.upper_bound(i);
	if(it == begin(range)) return false;
	--it;
	return (i < it->SS);
  }

  // erase and return contain(i)
  bool erase(T i){
	auto it = range.upper_bound(i);
	if(it == begin(range)) return false;
	--it;
	
	if(i < it->SS){
	  T r = it->SS;

	  it->SS = i-1;
	  if(i-1 <= it->FF)
		range.erase(it);
	  if(i+1 < r)
		range[i+1] = r;

	  return true;
	}
	return false;
  }
  
  void insert(T b, T e){
	auto it = range.upper_bound(b);
	if(it != begin(range)){
	  --it;
	  if(b <= it->SS){
		it->SS = max(it->SS, e);
	  }
	  else{
		it = range.insert(MP(b, e)).FF;
	  }
	}
	else{
	  it = range.insert(MP(b, e)).FF;
	}

	auto nit = next(it);
	while(nit != end(range)){
	  if(nit->FF <= it->SS){
		it->SS = max(it->SS, nit->SS);
		nit = range.erase(nit);
	  }
	  else break;
	}
  }
};


using Range = RangeSet<int>;
bool inc(map<int,int>& s, int K, int i, Range& ran){
  while(i >= 0){
	if(ran.erase(i)){
	  s[i] = 1;
	  return true;
	}
	
	s[i]++;
	if(s[i] < K) return true;
	s[i] = 0;
	--i;
  }

  return false;
}

int naive(int N, VI& xs){
  int M = *max_element(ALL(xs));
  VI mem(M+1);

  int lb = 1, ub = N;
  while(ub - lb > 1){
	int mid = (lb + ub) / 2;

	bool ok = true;
	mem.assign(M+1, 0);
	FOR(i,1,N){
	  if(xs[i-1] < xs[i]){
		FOR(j,xs[i-1]+1,xs[i]+1) mem[j] = 0;
	  }
	  else if(xs[i-1] == xs[i]){
		mem[xs[i-1]]++;
		for(int l=xs[i-1];;--l){
		  if(mem[l] >= mid){
			if(l == 0){
			  ok = false;
			  break;
			}
			mem[l] = 0;
			mem[l-1]++;
		  }
		  else break;
		}
	  }
	  else{
		mem[xs[i]]++;
		for(int l=xs[i];;--l){
		  if(mem[l] >= mid){
			if(l == 0){
			  ok = false;
			  break;
			}
			mem[l] = 0;
			mem[l-1]++;
		  }
		  else break;
		}
	  }
	}

	(ok ? ub : lb) = mid;
  }

  return ub;
}

int main(){
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  int N;
  cin >> N;
  VI xs(N);
  cin >> xs;
  for(auto& x: xs) --x;

  bool ok = true;
  REP(i,N-1) ok &= xs[i] < xs[i+1];
  if(ok){
	cout << 1 << endl;
	return 0;
  }

  int lb = 1, ub = N;
  while(ub - lb > 1){
	int mid = (lb + ub) / 2;

	ok = true;
	map<int,int> mp;
	int prv = xs[0];
	Range ran;
	ran.insert(0, 1e9);
	FOR(i,1,N){
	  if(prv < xs[i]){
		ran.insert(prv+1, xs[i]+1);
	  }
	  else if(prv == xs[i]){
		if(!inc(mp, mid, prv, ran)){
		  ok = false;
		  break;
		}
	  }
	  else{
		ran.insert(xs[i]+1, prv+1);
		if(!inc(mp, mid, xs[i], ran)){
		  ok = false;
		  break;
		}
	  }
	  prv = xs[i];
	}
	
	if(ok){
	  ub = mid;
	}
	else{
	  lb = mid;
	}
  }

#ifdef PYONPOI
  int ans = naive(N, xs);
  if(ans != ub){
	cerr << "expected: " << ans << ", actual: " << ub << endl;
	return 1;
  }
#endif
  cout << ub << endl;

  return 0;
}


Measured memory_bytes: 9856