// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

#define int long long

const int mod=1e9+7;

const int N=2e5+5;

int n,A,B,cnt,ans1,ans2,num,c[N],w[N],jc[N],inv[N],fa[N],a[N],id[N],sum[N],xu[N];

vector<int>b[N];

struct node{

	int val,id;

}xjh[N];

char buf[1<<21],*p1=buf,*p2=buf;

inline int gc()

{

	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;

}

inline int read()

{

	int res=0,f=0;

	char c;

	c=gc();

	while(!isdigit(c))

	{

		if(c=='-')f=1;

		c=gc();

	}

	while(isdigit(c))

	{

		res=res*10+c-48;

		c=gc();

	}

	if(f)return -res;

	else return res;

}

int find(int x)

{

	if(fa[x]==x)return x;

	fa[x]=find(fa[x]);

	return fa[x];

}

int kuai(int a,int b)

{

	if(b==1)return a;

	int x=kuai(a,b/2);

	if(b%2==0)return x*x%mod;

	else return x*x%mod*a%mod;

}

bool cmp(node a,node b)

{

	return a.val<b.val;

}

signed main()

{

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

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

	{

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

		xu[i]=c[i];

	}

	sort(xu+1,xu+n+1);

	int len=unique(xu+1,xu+n+1)-xu-1;

	for(int i=1;i<=len;i++)xjh[i].val=1e18;

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

	{

		c[i]=lower_bound(xu+1,xu+len+1,c[i])-xu;

		if(xjh[c[i]].val>w[i])

		{

			xjh[c[i]].val=w[i];

			xjh[c[i]].id=i;

		}

	}

	for(int i=1;i<=n;i++)fa[i]=i;

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

		if(w[i]+xjh[c[i]].val<=A)fa[find(i)]=xjh[c[i]].id;

	sort(xjh+1,xjh+len+1,cmp);

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

		if(c[i]!=c[xjh[1].id]&&w[i]+xjh[1].val<=B)fa[find(i)]=xjh[1].id;

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

		if(c[i]==c[xjh[1].id]&&w[i]+xjh[1].val<=A)fa[find(i)]=xjh[1].id;

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

		if(c[i]==c[xjh[1].id]&&w[i]+xjh[2].val<=B)fa[find(i)]=xjh[1].id;

	jc[0]=1ll;

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

	inv[1]=1ll;

	for(int i=2;i<=n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;

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

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

	{

		if(!a[find(i)])

		{

			id[find(i)]=++cnt;

			a[find(i)]=1;

		}

		sum[id[find(i)]]++;

		b[id[find(i)]].push_back(c[i]);

	}

	for(int i=1;i<=cnt;i++)sort(b[i].begin(),b[i].end());

	ans1=1ll;

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

	{

		ans2=jc[sum[i]];

		num=1ll;

		for(int j=1;j<sum[i];j++)

			if(b[i][j]!=b[i][j-1])

			{

				ans2=ans2*inv[num]%mod;

				num=1ll;

			}

			else num++;

		

		ans2=ans2*inv[num]%mod;

		ans1=ans1*ans2%mod;

	}

	cout<<ans1;

	return 0;

}

/*

3 7 5

1 3

1 4

2 2

*/

// Faster C++ solution for the same problem (measured speedup: 2.4956430874867377x):
#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);

}