#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int MAX(int a, int b) {return (a > b) ? a : b;}
int bin(vector<pair<int, int>> a, int x) {
int l = 0, r = a.size();
while (l < r) {
int m = (l + r) / 2;
if (a[m].first <= x) {
r = m;
} else {
l = m + 1;
}
}
return l;
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int n, c;
cin >> n >> c;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; ++i) {
cin >> v[i].first >> v[i].second;
}
reverse(v.begin(), v.end());
unordered_map<int, vector<pair<int, int>>> mp;
vector<pair<int, int>> dp;
int ans = 0;
for (auto &it : v) {
int a = it.first;
int w = it.second;
int cur = a;
auto &l = mp[w];
int samew = 0;
if (!l.empty()) {
int x = bin(l, a);
if (x > 0) {
samew = l[x - 1].second;
}
}
int diffw = 0;
int gx = bin(dp, a);
if (gx > 0) {
diffw = dp[gx - 1].second;
}
int diff = MAX(diffw - c, 0);
cur += MAX(samew, diff);
ans = MAX(ans, cur);
if (l.empty() || a < l.back().first) {
int neoans = cur;
if (!l.empty()) {
neoans = MAX(neoans, l.back().second);
l.pop_back();
}
l.push_back({a, neoans});
} else {
l.back().second = MAX(l.back().second, cur);
}
if (dp.empty() || a < dp.back().first) {
int ngx = cur;
if (!dp.empty()) {
ngx = MAX(ngx, dp.back().second);
dp.pop_back();
}
dp.push_back({a, ngx});
} else {
dp.back().second = MAX(dp.back().second, cur);
}
}
cout << ans;
}
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <bits/stdc++.h> using namespace std; #define int long long inline int MAX(int a, int b) {return (a > b) ? a : b;} int bin(vector<pair<int, int>> a, int x) { int l = 0, r = a.size(); while (l < r) { int m = (l + r) / 2; if (a[m].first <= x) { r = m; } else { l = m + 1; } } return l; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, c; cin >> n >> c; vector<pair<int, int>> v(n); for (int i = 0; i < n; ++i) { cin >> v[i].first >> v[i].second; } reverse(v.begin(), v.end()); unordered_map<int, vector<pair<int, int>>> mp; vector<pair<int, int>> dp; int ans = 0; for (auto &it : v) { int a = it.first; int w = it.second; int cur = a; auto &l = mp[w]; int samew = 0; if (!l.empty()) { int x = bin(l, a); if (x > 0) { samew = l[x - 1].second; } } int diffw = 0; int gx = bin(dp, a); if (gx > 0) { diffw = dp[gx - 1].second; } int diff = MAX(diffw - c, 0); cur += MAX(samew, diff); ans = MAX(ans, cur); if (l.empty() || a < l.back().first) { int neoans = cur; if (!l.empty()) { neoans = MAX(neoans, l.back().second); l.pop_back(); } l.push_back({a, neoans}); } else { l.back().second = MAX(l.back().second, cur); } if (dp.empty() || a < dp.back().first) { int ngx = cur; if (!dp.empty()) { ngx = MAX(ngx, dp.back().second); dp.pop_back(); } dp.push_back({a, ngx}); } else { dp.back().second = MAX(dp.back().second, cur); } } cout << ans; } |
English