// Witold Milewski
// PA 2025
#include <bits/stdc++.h>
#define int long long
#define i128 __int128_t
using namespace std;
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define FORB(i, b, a) for(int i=b; i>=a; --i)
#define sz(A) (int)(A.size())
#define ll long long
#define eb emplace_back
#define pb push_back
#define pi pair<int, int>
#define f first
#define s second
#define rs resize
#define V vector
V<V<pi>> kub;
const int base=(1<<19);
struct SegTree {
int T[2*base];
void update(int v, int x) {
v+=base;
T[v]=max(T[v], x);
v/=2;
while(v>=1) {
T[v]=max(T[2*v], T[2*v+1]);
v/=2;
}
}
int query(int a, int b) {
a+=base-1;
b+=base+1;
int res=0;
while(a/2 != b/2) {
if(a%2==0) res=max(res, T[a+1]);
if(b%2==1) res=max(res, T[b-1]);
a/=2; b/=2;
}
return res;
}
} AT;
int n, c;
signed main() {
cin.tie(0) -> ios_base::sync_with_stdio(0);
cin >> n >> c;
kub.rs(500007);
V<pi> A;
int a, w;
FOR(i, 1, n) {
cin >> a >> w;
A.pb({a, w});
}
reverse(A.begin(), A.end());
for(auto &[a, w] : A) {
kub[a].pb({a, w});
}
int WYN=0;
FORB(aa, 500000, 0) {
V<pi> odp;
for(auto &[a, w] : kub[aa]) {
int wyn = a+max(AT.query(w, w), max(AT.query(1, w-1), AT.query(w+1, base-1))-c);
odp.pb({w, wyn});
}
for(auto &[gdzie, wyn] : odp) {
AT.update(gdzie, wyn);
}
WYN=max(WYN, AT.T[1]);
}
cout << WYN << '\n';
}
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 | // Witold Milewski // PA 2025 #include <bits/stdc++.h> #define int long long #define i128 __int128_t using namespace std; #define FOR(i, a, b) for(int i=a; i<=b; ++i) #define FORB(i, b, a) for(int i=b; i>=a; --i) #define sz(A) (int)(A.size()) #define ll long long #define eb emplace_back #define pb push_back #define pi pair<int, int> #define f first #define s second #define rs resize #define V vector V<V<pi>> kub; const int base=(1<<19); struct SegTree { int T[2*base]; void update(int v, int x) { v+=base; T[v]=max(T[v], x); v/=2; while(v>=1) { T[v]=max(T[2*v], T[2*v+1]); v/=2; } } int query(int a, int b) { a+=base-1; b+=base+1; int res=0; while(a/2 != b/2) { if(a%2==0) res=max(res, T[a+1]); if(b%2==1) res=max(res, T[b-1]); a/=2; b/=2; } return res; } } AT; int n, c; signed main() { cin.tie(0) -> ios_base::sync_with_stdio(0); cin >> n >> c; kub.rs(500007); V<pi> A; int a, w; FOR(i, 1, n) { cin >> a >> w; A.pb({a, w}); } reverse(A.begin(), A.end()); for(auto &[a, w] : A) { kub[a].pb({a, w}); } int WYN=0; FORB(aa, 500000, 0) { V<pi> odp; for(auto &[a, w] : kub[aa]) { int wyn = a+max(AT.query(w, w), max(AT.query(1, w-1), AT.query(w+1, base-1))-c); odp.pb({w, wyn}); } for(auto &[gdzie, wyn] : odp) { AT.update(gdzie, wyn); } WYN=max(WYN, AT.T[1]); } cout << WYN << '\n'; } |
English