#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define L long long
#define MP make_pair
#define REP(i, n) for(int i = 0; i < n; ++i)
#define REPR(i, n) for(int i = n - 1; i >= 0; --i)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define FORR(i, a, b) for(int i = b - 1; i >= a; --i)
#define EB emplace_back
#define ST first
#define ND second
#define S size
#define RS resize
template<class T> using P = pair<T, T>;
template<class T> using V = vector<T>;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
L c;
cin >> n >> c;
int d = 500001;
V<V<int>> blocks(d);
REP(i, n) {
int a, w;
cin >> a >> w;
blocks[a].EB(w);
}
V<L> res(d);
set<pair<L, int>> res_s;
REP(i, d) {
res_s.insert(MP(0LL, 0));
}
REP(a, d) {
V<pair<L, int>> new_res, old_res;
for (int w : blocks[a]) {
L r = max(res[w], prev(res_s.end())->ST - c) + a;
new_res.EB(MP(r, w));
old_res.EB(MP(res[w], w));
}
REP(i, int(new_res.size())) {
auto& [r, w] = new_res[i];
res[w] = r;
res_s.erase(old_res[i]);
res_s.insert(MP(r, w));
}
}
cout << prev(res_s.end())->ST << '\n';
}
// g++ -std=c++20 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG -O3 wie.cpp -o wie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; L c; cin >> n >> c; int d = 500001; V<V<int>> blocks(d); REP(i, n) { int a, w; cin >> a >> w; blocks[a].EB(w); } V<L> res(d); set<pair<L, int>> res_s; REP(i, d) { res_s.insert(MP(0LL, 0)); } REP(a, d) { V<pair<L, int>> new_res, old_res; for (int w : blocks[a]) { L r = max(res[w], prev(res_s.end())->ST - c) + a; new_res.EB(MP(r, w)); old_res.EB(MP(res[w], w)); } REP(i, int(new_res.size())) { auto& [r, w] = new_res[i]; res[w] = r; res_s.erase(old_res[i]); res_s.insert(MP(r, w)); } } cout << prev(res_s.end())->ST << '\n'; } // g++ -std=c++20 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG -O3 wie.cpp -o wie |
English