//Jakub Staroń
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <deque>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstdio>

#ifdef COMPILING_HOME
#define DEBUG_MODE
#define HAVE_NEW_STANDARD
#endif

#ifdef HAVE_NEW_STANDARD
#include <unordered_map>
#include <unordered_set>
#else
#include <tr1/unordered_map>
#include <tr1/unordered_set>
using namespace std::tr1;
#endif

#define hash_map      unordered_map
#define hash_multimap unordered_multimap
#define hash_set      unordered_set
#define hash_multiset unordered_multiset

using namespace std;

typedef char int8;
typedef unsigned char uint8;
typedef short int int16;
typedef unsigned short int uint16;
typedef int int32;
typedef unsigned int uint32;
typedef long long int64;
typedef unsigned long long uint64;

typedef std::pair<int32,int32> int32_pair;
typedef std::pair<uint32, uint32> uint32_pair;
typedef std::pair<int64,int64> int64_pair;
typedef std::pair<uint64,uint64> uint64_pair;

typedef std::vector<bool> bit_vector;

#ifdef HAVE_NEW_STANDARD
#define let(a,b) auto a = (b)
#else
#define let(a,b) __typeof (b) a = (b)
#endif

#ifdef DEBUG_MODE
#define pause system("pause")
#define clear_screen system("cls")
#define print(x) cerr << #x << " = " << x << endl
#define label_print(label, value) cerr << label << ' ' << value << endl
#define debug(x) x
#define line cerr << "Line " << __LINE__ << endl
#include <cassert>
#else
#define pause
#define clear_screen
#define print(x)
#define label_print(label, value)
#define debug(x)
#define assert(x)
#define line
#endif

#define rep(i,x) for(uint32 i = 0 ; i < (x) ; i++)
#define for_range(i,begin,end) for( let(i, (begin) ) ; i != (end) ; ++i )
#define foreach(i, c) for_range(i, c.begin(), c.end())
#define abs(a) ( (a) < 0 ? -(a) : (a) )
#define all(c) (c).begin(),(c).end()
#define sort_all(x) sort( all(x) )
#define divide(a,b) ( ( (b)%(a) ) == 0 )
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)

#define min(a,b) ( (a) < (b)? (a) : (b) )
#define max(a,b) ( (a) > (b)? (a) : (b) )
#define min3(a,b,c) (  min((a), min((b),(c))) )
#define max3(a,b,c) (  max((a), max((b),(c))) )
#define sig(x) ( (x) == 0 ? 0 : ( (x) < 0 ? -1 : 1 ) )

const double epsilon = 1e-5;

template<class T>
void unique(std::vector<T>& v)
{
	sort_all(v);
	v.resize( std::unique(all(v)) - v.begin() );
}

ostream& newline(ostream& str)
{
	str.put('\n');
	return str;
}

template<typename T1, typename T2>
istream& operator>>(istream& stream, std::pair<T1, T2>& pair)
{
	stream >> pair.first >> pair.second;
	return stream;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& stream, const std::pair<T1, T2>& pair)
{
	stream << pair.first << ' ' << pair.second;
	return stream;
}

class Graf
{
public:
	typedef vector<uint32> list_type;

	void resize(uint32 k)
	{
		graf.resize(k);
	}

	void add(uint32 a, uint32 b)
	{
		graf[a].push_back(b);
		graf[b].push_back(a);
	}

	uint32 deg(uint32 k)
	{
		return graf[k].size();
	}

	list_type& obok(uint32 k)
	{
		return graf[k];
	}

	uint32 size()
	{
		return graf.size();
	}

private:
	vector<list_type> graf;
};

const int64 modulo = 1000000007LL;
const int64 infinity = 1000000000000000000LL;

class Application
{
public:
	Application()
	{
	}

	void Run()
	{
		WczytajDane();

		vector<uint64_pair> D(N + 1, uint64_pair(0,0) );
		D[0] = uint64_pair(0, 1);

		for_range(i, 1, N + 1)
		{
			int64 maximum = infinity;
			int64 minimum = -infinity;

			for(int32 j = i - 1 ; j >= 0 ; j--)
			{
				minimum = max(minimum, R[j].first);
				maximum = min(maximum, R[j].second);

				int64 number = (i - j);


				if(minimum <= number && number <= maximum)
				{
					if(D[j].first + 1 == D[i].first)
					{
						D[i].second += D[j].second;
						D[i].second %= modulo;
					}
					else if(D[j].first + 1 > D[i].first)
					{

						D[i].first = D[j].first + 1;
						D[i].second = D[j].second;
					}
				}
				else
				{
					
				}
			}
		}

		if(D[N].first > 0)
		{
			cout << D[N] << newline;
		}
		else
		{
			cout << "NIE" << newline;
		}
		
	}



	void WczytajDane()
	{
		cin >> N;
		R.resize(N);
		rep(i, N)
			cin >> R[i];
	}

	uint32 N;
	vector<int64_pair> R;
};


int main()
{
	ios::sync_with_stdio(0);
	Application application;
	application.Run();
	return 0;
}