4
90 91 90 91
 4
54 54 54 55
 10
55 39 93 42 97 40 36 38 11 97
 3
90 39 98
 5
21 57 40 94 17
 8
46 4 30 85 52 6 84 13
 6
47 100 96 2 96 43
 4
61 28 3 81
 5
14 91 91 91 84
 3
22 23 24
 1
13
 9
13 80 13 38 98 85 11 73 74
 10
95 51 52 8 44 39 77 17 96 88
 3
40 40 40
 4
16 17 17 18
 3
68 67 67
 4
83 100 81 75
 9
71 71 70 70 71 70 69 70 71
 10
9 9 9 10 10 9 8 8 9 9
 6
87 86 86 86 85 86
 5
64 63 63 62 61
 3
76 9 12
 4
61 60 60 60
 7
23 37 39 8 72 31 85
 10
67 67 67 67 67 67 67 67 67 67
 4
92 18 29 93
 4
14 15 15 16
 10
79 84 22 38 23 22 33 42 13 96
 7
20 21 95 73 49 98 53
 10
28 61 23 73 61 33 45 55 18 43
 9
15 14 14 13 13 12 13 13 14
 5
46 46 47 46 45
 7
35 91 87 78 17 71 63
 3
69 26 73
 10
16 17 16 15 14 15 16 17 16 15
 9
95 7 97 61 90 7 30 65 39
 10
2 83 18 65 58 95 37 51 86 47
 6
59 59 60 60 59 58

YES YES NO NO NO NO NO NO NO YES YES NO NO YES YES YES NO YES YES YES YES NO YES NO YES NO YES NO NO NO YES YES NO NO YES NO NO YES
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ss = stringstream;
using ul = unsigned long long;
template <typename T>
inline T LCM(T a, T b) {
  return (a * b) / GCD(a, b);
}
template <typename T>
inline T GCD(T a, T b) {
  ll t;
  while (a) {
    t = a;
    a = b % a;
    b = t;
  }
  return b;
}
template <typename T>
inline T _max(T a, T b, T c) {
  return max(max(a, b), c);
}
template <typename T>
inline T _min(T a, T b, T c) {
  return min(min(a, b), c);
}
template <typename T>
inline string toString(T a) {
  return to_string(a);
}
template <typename T>
inline void toInt(string s, T &x) {
  ss str(s);
  str >> x;
}
inline void lower(string &s) {
  for (__typeof((s).begin()) it = (s).begin(); it != (s).end(); ++it)
    *it = tolower(*it);
}
inline void upper(string &s) {
  for (__typeof((s).begin()) it = (s).begin(); it != (s).end(); ++it)
    *it = toupper(*it);
}
const ll inf = 999999999999999999;
const int iinf = 999999999;
bool palin(string s) {
  string s1 = s;
  reverse(s.begin(), s.end());
  return (s == s1);
}
ll triangle(ll n) { return (n * (n + 1)) / 2; }
bool check(ll n) {
  if (n == 1) return 0;
  if (n == 2 or n == 3) return 1;
  if (n % 2 == 0 or n % 3 == 0) return 0;
  for (ll i = 5; i * i <= n; i += 6)
    if (n % i == 0 or n % (i + 2) == 0) return 0;
  return 1;
}
const ll N = 1000005;
bool mark[N / 2];
vector<ll> prime;
void seive() {
  prime.push_back(2);
  for (ll i = 3; i * i <= N; i += 2) {
    if (!mark[i / 2]) {
      for (ll j = i * i; j <= N; j += i * 2) {
        mark[j / 2] = 1;
      }
    }
  }
  for (ll i = 3; i <= N; i += 2) {
    if (!mark[i / 2]) {
      prime.push_back(i);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  int n;
  cin >> n;
  vector<int> v;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    v.push_back(x);
  }
  for (int i = 1; i < n; i++) {
    int d = abs(v[i] - v[i - 1]);
    if (d > 1) {
      return cout << "NO", 0;
    }
  }
  cout << "YES";
  cout << "\n";
  return 0;
}
