#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 1e5 + 7;
const ll inf = 1e18 + 7;
vector<int> val;
ii a[mxN];
ll tree[mxN * 4];
void Build(int j = 1, int l = 0, int r = val.size() - 1)
{
tree[j] = -inf;
if (l == r)
return;
int mid = (l + r) / 2;
Build(j * 2, l, mid);
Build(j * 2 + 1, mid + 1, r);
}
void Upd(int u, int v, ll nw, int j = 1, int l = 0, int r = val.size() - 1)
{
if (u > val[r] || val[l] > v)
return;
if (u <= val[l] && val[r] <= v)
{
tree[j] = max(tree[j], nw);
return;
}
int mid = (l + r) / 2;
Upd(u, v, nw, j * 2, l, mid);
Upd(u, v, nw, j * 2 + 1, mid + 1, r);
}
ll Get(int vt, int j = 1, int l = 0, int r = val.size() - 1)
{
if (val[l] > vt || vt > val[r])
return -inf;
if (l == r)
return tree[j];
int mid = (l + r) / 2;
return max({Get(vt, j * 2, l, mid), Get(vt, j * 2 + 1, mid + 1, r), tree[j]});
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen(task".INP", "r", stdin);
//freopen(task".OUT", "w", stdout);
int l, r, mx, n;
ll cost;
cin >> l >> r >> mx >> cost >> n;
for (int i = 1; i <= n; i++)
cin >> a[i].fi >> a[i].se;
a[0].fi = l;
a[n + 1].fi = r;
n++;
for (int i = 0; i <= n; i++)
val.push_back(a[i].fi % mx);
sort(val.begin(), val.end());
val.erase(unique(val.begin(), val.end()),val.end());
Build();
for (int i = 0; i < n; i++)
{
ll dp = Get(a[i].fi % mx) - a[i].fi / mx * cost;
if (!i)
dp = 0;
dp += a[i].se;
Upd(0, a[i].fi % mx, dp + (a[i].fi / mx) * cost);
Upd(a[i].fi % mx + 1, mx - 1, dp + (a[i].fi / mx - 1) * cost);
}
cout << Get(a[n].fi % mx) - a[n].fi / mx * cost;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |