//#pragma GCC optimize("O3", "unroll-loops")
//#pragma GCC target("avx2", "bmi", "bmi2", "lzcnt", "popcnt")
#include <bits/stdc++.h>
#define ldb long double
//#define double ldb
#define db double
#define unomap unordered_map
#define unoset unordered_set
#define endl '\n'
#define str string
#define strstr stringstream
#define sz(a) (int)a.size()
#define ll long long
//#define int ll
#define pii pair <int, int>
#define pll pair <ll, ll>
#define Unique(a) a.resize(unique(all(a)) - a.begin())
#define ull unsigned ll
#define fir first
#define sec second
#define idc cin.ignore()
#define lb lower_bound
#define ub upper_bound
#define all(s) s.begin(), s.end()
#define rev reverse
#define gcd __gcd
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define mul2x(a, x) a << x
#define div2x(a, x) a >> x
#define lcm(a, b) (a / __gcd(a, b) * b)
#define log_base(x, base) log(x) / log(base)
#define debug cerr << "No errors!"; exit(0);
#define forw(i, a, b) for (int (i) = (a); (i) <= (b); ++(i))
#define forw2(i, a, b) for (ll (i) = (a); (i) <= (b); ++(i))
#define fors(i, a, b) for (int (i) = (a); (i) >= (b); --(i))
#define fors2(i, a, b) for (ll (i) = (a); (i) >= (b); --(i))
#define pqueue priority_queue
#define sqrt sqrtl
#define i128 __int128
#define popcount __builtin_popcountll
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(x) ((1LL) << (x))
#define want_digit(x) cout << fixed << setprecision(x);
#define excuting_time 1000.0 * clock() / CLOCKS_PER_SEC
#define mapa make_pair
using namespace std;
// const int MOD = 1e9 + 7; // 998244353
const int MOD = 1e6 + 3;
const int inf = 1e9;
const ll INF = 1e18; // MASK(63) - 1
const int N = 4e5;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll random(const ll &L, const ll &R) {
return uniform_int_distribution<ll> (L, R) (rng);
}
void add(int &x, const int &y) {
x += y;
if (x >= MOD) x -= MOD;
}
const int N4 = 4e3;
int n, a[N + 5], dp[N4 + 5][N4 + 5], lim;
ll m;
void sub4() {
forw (i, 1, lim + 1) dp[i][i - 1] = 1;
for (int len = 2; len <= lim; len += 2) {
for (int l = 1; l + len - 1 <= lim; ++l) {
int r = l + len - 1;
ll res = 0;
for (int k = l + 1; k <= r; k += 2) {
if ((ll)a[k] - (ll)a[l] > m) break;
res += (ll)dp[l + 1][k - 1] * dp[k + 1][r] % MOD;
if (res >= MOD) res %= MOD;
}
dp[l][r] = res % MOD;
}
}
cout << dp[1][lim] % MOD << endl;
}
ll mul(const ll &a, const ll &b, const ll &mod) {
if (!b) return 0;
if (b == 1) return a % mod;
ll tmp = mul(a, b >> 1, mod);
(tmp <<= 1) %= mod;
if (b & 1) (tmp += a % mod) %= mod;
return tmp;
}
ll power_mod(const ll &x, const ll &n, const ll &mod) {
if (!n) return 1;
if (n == 1) return x % mod;
ll X = power_mod(x, n >> 1, mod);
X = mul(X, X, mod);
if (n & 1) X = mul(X, x, mod);
return X;
}
ll fact_mod(int x) {
ll ret = 1;
forw2 (i, 1, x) (ret *= i) %= MOD;
return ret;
}
ll mod_inv(const ll &a, const ll &m) {
return power_mod(a, m - 2, m) % m;
}
ll mod_div(const ll &a, const ll &b, const ll &mod) {
ll inv = mod_inv(b, mod);
return mul(a, inv, mod);
}
ll catalan_mod(int n) {
ll num = fact_mod(n * 2);
ll den = mul(fact_mod(n + 1), fact_mod(n), MOD);
ll res = mod_div(num, den, MOD);
return res;
}
void sub5() {
cout << catalan_mod(n) << endl;
}
void solve() {
cin >> n >> m;
lim = n * 2;
forw (i, 1, lim) cin >> a[i];
if (n <= 2e3) sub4();
else sub5();
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
srand(time(NULL));
#define name "test"
/*
if (fopen(name".INP", "r")) {
freopen(name".INP", "r", stdin);
freopen(name".OUT", "w", stdout);
}
*/
bool testCase = false;
int numTest = 1;
// cin >> numTest;
forw (i, 1, numTest) {
if (testCase) cout << "Case " << i << ": ";
solve();
}
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiTzMiLCAidW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIiLCAiYm1pIiwgImJtaTIiLCAibHpjbnQiLCAicG9wY250IikKCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIGxkYiBsb25nIGRvdWJsZQovLyNkZWZpbmUgZG91YmxlIGxkYgojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIHVub21hcCB1bm9yZGVyZWRfbWFwCiNkZWZpbmUgdW5vc2V0IHVub3JkZXJlZF9zZXQKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBzdHIgc3RyaW5nCiNkZWZpbmUgc3Ryc3RyIHN0cmluZ3N0cmVhbQojZGVmaW5lIHN6KGEpIChpbnQpYS5zaXplKCkKI2RlZmluZSBsbCBsb25nIGxvbmcKLy8jZGVmaW5lIGludCBsbAojZGVmaW5lIHBpaSBwYWlyIDxpbnQsIGludD4KI2RlZmluZSBwbGwgcGFpciA8bGwsIGxsPgojZGVmaW5lIFVuaXF1ZShhKSBhLnJlc2l6ZSh1bmlxdWUoYWxsKGEpKSAtIGEuYmVnaW4oKSkKI2RlZmluZSB1bGwgdW5zaWduZWQgbGwKI2RlZmluZSBmaXIgZmlyc3QKI2RlZmluZSBzZWMgc2Vjb25kCiNkZWZpbmUgaWRjIGNpbi5pZ25vcmUoKQojZGVmaW5lIGxiIGxvd2VyX2JvdW5kCiNkZWZpbmUgdWIgdXBwZXJfYm91bmQKI2RlZmluZSBhbGwocykgcy5iZWdpbigpLCBzLmVuZCgpCiNkZWZpbmUgcmV2IHJldmVyc2UKI2RlZmluZSBnY2QgX19nY2QKI2RlZmluZSBwdXNoYiBwdXNoX2JhY2sKI2RlZmluZSBwb3BiIHBvcF9iYWNrCiNkZWZpbmUgcHVzaGYgcHVzaF9mcm9udAojZGVmaW5lIHBvcGYgcG9wX2Zyb250CiNkZWZpbmUgbXVsMngoYSwgeCkgYSA8PCB4CiNkZWZpbmUgZGl2MngoYSwgeCkgYSA+PiB4CiNkZWZpbmUgbGNtKGEsIGIpIChhIC8gX19nY2QoYSwgYikgKiBiKQojZGVmaW5lIGxvZ19iYXNlKHgsIGJhc2UpIGxvZyh4KSAvIGxvZyhiYXNlKQojZGVmaW5lIGRlYnVnIGNlcnIgPDwgIk5vIGVycm9ycyEiOyBleGl0KDApOwojZGVmaW5lIGZvcncoaSwgYSwgYikgIGZvciAoaW50IChpKSA9IChhKTsgKGkpIDw9IChiKTsgKysoaSkpCiNkZWZpbmUgZm9ydzIoaSwgYSwgYikgZm9yIChsbCAoaSkgPSAoYSk7IChpKSA8PSAoYik7ICsrKGkpKQojZGVmaW5lIGZvcnMoaSwgYSwgYikgIGZvciAoaW50IChpKSA9IChhKTsgKGkpID49IChiKTsgLS0oaSkpCiNkZWZpbmUgZm9yczIoaSwgYSwgYikgZm9yIChsbCAoaSkgPSAoYSk7IChpKSA+PSAoYik7IC0tKGkpKQojZGVmaW5lIHBxdWV1ZSBwcmlvcml0eV9xdWV1ZQojZGVmaW5lIHNxcnQgc3FydGwKI2RlZmluZSBpMTI4IF9faW50MTI4CiNkZWZpbmUgcG9wY291bnQgX19idWlsdGluX3BvcGNvdW50bGwKI2RlZmluZSBCSVQoeCwgaSkgKCgoeCkgPj4gKGkpKSAmIDEpCiNkZWZpbmUgTUFTSyh4KSAoKDFMTCkgPDwgKHgpKQojZGVmaW5lIHdhbnRfZGlnaXQoeCkgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oeCk7CiNkZWZpbmUgZXhjdXRpbmdfdGltZSAxMDAwLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMKI2RlZmluZSBtYXBhIG1ha2VfcGFpcgp1c2luZyBuYW1lc3BhY2Ugc3RkOwovLyBjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgLy8gOTk4MjQ0MzUzCmNvbnN0IGludCBNT0QgPSAxZTYgKyAzOwpjb25zdCBpbnQgaW5mID0gMWU5Owpjb25zdCBsbCBJTkYgPSAxZTE4OyAvLyBNQVNLKDYzKSAtIDEKY29uc3QgaW50IE4gPSA0ZTU7CgptdDE5OTM3XzY0IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwpsbCByYW5kb20oY29uc3QgbGwgJkwsIGNvbnN0IGxsICZSKSB7CiAgICByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGxsPiAoTCwgUikgKHJuZyk7Cn0KCnZvaWQgYWRkKGludCAmeCwgY29uc3QgaW50ICZ5KSB7CiAgICB4ICs9IHk7CiAgICBpZiAoeCA+PSBNT0QpIHggLT0gTU9EOwp9Cgpjb25zdCBpbnQgTjQgPSA0ZTM7CmludCBuLCBhW04gKyA1XSwgZHBbTjQgKyA1XVtONCArIDVdLCBsaW07CmxsIG07CnZvaWQgc3ViNCgpIHsKICAgIGZvcncgKGksIDEsIGxpbSArIDEpIGRwW2ldW2kgLSAxXSA9IDE7CgogICAgZm9yIChpbnQgbGVuID0gMjsgbGVuIDw9IGxpbTsgbGVuICs9IDIpIHsKICAgICAgICBmb3IgKGludCBsID0gMTsgbCArIGxlbiAtIDEgPD0gbGltOyArK2wpIHsKICAgICAgICAgICAgaW50IHIgPSBsICsgbGVuIC0gMTsKICAgICAgICAgICAgbGwgcmVzID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgayA9IGwgKyAxOyBrIDw9IHI7IGsgKz0gMikgewogICAgICAgICAgICAgICAgaWYgKChsbClhW2tdIC0gKGxsKWFbbF0gPiBtKSBicmVhazsKICAgICAgICAgICAgICAgIHJlcyArPSAobGwpZHBbbCArIDFdW2sgLSAxXSAqIGRwW2sgKyAxXVtyXSAlIE1PRDsKICAgICAgICAgICAgICAgIGlmIChyZXMgPj0gTU9EKSByZXMgJT0gTU9EOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRwW2xdW3JdID0gcmVzICUgTU9EOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IGRwWzFdW2xpbV0gJSBNT0QgPDwgZW5kbDsKfQoKbGwgbXVsKGNvbnN0IGxsICZhLCBjb25zdCBsbCAmYiwgY29uc3QgbGwgJm1vZCkgewogICAgaWYgKCFiKSByZXR1cm4gMDsKICAgIGlmIChiID09IDEpIHJldHVybiBhICUgbW9kOwoKICAgIGxsIHRtcCA9IG11bChhLCBiID4+IDEsIG1vZCk7CiAgICAodG1wIDw8PSAxKSAlPSBtb2Q7CiAgICBpZiAoYiAmIDEpICh0bXAgKz0gYSAlIG1vZCkgJT0gbW9kOwogICAgcmV0dXJuIHRtcDsKfQoKbGwgcG93ZXJfbW9kKGNvbnN0IGxsICZ4LCBjb25zdCBsbCAmbiwgY29uc3QgbGwgJm1vZCkgewogICAgaWYgKCFuKSByZXR1cm4gMTsKICAgIGlmIChuID09IDEpIHJldHVybiB4ICUgbW9kOwogICAgbGwgWCA9IHBvd2VyX21vZCh4LCBuID4+IDEsIG1vZCk7CiAgICBYID0gbXVsKFgsIFgsIG1vZCk7CiAgICBpZiAobiAmIDEpIFggPSBtdWwoWCwgeCwgbW9kKTsKICAgIHJldHVybiBYOwp9CgpsbCBmYWN0X21vZChpbnQgeCkgewogICAgbGwgcmV0ID0gMTsKICAgIGZvcncyIChpLCAxLCB4KSAocmV0ICo9IGkpICU9IE1PRDsKICAgIHJldHVybiByZXQ7Cn0KCmxsIG1vZF9pbnYoY29uc3QgbGwgJmEsIGNvbnN0IGxsICZtKSB7CiAgICByZXR1cm4gcG93ZXJfbW9kKGEsIG0gLSAyLCBtKSAlIG07Cn0KCmxsIG1vZF9kaXYoY29uc3QgbGwgJmEsIGNvbnN0IGxsICZiLCBjb25zdCBsbCAmbW9kKSB7CiAgICBsbCBpbnYgPSBtb2RfaW52KGIsIG1vZCk7CiAgICByZXR1cm4gbXVsKGEsIGludiwgbW9kKTsKfQoKbGwgY2F0YWxhbl9tb2QoaW50IG4pIHsKICAgIGxsIG51bSA9IGZhY3RfbW9kKG4gKiAyKTsKICAgIGxsIGRlbiA9IG11bChmYWN0X21vZChuICsgMSksIGZhY3RfbW9kKG4pLCBNT0QpOwogICAgbGwgcmVzID0gbW9kX2RpdihudW0sIGRlbiwgTU9EKTsKICAgIHJldHVybiByZXM7Cn0KCnZvaWQgc3ViNSgpIHsKICAgIGNvdXQgPDwgY2F0YWxhbl9tb2QobikgPDwgZW5kbDsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIGNpbiA+PiBuID4+IG07CiAgICBsaW0gPSBuICogMjsKICAgIGZvcncgKGksIDEsIGxpbSkgY2luID4+IGFbaV07CgogICAgaWYgKG4gPD0gMmUzKSBzdWI0KCk7CiAgICBlbHNlIHN1YjUoKTsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksIGNpbi50aWUobnVsbHB0cik7CiAgICBzcmFuZCh0aW1lKE5VTEwpKTsKICAgICNkZWZpbmUgbmFtZSAidGVzdCIKICAgIC8qCiAgICBpZiAoZm9wZW4obmFtZSIuSU5QIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICAqLwogICAgYm9vbCB0ZXN0Q2FzZSA9IGZhbHNlOwogICAgaW50IG51bVRlc3QgPSAxOwovLyAgICBjaW4gPj4gbnVtVGVzdDsKICAgIGZvcncgKGksIDEsIG51bVRlc3QpIHsKICAgICAgICBpZiAodGVzdENhc2UpIGNvdXQgPDwgIkNhc2UgIiA8PCBpIDw8ICI6ICI7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==