text: #include <bits/stdc++.h>
  #define rep(i, n) for (int i = 0; i < (n); ++i)
  using namespace std;
  using ll = long long;
  using P = pair<int, int>;
  using Graph = vector<vector<int>>;
  
  /*
      参考リンク
      三井住友信託銀行プログラミングコンテスト2019 E - Colorful Hats 2
        https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_e
  */
  
  const int mod = 1000000007;
  struct mint {
    ll x;  // typedef long long ll;
    mint(ll x = 0) : x((x % mod + mod) % mod) {}
    mint operator-() const { return mint(-x); }
    mint& operator+=(const mint a) {
      if ((x += a.x) >= mod) x -= mod;
      return *this;
    }
    mint& operator-=(const mint a) {
      if ((x += mod - a.x) >= mod) x -= mod;
      return *this;
    }
    mint& operator*=(const mint a) {
      (x *= a.x) %= mod;
      return *this;
    }
    mint operator+(const mint a) const {
      mint res(*this);
      return res += a;
    }
    mint operator-(const mint a) const {
      mint res(*this);
      return res -= a;
    }
    mint operator*(const mint a) const {
      mint res(*this);
      return res *= a;
    }
    mint pow(ll t) const {
      if (!t) return 1;
      mint a = pow(t >> 1);
      a *= a;
      if (t & 1) a *= *this;
      return a;
    }
  
    // for prime mod
    // フェルマーの小定理から a * a^(p-2) ≡ 1 (mod p) pは素数
    mint inv() const { return pow(mod - 2); }
    mint& operator/=(const mint a) { return (*this) *= a.inv(); }
    mint operator/(const mint a) const {
      mint res(*this);
      return res /= a;
    }
  };
  
  int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i, n) cin >> a[i];
  
    vector<int> c(n + 1);
    c[0] = 3;
    mint ans = 1;
    rep(i, n) {
      if (!c[a[i]]) {
        puts("0");
        return 0;
      }
      ans *= c[a[i]];
      c[a[i]]--;
      c[a[i] + 1]++;
    }
  
    cout << ans.x << endl;
    return 0;
  }