#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
const int INF = 1e15 + 7;
const int MAXN = 5e5 + 7;
const int MAX = 5e5;
const int base = 1<<20;
int dp[MAXN];
pair<int, int> tab[MAXN];
int tree[2 * base];
void update(int pos, int val){
pos += base;
tree[pos] = max(tree[pos], val);
pos /= 2;
while(pos > 1){
tree[pos] = max(tree[2 * pos], tree[2 * pos + 1]);
pos /= 2;
}
}
int query(int a, int b){
if(a > b) return 0;
a += base;
b += base;
int ans = max(tree[a], tree[b]);
while(a/2 != b/2){
if(a%2 == 0) ans = max(ans, tree[a + 1]);
if(b%2 == 1) ans = max(ans, tree[b - 1]);
a /= 2; b /= 2;
}
return ans;
}
void solve(){
int n, c;
cin >> n >> c;
for(int i = 1; i <= n; i++) cin >> tab[i].fi >> tab[i].se;
sort(tab + 1, tab + n + 1);
for(int i = 1; i <= n; i++){
dp[i] = max(tab[i].fi, query(tab[i].se, tab[i].se) + tab[i].fi);
dp[i] = max(dp[i], query(1, tab[i].se - 1) + tab[i].fi - c);
dp[i] = max(dp[i], query(tab[i].se + 1, MAX) + tab[i].fi - c);
if(tab[i].fi != tab[i + 1].fi){
int j = i;
while(j > 0 && tab[j].fi == tab[i].fi){
update(tab[j].se, dp[j]);
j--;
}
}
}
int mx = 0;
for(int i = 1; i <= n; i++) mx = max(mx, dp[i]);
cout << mx << '\n';
}
bool multi = 0;
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t = 1;
if(multi) cin >> t;
while(t--) solve();
return 0;
}
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 87 88 89 90 91 92 93 94 95 96 97 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #define int long long #define pii pair<int, int> #define fi first #define se second const int INF = 1e15 + 7; const int MAXN = 5e5 + 7; const int MAX = 5e5; const int base = 1<<20; int dp[MAXN]; pair<int, int> tab[MAXN]; int tree[2 * base]; void update(int pos, int val){ pos += base; tree[pos] = max(tree[pos], val); pos /= 2; while(pos > 1){ tree[pos] = max(tree[2 * pos], tree[2 * pos + 1]); pos /= 2; } } int query(int a, int b){ if(a > b) return 0; a += base; b += base; int ans = max(tree[a], tree[b]); while(a/2 != b/2){ if(a%2 == 0) ans = max(ans, tree[a + 1]); if(b%2 == 1) ans = max(ans, tree[b - 1]); a /= 2; b /= 2; } return ans; } void solve(){ int n, c; cin >> n >> c; for(int i = 1; i <= n; i++) cin >> tab[i].fi >> tab[i].se; sort(tab + 1, tab + n + 1); for(int i = 1; i <= n; i++){ dp[i] = max(tab[i].fi, query(tab[i].se, tab[i].se) + tab[i].fi); dp[i] = max(dp[i], query(1, tab[i].se - 1) + tab[i].fi - c); dp[i] = max(dp[i], query(tab[i].se + 1, MAX) + tab[i].fi - c); if(tab[i].fi != tab[i + 1].fi){ int j = i; while(j > 0 && tab[j].fi == tab[i].fi){ update(tab[j].se, dp[j]); j--; } } } int mx = 0; for(int i = 1; i <= n; i++) mx = max(mx, dp[i]); cout << mx << '\n'; } bool multi = 0; signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; if(multi) cin >> t; while(t--) solve(); return 0; } |
English