import std.stdio, std.conv, std.string, std.array, std.range, std.algorithm, std.container;
import std.math, std.random, std.bigint, std.datetime, std.format;
void main(string[] args){ if(args.length > 1) if(args[1] == "-debug") DEBUG = 1; solve(); }
void log()(){ writeln(""); } void log(T, A ...)(T t, lazy A a){ if(DEBUG) write(t, " "), log(a); } bool DEBUG = 0; 
string rstring(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }
T rtype(T)(){ return rstring.to!T; } alias rint = rtype!int, rlong = rtype!long, rreal = rtype!real;
T[] rtypes(T)(int n){ return n.iota.map!(i => rtype!T()).array; } alias rint = rtypes!int, rlong = rtypes!long, rreal = rtypes!real;
T[][] rtypess(T)(int n, int m){ return n.iota.map!(i => rtypes!T(m)).array; } alias rint = rtypess!int, rlong = rtypess!long, rreal = rtypess!real;

// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- //

void solve(){
	int n = rint;
	long[] as = rlong(n) ~ 1;
	
	bool isNG(int k){
		log("k:", k);
		if(k == 1) return 1;
		long[] au = [0];
		long[] vu = [0];
		foreach(a; as){
			if(au[$ - 1] < a){
				au ~= a;
				vu ~= 1;
				log("case 1");
			}
			else if(au[$ - 1] == a){
				vu[$ - 1] += 1;
				log("case 2");
			}
			else{
				long v = 1;
				log("case 3");
				while(au[$ - 2] >= a){
					long l = au[$ - 1] - au[$ - 2];
					v = vu[$ - 1];
					while(l > 0 && v > 0) v = (v - 1) / k, l -= 1;
					au.length -= 1;
					vu.length -= 1;
					vu[$ - 1] += v;
					log("loop", "au:", au, "vu:", vu, "v:", v);
				}
				if(au[$ - 1] > a){
					long l = au[$ - 1] - a;
					v = vu[$ - 1];
					while(l > 0 && v > 0) v = (v - 1) / k, l -= 1;
					au[$ - 1] = a;
					vu[$ - 1] = 1 + v;
					log("case 3-1", "au:", au, "vu:", vu, "v:", v);
				}
				vu[$ - 1] += 1;
				log("au:", au, "vu:", vu, "v:", v);
			}
			log("a:", a, "au:", au, "vu:", vu);
		}
		log("res:", vu[$ - 1] > k + 1);
		return vu[$ - 1] > k + 1;
	}
	
	bool f = 1;
	foreach(i; 0 .. n - 1) if(as[i] >= as[i + 1]) f = 0;
	if(f) 1.writeln;
	else (1 + uplimit(1, n, &isNG)).writeln;
	
}
T uplimit(T)(T a, T c, bool delegate(T) f){
	if(f(c)) return c; if(! f(a)) return a - 1;
	while(a + 1 < c){ T b = (a + c) / 2; if(f(b)) a = b; else c = b; }
	return a;
}
/*

5
2 3 3 2 2

6
2 3 3 2 2 2

6
2 3 3 3 2 2

7
2 3 3 3 2 2 2



*/
