#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
long long s;
cin >> n >> s;
vector<long long> x(n + 1);
vector<int> p(n + 1);
vector<vector<long long> > chains;
for(int i = 1; i <= n; i++){
cin >> x[i] >> p[i];
if(p[i] == 0){
chains.push_back(vector<long long>());
chains.back().push_back(x[i]);
}
else{
chains.back().push_back(x[i]);
}
}
vector<vector<pair<long long, long long> > > segs(chains.size());
for(int c = 0; c < (int)chains.size(); c++){
int m = chains[c].size();
int i = 0;
while(i < m){
long long sum = 0;
long long mn = 0;
bool done = false;
for(int j = i; j < m; j++){
sum += chains[c][j];
mn = min(mn, sum);
if(sum > 0){
long long need = -mn;
long long gain = sum;
segs[c].push_back({need, gain});
i = j + 1;
done = true;
break;
}
}
if(!done){
break;
}
}
}
priority_queue<tuple<long long, long long, int, int>, vector<tuple<long long, long long, int, int> >, greater<tuple<long long, long long, int, int> > > pq;
for(int c = 0; c < (int)segs.size(); c++){
if(!segs[c].empty()){
long long need = segs[c][0].first;
long long gain = segs[c][0].second;
pq.push({need, gain, c, 0});
}
}
long long res = s;
while(!pq.empty()){
auto [need, gain, c, idx] = pq.top();
if(need > res){
break;
}
pq.pop();
res += gain;
int nxt = idx + 1;
if(nxt < (int)segs[c].size()){
long long nneed = segs[c][nxt].first;
long long ngain = segs[c][nxt].second;
pq.push({nneed, ngain, c, nxt});
}
}
cout << res - s << "\n";
}