#include<cstdio>
#include<queue>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#define N 800000+5
using namespace std;
struct g{
int cost;
int date;
}a[N];
int n;
int cmp(const void *a,const void *b){
return (*(struct g *)a).date>(*(struct g *)b).date?1:-1;
}
int main(){
int i;
while(scanf("%d",&n)==1){
for(i=0;i<n;i++)
scanf("%d%d",&a[i].cost,&a[i].date);
qsort(a,n,sizeof(a[0]),cmp);
priority_queue<int> q;
int ans=0;
for(i=0;i<n;i++){
if(ans+a[i].cost<=a[i].date){
ans+=a[i].cost;
q.push(a[i].cost);
}
else
if(ans+a[i].cost>a[i].date&&!q.empty()&&a[i].cost<q.top()){
ans+=a[i].cost;
q.push(a[i].cost);
}
if(ans>a[i].date){
ans-=q.top();
q.pop();
}
}
printf("%d\n",q.size());
}
return 0;
}
/*
用一个优先队列进行模拟(priority_queue)order的情况。
先按照截止日期due对Order进行从小到大的排序,用pass表示当前完成最多订单需要的最短的时间,
遍历Order,当pass + order[i].q <= order[i].d的时候,
表示可以正常完成该订单,进队,同时pass += order[i].q,
如果pass + order[i].q > order[i].d的时候,
则需要考虑order[i].q和队列中需要最长时间的订单之间的关系,
如果order[i].q较大,说明该订单不可能完成,否则入队,pass += order[i].q,
然后要减去队列中需要最长时间的订单(即队首),一直贪心,最后留在队列中的订单个数就是保留的订单个数。
*/
//