#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 1<<19;
int h[N], r[N];
ll dp[N];
ll drz[2 * N];
void Change(int v, ll x)
{
v += N;
while(v > 0)
{
drz[v] = max(drz[v], x);
v /= 2;
}
}
ll Query(int a, int b)
{
a += N - 1; b += N + 1;
ll ans = 0;
while(a / 2 != b / 2)
{
if(a % 2 == 0) ans = max(ans, drz[a + 1]);
if(b % 2 == 1) ans = max(ans, drz[b - 1]);
a /= 2; b /= 2;
}
return ans;
}
void Solve()
{
ll ans = 0LL;
int n, c;
cin >> n >> c;
for(int i = 1; i <= n; ++i)
{
cin >> h[i] >> r[i];
int j = i - 1;
if(h[i] > h[i - 1])
while(j > 0 && h[j] == h[i - 1])
{
Change(r[j], dp[j]);
--j;
}
dp[i] = max(Query(1, r[i] - 1), Query(r[i] + 1, N - 10)) - (ll)c;
dp[i] = max(dp[i], drz[r[i] + N]);
dp[i] += (ll)h[i];
ans = max(ans, dp[i]);
}
cout << ans << "\n";
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//int t; 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 | #include <bits/stdc++.h> using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; const ll I = 1000'000'000'000'000'000LL; const int II = 2'000'000'000; const ll M = 1000'000'007LL; const int N = 1<<19; int h[N], r[N]; ll dp[N]; ll drz[2 * N]; void Change(int v, ll x) { v += N; while(v > 0) { drz[v] = max(drz[v], x); v /= 2; } } ll Query(int a, int b) { a += N - 1; b += N + 1; ll ans = 0; while(a / 2 != b / 2) { if(a % 2 == 0) ans = max(ans, drz[a + 1]); if(b % 2 == 1) ans = max(ans, drz[b - 1]); a /= 2; b /= 2; } return ans; } void Solve() { ll ans = 0LL; int n, c; cin >> n >> c; for(int i = 1; i <= n; ++i) { cin >> h[i] >> r[i]; int j = i - 1; if(h[i] > h[i - 1]) while(j > 0 && h[j] == h[i - 1]) { Change(r[j], dp[j]); --j; } dp[i] = max(Query(1, r[i] - 1), Query(r[i] + 1, N - 10)) - (ll)c; dp[i] = max(dp[i], drz[r[i] + N]); dp[i] += (ll)h[i]; ans = max(ans, dp[i]); } cout << ans << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //int t; cin >> t; //while(t--) Solve(); return 0; } |
English