#include<bits/stdc++.h>
using namespace std;
struct Node{
long long need;
long long gain;
int left;
int right;
int dist;
int unlock;
};
vector<Node> nodes;
int mergeHeap(int a, int b){
if(a == 0){
return b;
}
if(b == 0){
return a;
}
if(nodes[a].need > nodes[b].need){
swap(a, b);
}
nodes[a].right = mergeHeap(nodes[a].right, b);
if(nodes[nodes[a].left].dist < nodes[nodes[a].right].dist){
swap(nodes[a].left, nodes[a].right);
}
nodes[a].dist = nodes[nodes[a].right].dist + 1;
return a;
}
int popHeap(int a){
int l = nodes[a].left;
int r = nodes[a].right;
nodes[a].left = 0;
nodes[a].right = 0;
nodes[a].dist = 1;
return mergeHeap(l, r);
}
int makeNode(long long need, long long gain, int unlock){
Node cur;
cur.need = need;
cur.gain = gain;
cur.left = 0;
cur.right = 0;
cur.dist = 1;
cur.unlock = unlock;
nodes.push_back(cur);
return (int)nodes.size() - 1;
}
int main(){
int n;
long long s;
cin >> n >> s;
vector<long long> x(n + 1);
vector<int> p(n + 1);
for(int i = 1; i <= n; i++){
cin >> x[i] >> p[i];
}
nodes.push_back({0, 0, 0, 0, 0, 0});
vector<int> heap(n + 1, 0);
int global = 0;
for(int i = n; i >= 1; i--){
int curHeap = heap[i];
int ret = 0;
if(x[i] > 0){
ret = makeNode(0, x[i], curHeap);
}
else if(x[i] == 0){
ret = curHeap;
}
else{
long long sum = x[i];
long long need = -x[i];
while(sum < 0 && curHeap != 0){
int id = curHeap;
curHeap = popHeap(curHeap);
need = max(need, nodes[id].need - sum);
sum += nodes[id].gain;
curHeap = mergeHeap(curHeap, nodes[id].unlock);
}
if(sum >= 0){
if(sum == 0 && curHeap == 0){
ret = 0;
}
else{
ret = makeNode(need, sum, curHeap);
}
}
else{
ret = 0;
}
}
if(p[i] == 0){
global = mergeHeap(global, ret);
}
else{
heap[p[i]] = mergeHeap(heap[p[i]], ret);
}
}
long long res = s;
while(global != 0){
int id = global;
if(nodes[id].need > res){
break;
}
global = popHeap(global);
res += nodes[id].gain;
global = mergeHeap(global, nodes[id].unlock);
}
cout << res - s << "\n";
}