#include<bits/stdc++.h>
using namespace std;
void read(long long &x)
{
x=0;long long f=0;char ch=getchar();
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return;
}
const long long maxn = 100005;
long long ll[maxn],rr[maxn],k,t,l,r,a[maxn];
long long minn,maxx;
bool qieke(__int128 x){
if(x == 0) return 1;
for(int i=1;i<=k;++i){
if(x * ll[i] > a[i]) return 0;
}
//一定行了看来是
long long nw = 0,duo = 0;
for(int i=1;i<=k;++i){
if(x * rr[i] >= a[i]){
nw += a[i]/x;
duo += a[i]%x;
}
else{
nw += rr[i];
}
}
nw += duo/x,duo %= x;
return nw >= l;
}
int main()
{
read(k),read(l),read(r);
minn = 0,maxx = 1e10;
for(int i=1;i<=k;++i) read(a[i]);
for(int i=1;i<=k;++i)
read(ll[i]),read(rr[i]);
int ans1 = 0,ans2 = 0;
for(int i=1;i<=k;++i){
ans1 += ll[i];
ans2 += min(rr[i],a[i]);
}
for(int i=1;i<=k;++i){
if(a[i] < ll[i]){
printf("0");
return 0;
}
}
if(ans1 > r || ans2 < l){
printf("0");
return 0;
}
long long zuo = 0,you = 1e18;
while(zuo < you){
long long mid = (zuo + you)/2+1;
if(qieke(mid)) zuo = mid ;
else you = mid - 1;
}
you = max(you,1ll*0);
printf("%lld",you);
}
//二分答案。
//考虑每一个东西的集合的区间。
//然后呢?取一个交集。然后呢?
//然后每一次大概就选多少个来补充一下。
//然后再二分答案。
//不对,应该是尽可能平均分配一下。
//求出合法区间之后平均分配一下。
//回来之后直接平均分配
/*
4 10 10
4 20 10 6
1 2
3 5
2 4
0 2
*/