#include<bits/stdc++.h> using namespace std; #define ll long long const ll MAXN = 5e5 + 7; const ll base = 1 << 19; const ll wmax = 5e5; vector<ll> tab[MAXN]; stack<pair<ll, ll>> stosik; ll tree[base*2]; void push(ll cel, ll val){ cel += base-1; tree[cel] = max(tree[cel], val); while(cel > 0){ cel /= 2; tree[cel] = max(tree[cel*2], tree[cel*2+1]); } } ll query(ll w, ll pocz, ll kon, ll l, ll r){ if(r < l){ return -1; } if(r < pocz || kon < l){ return -1; } else if(pocz <= l && r <= kon){ return tree[w]; } else{ ll mid = (l+r)/2; ll left = w*2; ll right = w*2+1; return max(query(left, pocz, kon, l, mid), query(right, pocz, kon, mid+1, r)); } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); ll n; ll c; cin >> n >> c; for(ll i = 1; i <= n ; i++){ ll a, w; cin >> a >> w; tab[a].push_back(w); } for(ll i = 1; i <= wmax ; i++){ for(ll w : tab[i]){ ll dp = max(query(1, 1, w-1, 1, base), query(1, w+1, wmax, 1, base))-c; dp = max(dp, query(1, w, w, 1, base)); dp += i; stosik.push({w, dp}); } while(!stosik.empty()){ pair<ll, ll> para = stosik.top(); stosik.pop(); push(para.first, para.second); } } cout << query(1, 1, wmax, 1, base) << "\n"; 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 | #include<bits/stdc++.h> using namespace std; #define ll long long const ll MAXN = 5e5 + 7; const ll base = 1 << 19; const ll wmax = 5e5; vector<ll> tab[MAXN]; stack<pair<ll, ll>> stosik; ll tree[base*2]; void push(ll cel, ll val){ cel += base-1; tree[cel] = max(tree[cel], val); while(cel > 0){ cel /= 2; tree[cel] = max(tree[cel*2], tree[cel*2+1]); } } ll query(ll w, ll pocz, ll kon, ll l, ll r){ if(r < l){ return -1; } if(r < pocz || kon < l){ return -1; } else if(pocz <= l && r <= kon){ return tree[w]; } else{ ll mid = (l+r)/2; ll left = w*2; ll right = w*2+1; return max(query(left, pocz, kon, l, mid), query(right, pocz, kon, mid+1, r)); } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); ll n; ll c; cin >> n >> c; for(ll i = 1; i <= n ; i++){ ll a, w; cin >> a >> w; tab[a].push_back(w); } for(ll i = 1; i <= wmax ; i++){ for(ll w : tab[i]){ ll dp = max(query(1, 1, w-1, 1, base), query(1, w+1, wmax, 1, base))-c; dp = max(dp, query(1, w, w, 1, base)); dp += i; stosik.push({w, dp}); } while(!stosik.empty()){ pair<ll, ll> para = stosik.top(); stosik.pop(); push(para.first, para.second); } } cout << query(1, 1, wmax, 1, base) << "\n"; return 0; } |