// Original C++ solution (slower):
#include<bits/stdc++.h>

#define R register int

#define ll long long 

using namespace std;

const int N=200002;

const int mod=1e9+7;

int n,x,y,len,ans,tot,jic[N],inv[N],w[N],c[N],Mnq[N],Mnh[N];

struct Qs{int sz,vl;}Q[N];

int cmp(const Qs &x,const Qs &y){return x.vl<y.vl;}

vector<int>G[N];

int Qpow(R x,R y){

    R ans=1,bas=x;

    while(y){

        if(y&1)ans=1ll*ans*bas%mod;

        bas=1ll*bas*bas%mod,y>>=1;

    }return ans;

}

int gi(){

    R x=0,k=1;char c=getchar();

    while((c<'0'||c>'9')&&c!='-')c=getchar();

    if(c=='-')k=-1,c=getchar();

    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();

    return x*k;

}

int main(){

    n=gi(),x=gi(),y=gi(),Mnq[0]=Mnh[n+1]=2e9;

    inv[0]=inv[1]=jic[0]=jic[1]=1;

    for(R i=2;i<=n;++i)jic[i]=1ll*i*jic[i-1]%mod;

    inv[n-1]=Qpow(jic[n-1],mod-2);

    for(R i=n-2;i>=2;--i)inv[i]=1ll*inv[i+1]*(i+1)%mod;

    for(R i=1;i<=n;++i)

        c[i]=gi(),w[i]=gi(),G[c[i]].push_back(w[i]);

    for(R i=1;i<=n;++i)sort(G[i].begin(),G[i].end());

    for(R i=1,j;i<=n;++i){

        Mnq[i]=Mnq[i-1],j=G[i].size();

        if(j)Mnq[i]=min(Mnq[i],G[i][0]);

    }

    for(R i=n,j;i>=1;--i){

        Mnh[i]=Mnh[i+1],j=G[i].size();

        if(j)Mnh[i]=min(Mnh[i],G[i][0]);

    }

    for(R i=1,lim;i<=n;++i){

        lim=G[i].size();

        if(!lim)continue;Q[++tot].vl=G[i][0],Q[tot].sz=1;

        for(R j=1;j<lim;++j)

            if(G[i][0]+G[i][j]<=x||G[i][j]+min(Mnq[i-1],Mnh[i+1])<=y)

                Q[tot].sz++;

            else break;

    }

    sort(Q+1,Q+tot+1,cmp),len=Q[1].sz,ans=inv[Q[1].sz];

    if(tot==1)return puts("1"),0;

    for(R i=2;i<=tot;++i){

        if(Q[i].vl+Q[1].vl<=y)

            len+=Q[i].sz,ans=1ll*ans*inv[Q[i].sz]%mod;

        else break;

    }

    cout<<1ll*jic[len]*ans%mod<<endl;

    return 0;

}


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

#define mod 1000000007ll

using namespace std;

struct edge

{

	int to;

	int nxt;

}e[3000010];

int color[200010],head[200010],pos[200010];

int cnt[200010],tot;

long long w[200010],minn[200010];

long long fac[200010],rfac[200010];

int v[200010];

int n,minnum,minnum2;

long long X,Y,min1,min2,ans;

long long qpow(long long a,long long b)

{

	long long ans = 1,res = a;

	while(b)

	{

		if(b&1)ans = (ans * res) % mod;

		res *= res;

		res %= mod;

		b >>= 1;

	}

	return ans;

}

long long C(long long n,long long k)

{

	return  fac[n] * rfac[k] % mod * rfac[n - k] % mod;

}

void addedge(int x,int y)

{

	e[++tot].nxt = head[x];

	e[tot].to = y;

	head[x] = tot;

}

void add(int x,int y)

{

	addedge(x,y);

	addedge(y,x);

}

void dfs(int x)

{

	v[x] = 1;

	for(int i = head[x]; i; i = e[i].nxt)

	{

		if(!v[e[i].to])

			dfs(e[i].to);

	}

}

int main()

{

	scanf("%d%lld%lld",&n,&X,&Y);

	fac[0] = 1;

	for(int i = 1; i <= n;i++)scanf("%d%lld",&color[i],&w[i]);

	for(int i = 1;i <= n;i++)fac[i] = (i * fac[i - 1]) % mod,minn[i] = 2147483647ll;

	rfac[n] = qpow(fac[n],mod - 2);

	for(int i = n; i > 0; i--)rfac[i - 1] = (i * rfac[i]) % mod;

	for(int i = 1; i <= n; i++)

	{

		if(w[i] < minn[color[i]])

		{

			minn[color[i]] = w[i];

			pos[color[i]] = i;

		}

	}

	for(int i = 1; i <= n; i++)

	{

		if(i != pos[color[i]] && w[i] + minn[color[i]] <= X)

		{

			add(i,pos[color[i]]);

		}

	}

	min1 = min2 = 2147483647ll;

	for(int i = 1; i <= n; i++)

	{

		if(w[i] < min1)

		{

			min1 = w[i];

			minnum = i;

		}

	}

	for(int i = 1; i <= n; i++)

	{

		if(w[i] <= min2 && color[i] != color[minnum])

		{

			min2 = w[i];

			minnum2 = i;

		}

	}

	for(int i = 1; i <= n; i++)

	{

		if(i == minnum)continue;

		if(color[i] != color[minnum] && w[i] + w[minnum] <= Y)

		{

			add(i,minnum);

		}

		if(minnum2 && color[i] != color[minnum2] && w[i] + w[minnum2] <= Y)

		{

			add(i,minnum2);

		}

	}

	dfs(minnum);

	long long tot = 0;

	for(int i = 1; i <= n; i++)

	{

		if(v[i])

		{

			++tot;

			cnt[color[i]]++;

		}

	}

	ans = 1;

	for(int i = 1; i <= n; i++)

	{

		if(cnt[i])

		{

			ans = (ans * C(tot,cnt[i])) % mod;

			tot -= cnt[i];

		}

	}

	printf("%lld",ans);

	return 0;

}

// Fastest known solution for this problem: