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

#include <bits/stdc++.h>
using namespace std;
const int N = 4e5;
const int mod = 1000000007;
const int inf = 1e9;
const double pi = acos(-1.0);
const double eps = 1e-8;
struct unionset {
  int fat[1003], len;
  void init(int x) {
    len = x;
    for (int i = 0; i < x; i++) fat[i] = i;
    return;
  }
  int getf(int x) {
    if (fat[x] == x) return x;
    return fat[x] = getf(fat[x]);
  }
  void un(int x, int y) {
    fat[getf(y)] = getf(x);
    return;
  }
};
struct tree_array {
  int c[1003];
  int v[1003], len;
  int get_low(int x) { return x & (-x); }
  void init(int x) {
    len = x;
    for (int i = 0; i < x; i++) c[i] = v[i] = 0;
    return;
  }
  void add(int x, int value) {
    v[x] += value;
    while (x <= len) {
      c[x] += value;
      x += get_low(x);
    }
    return;
  }
  int sum(int x) {
    int ans = 0;
    while (x > 0) {
      ans += c[x];
      x -= get_low(x);
    }
    return ans;
  }
};
int pow_mod(int a, int b, int c) {
  long long ans = 1, tmp = a;
  while (b) {
    if (b & 1) ans = ans * tmp % c;
    tmp = tmp * tmp % c;
    b >>= 1;
  }
  return ans;
}
long long gcd(long long a, long long b) { return !b ? a : gcd(b, a % b); }
class ColorfulCoins {
 public:
  int minQueries(vector<long long> values) {
    int xx[100];
    int n = values.size() - 1;
    for (int i = 0; i < values.size(); i++) xx[i] = values[i + 1] / values[i];
    if (n == 0) return 0;
    int cnt = n, tag[100] = {0};
    while (cnt > 0) {
      int id = 0, bb = 0;
      for (int i = 0; i < n; i++)
        if (tag[i] == 0 && xx[i] > bb) {
          id = i;
          bb = xx[i];
        }
      tag[id] = 1;
      cnt--;
    }
  }
};
int l[N], num[N];
int can[N];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &num[i]);
  int t = -1;
  for (int i = 0; i < n; i++) {
    l[i] = t;
    if (num[i] > 0) t = i;
  }
  for (int i = 0; i < n; i++) {
    if (i == 0)
      can[i] = 0;
    else if (num[i] == -1) {
      int r = l[i];
      if (r == -1)
        can[i] = can[i - 1] + 1;
      else {
        int le = l[r];
        if (le > -1 && le >= i - 1 - can[i - 1]) {
          int vr = num[r], vl = num[le];
          int d = (vr - vl) / (r - le);
          if ((d >= 0) || vr + 1ll * d * (i - r) > 0) {
            can[i] = can[i - 1] + 1;
            continue;
          }
        }
        can[i] = i - (le + 1);
      }
    } else {
      int le = l[i];
      if (le < 0)
        can[i] = i;
      else {
        if ((num[i] - num[le]) % (i - le) == 0) {
          int d = (num[i] - num[le]) / (i - le);
          int ll = l[le];
          if (ll > -1 && (((num[le] - num[ll]) % (le - ll)) == 0) &&
              ((num[le] - num[ll]) / (le - ll)) == d) {
            can[i] = can[i - 1] + 1;
            continue;
          }
          if (d <= 0)
            can[i] = i - (ll + 1);
          else
            can[i] = min(i - (ll + 1), i - le + (num[le] - 1) / d);
        } else
          can[i] = i - (le + 1);
      }
    }
  }
  int ans = 0;
  int xx = n - 1;
  while (xx >= 0) {
    ans++;
    xx -= can[xx] + 1;
  }
  printf("%d\n", ans);
  return 0;
}
