Problem:
Score: 500 points

Problem Statement

N people are standing in a queue, numbered 1, 2, 3, ..., N from front to back. Each person wears a hat, which is red, blue, or green.

The person numbered i says:

"In front of me, exactly A_i people are wearing hats with the same color as mine."

Assuming that all these statements are correct, find the number of possible combinations of colors of the N people's hats.

Since the count can be enormous, compute it modulo 1000000007.

Constraints

1 \leq N \leq 100000

0 \leq A_i \leq N-1

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 A_3 ... A_N

Output

Print the number of possible combinations of colors of the N people's hats, modulo 1000000007.

Sample Input 1

6
0 1 2 3 4 5

Sample Output 1

3

We have three possible combinations, as follows:

Red, Red, Red, Red, Red, Red

Blue, Blue, Blue, Blue, Blue, Blue

Green, Green, Green, Green, Green, Green

Sample Input 2

3
0 0 0

Sample Output 2

6

Sample Input 3

54
0 0 1 0 1 2 1 2 3 2 3 3 4 4 5 4 6 5 7 8 5 6 6 7 7 8 8 9 9 10 10 11 9 12 10 13 14 11 11 12 12 13 13 14 14 15 15 15 16 16 16 17 17 17

Sample Output 3

115295190

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include "bits/stdc++.h"
#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<iomanip>
#include<assert.h>
#include<unordered_map>
#include<unordered_set>
#include<string>
#include<stack>
#include<complex>
#pragma warning(disable:4996)
using namespace std;
using ld = long double;
template<class T>
using Table = vector<vector<T>>;
const ld eps=1e-9;
	
#define WHATS(var)cout<<__LINE__<<' '<<#var<<"="<<var<<endl;
	
template<class S, class T> ostream& operator <<(ostream &os, const pair<S, T> v){
	os << "( " << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator <<(ostream &os, const vector<T> &v){
	for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator <<(ostream &os, const vector<vector<T>> &v){
	for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
template<class T> ostream& operator <<(ostream &os, const vector<set<T>> &v){
	for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
template<class T> ostream& operator <<(ostream &os, const set<T> &v){
	int i=0;
	for(auto it:v){
		if(i > 0){os << ' ';}
		os << it;
		i++;
	} 
	return os;
}
using ll=long long ;

int main() {
	ios::sync_with_stdio(false);
	// int a,b,c,d;cin>>a>>b>>c>>d;
	// cout<<(int(b>d))<<endl;

	// int N;cin>>N;
	// int answer=-1;
	// for(int i=1;i<50000;++i){
	// 	int j=i*108;
	// 	j/=100;
	// 	if(j==N){
	// 		answer=i;
	// 		break;
	// 	}
	// }
	// if(answer==-1)cout<<":("<<endl;
	// else cout<<answer<<endl;

	// int N;cin>>N;
	// string st;cin>>st;
	// //vector<vector<int>>dp(4,vector<int>(30001));
	// int answer=0;
	// for(int i=0;i<1000;++i){
	// 	vector<int>v;
	// 	int k=i;
	// 	for(int j=0;j<3;++j){
	// 		v.push_back(k%10);
	// 		k/=10;
	// 	}
		
	// 	int now=0;
	// 	for(auto c:st){
	// 		if(now<3&&v[now]==c-'0'){
	// 			now++;
	// 		}
	// 	}
	// 	if(now==3)answer++;
	// }

	// cout<<answer<<endl;
	// return 0;

	ll answer=1;
	int N;cin>>N;
	vector<int>v(3);
	while(N--){
		int a;cin>>a;
		ll val=0;
		int place=-1;
		for(int i=0;i<3;++i){
			if(a==v[i]){
				val++;
				place=i;
			}
		}
		if(place!=-1){
			answer*=val;
			v[place]++;
		}else{
			answer=0;
			break;
		}
		//WHATS(v)
		answer%=ll(1e9+7);
	}
	cout<<answer<<endl;
}