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

#define inf 0x3f3f3f3f

#define int long long

#define mod 1000000007

#define N 200007

using namespace std;

inline int read(){

	int x=0,w=0;char ch=getchar();

	while (!isdigit(ch))w|=ch=='-',ch=getchar();

	while (isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();

	return w?-x:x;

}

int ksm(int x,int k){

    int res=1;

    while(k){

        if(k&1)res=res*x%mod;

        x=x*x%mod;

        k>>=1;

    }

    return res;

}

int mn[N],c[N],w[N],cnt[N],jc[N],inv[N],n,A,B,ans;

signed main(){

//	freopen("keep.in", "r", stdin); freopen("keep.out", "w", stdout); 

	n=read(),A=read(),B=read();

    memset(mn,0x3f,sizeof(mn));

    jc[0]=1;

    for(int i=1;i<=n;i++)jc[i]=jc[i-1]*i%mod;

    inv[n]=ksm(jc[n],mod-2);

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

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

		c[i]=read(),w[i]=read();

		mn[c[i]]=min(mn[c[i]],w[i]);//颜色集合最小值 

		++cnt[c[i]];//集合元素个数 

	}

	int Mn=1,mnn=inf;

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

		if (mn[i]<mn[Mn])

			Mn=i;//找出全局最小值的颜色 

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

		if (i!=Mn)

			mnn=min(mn[i],mnn);//找出除全局最小值的集合以外的所有数的最小值 

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

		if (w[i]!=mn[c[i]]&&w[i]+mn[c[i]]<=A)continue;//如果这个值不是所在集合的最小值但它与所在集合的最小值的和小于A，那么它是有意义的 

		if (c[i]!=Mn&&w[i]+mn[Mn]<=B)continue;//如果这个值不在全局最小值所在的集合中 ，但它与全局最小值的和小于B，那么它是有意义的

		if (c[i]==Mn&&w[i]+mnn<=B)continue;//如果它在全局最小值所在的集合中，且它与除全局最小值的集合以外的所有数的最小值的和小于B，那么它是有意义的 

		--cnt[c[i]];//如果它不符合以上条件，那么它的存在是没有意义的

	}

	int num=cnt[Mn];

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

		if (i!=Mn&&mn[Mn]+mn[i]<=B)//如果这种颜色存在且它不是全局最小值所在的集合 

			num+=cnt[i];

	ans=1;

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

        if(mn[i]!=inf&&(i==Mn||mn[i]+mn[Mn]<=B))

            ans=ans*inv[cnt[i]]%mod;

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

		ans=ans*i%mod;//这里是求有重复元素的排列种数 

	printf("%lld",ans);

}

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

#define swap mswap

#define max(a,b) (a>b?a:b)

#define min(a,b) (a<b?a:b)

#define int long long 

using namespace std;

const int big=0x7fffffffffffff;

void swap(int &x,int &y)

{

    x^=y^=x^=y;

}

void read(int &x)

{

    x=0;

    char ch=getchar();

    int pd=1;

    while(ch<'0'||ch>'9')

    {

        if(ch=='-')

        {

            pd=-pd;

        }

        ch=getchar();

    }

    while(ch<='9'&&ch>='0')

    {

        x=x*10+ch-'0';

        ch=getchar();

    }

    x*=pd;

}

void write(const int &x)

{

    char f[100001];

    int s=0;

    int tmp=x;

    if(tmp==0)

    {

        putchar('0');

        return;

    }

    if(tmp<0)

    {

        tmp=-tmp;

        putchar('-');

    }

    while(tmp>0)

    {

        f[s++]=tmp%10+'0';

        tmp/=10;

    }

    while(s>0)

    {

        putchar(f[--s]);

    }

}



const int mod=1e9+7;

const int N=2e5+10;

int jie[N],ni[N],n,A,B;

int c[N],w[N],minn[N],cnt[N];

int sum,ans=1;

int ksm(int x,int y)

{

	int ans=1;

	while(y)

	{

		if(y&1)

		{

			ans=(ans*x)%mod;

		}

		x=(x*x)%mod;

		y>>=1;

	}

	return ans%mod;

}

int zuhe(int x,int y)

{

	return ((jie[x]*ni[y])%mod*ni[x-y])%mod;

}

signed main()

{

//	freopen("keep.in","r",stdin);

//	freopen("keep.out","w",stdout);

	jie[0]=1;

	read(n);

	read(A);

	read(B);

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

	{

		read(c[i]);

		read(w[i]);

		minn[i]=big;

		cnt[c[i]]++;

		jie[i]=jie[i-1]*i%mod;

	}

	

	ni[n]=ksm(jie[n],mod-2);

	for(register int i=n-1;i>=0;--i)

	{

		ni[i]=(ni[i+1]*(i+1))%mod;

//		cout<<ni[i]<<endl;

	}

	

//	cout<<zuhe(3,1)<<"   QWQ"<<endl;

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

	{

		minn[c[i]]=min(minn[c[i]],w[i]);

	}

	int min1=0,allmin=0;

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

	{

		if(minn[i]!=big)

		{

			if(!min1||minn[i]<minn[min1])

			{

				allmin=min1;

				min1=i;

			}

			else 

			{

				if(!allmin||minn[i]<minn[allmin])

				{

					allmin=i;

				}

			}

		}

	}

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

	{

		if(minn[c[i]]!=w[i]&&w[i]+minn[c[i]]<=A)continue;

		if(c[i]==min1&&w[i]+minn[allmin]<=B)continue;

		if(c[i]!=min1&&w[i]+minn[min1]<=B)continue;

		cnt[c[i]]--;

	}

	sum=cnt[min1];

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

	{

		if(i!=min1&&minn[i]+minn[min1]<=B)

		{

			sum+=cnt[i];

//			cout<<sum<<endl;

			ans=(ans*zuhe(sum,cnt[i]))%mod;

//			cout<<ans<<endl;

		}

	}

	write(ans);

}


// Fastest known solution for this problem: