/*
codeforces,230A,A. Dragons
桐人需要击败n条龙,若力量大于龙的力量则能击败龙,否则会失败
初始时,桐人的力量为s,击败第i条龙后桐人的力量会增加y_i
第i条龙的力量是x_i
桐人可以按任意顺序与这n条龙对战
输入
s n
x_1 y_2
x_1 y_2
...
输出
若能打败输出YES,否则输出NO
*/
/*
获取
*/
#include <iostream>
#include <set>
#include <utility>
struct compare{
//返回值为true时表示第一个参数应该排在第二个参数之前
bool operator()(const std::pair<int,int>& a, const std::pair<int,int>& b) const{
if(a.first==b.first){
return a.second>b.second;
}
return a.first<b.first;
}
};
int main(){
int s,n;std::cin>>s>>n;
std::multiset<std::pair<int,int>,compare> dragons;
//标准库容器内部会将比较器作为常量对象来使用, 因此传入比较器的operator()必须是const
for(int i=0;i<n;i++){
//逐个获取输入
int strength,bonus;std::cin>>strength>>bonus;
if(strength<s){
//如果能打过这条龙就直接战斗获得力量成长
s+=bonus;
//将multiset中力量小于桐人的龙全部消灭并获取力量增长
while(!dragons.empty() && s>dragons.begin()->first){
s+=dragons.begin()->second;
dragons.erase(dragons.begin());
}
}else{
dragons.insert({strength,bonus});
}
}
if(dragons.empty()){
std::cout<<"YES\n";
}else{
std::cout<<"NO\n";
}
}