3
-1 1 -1
 4
45 -1 41 -1
 1
-1
 5
40 -1 44 46 48
 6
43 40 37 34 -1 -1
 7
-1 2 4 -1 4 1 5
 19
23 26 -1 -1 35 38 41 -1 -1 -1 53 -1 59 62 6 7 8 9 -1
 6
-1 2 6 -1 -1 6
 16
3 8 13 18 23 -1 -1 -1 43 48 53 45 -1 -1 -1 -1
 13
25 24 23 22 24 27 -1 33 -1 2 2 2 -1
 12
-1 17 -1 54 -1 64 -1 74 79 84 -1 94
 8
-1 12 14 16 18 20 -1 -1
 13
2 -1 3 1 3 1 -1 1 3 -1 -1 1 1
 5
-1 40 42 -1 46
 2
1000000000 -1
 14
-1 5 3 -1 -1 31 31 31 -1 31 -1 -1 4 7
 3
-1 1000000000 999999999
 7
32 33 34 -1 -1 37 38
 1
1000000000
 10
29 27 -1 23 42 -1 -1 45 -1 -1
 3
39 42 -1
 15
-1 28 -1 32 34 26 -1 26 -1 -1 26 26 26 -1 -1
 3
1000000000 999999999 1000000000
 17
-1 -1 -1 -1 64 68 72 -1 45 46 47 48 49 50 51 52 53
 3
-1 1 1000000000
 2
-1 1000000000
 3
999999999 -1 1000000000
 1
1
 2
1000000000 1000000000
 3
999999999 1000000000 -1
 7
11 8 5 -1 -1 -1 -1
 3
-1 1 2
 2
-1 21
 8
-1 -1 1 7 -1 9 5 2
 11
9 21 17 13 -1 -1 -1 -1 -1 -1 -1
 3
-1 1000000000 -1
 6
-1 6 1 -1 -1 -1
 1
65
 20
-1 32 37 -1 -1 -1 57 -1 -1 40 31 33 -1 -1 39 47 43 -1 35 32
 5
-1 1 7 -1 5
 18
21 19 -1 -1 -1 48 50 -1 54 -1 5 1 -1 -1 -1 37 36 35
 9
42 39 36 33 -1 -1 -1 34 39
 2
-1 -1

1
 1
 1
 1
 1
 3
 2
 2
 2
 3
 2
 1
 6
 1
 1
 3
 1
 1
 1
 2
 1
 2
 2
 2
 2
 1
 2
 1
 1
 1
 2
 2
 1
 3
 3
 1
 2
 1
 5
 2
 4
 2
 1

//Author: net12k44
import java.io.*;
import java.util.*;
//public
class Main{//}
static final int oo = Integer.MAX_VALUE;
int get(int left, int right, int a[]){
	int t = a[left] - a[right];
	int len = right-left;
	if (t%len == 0) return t/len;
	return oo;
}

boolean check(int start, int left, int right, int c, int a[]){
	int cc = c;
	if (a[right] != -1) {
		cc = get(left,right,a);
		if (cc == oo) return false;
		if (c != oo && c != cc) return false;
	} else if (c == oo) return true;
	
	int value_start = a[left] + cc*(left-start);
	int value_finish = a[left] - cc*(right-left);
	if (value_start <= 0 || value_start > (int)1e9) return false;
	if (value_finish<= 0 || value_finish> (int)1e9) return false;
	return true;
}

private void solve() {
	int n = in.nextInt();
	int a[] = new int[n];
	for(int i = 0; i < n; ++i) a[i] = in.nextInt();
		
	ArrayDeque<Integer> sequence = new ArrayDeque<Integer>();
	int oo = Integer.MAX_VALUE;
	int c = oo, k = 0;
	int v[] = new int[n];
	for(int i = 0; i < n; ++i) {
		while (k < n){
			if (a[k] != -1) {
				if (sequence.size() == 0) sequence.add(k);
				else if (check(i,sequence.peek(),k,c,a)) {				
					sequence.add(k);
					if (c == oo) c = get(sequence.peek(),k,a);
				} else break;
			} else 
			if (sequence.size() > 0 && !check(i,sequence.peek(),k,c,a)) break;
			++k;
		}
		v[i] = k;		
		if (sequence.size() != 0 && i == sequence.peek()) sequence.poll();
		if (sequence.size() < 2)
			c = oo;		
	}
	
	
	int f[] = new int[n+1];
	Arrays.fill(f,oo); f[n] = 0;
	ArrayDeque<Integer> q = new ArrayDeque<Integer>(); q.add(n);
	for(int i = n-1; i >= 0; --i){
		while (q.size() > 0 && q.peek() > v[i]) q.poll();
		f[i] = f[ q.peek() ] + 1;
		while (q.size() > 0 && f[ q.peekLast() ] > f[i]) q.pollLast();
		q.add(i);	
	}
	out.println(f[0]);
	
}
	
public static void main (String[] args) throws java.lang.Exception {		
	long startTime = System.currentTimeMillis();

	out = new PrintWriter(System.out);
	new Main().solve();	
	//out.println((String.format("%.2f",(double)(System.currentTimeMillis()-startTime)/1000)));
	out.close();
}
static PrintWriter out;
static class in {
	static BufferedReader reader = new BufferedReader( new InputStreamReader(System.in) ) ;
	static StringTokenizer tokenizer = new StringTokenizer("");				
	static String next() {		
		while ( !tokenizer.hasMoreTokens() )
			try { tokenizer = new StringTokenizer( reader.readLine() ); }
			catch (IOException e){
				throw new RuntimeException(e);			
			}		
		return tokenizer.nextToken();
	}
	static int nextInt() { return Integer.parseInt( next() ); }			
}
//////////////////////////////////////////////////
}//