#line 1 "template/template.hpp" #include #if __has_include() #include #endif using namespace std; using int64 = long long; const int64 infll = (1LL << 62) - 1; const int inf = (1 << 30) - 1; struct IoSetup { IoSetup() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(10); cerr << fixed << setprecision(10); } } iosetup; template ostream& operator<<(ostream& os, const pair& p) { os << p.first << " " << p.second; return os; } template istream& operator>>(istream& is, pair& p) { is >> p.first >> p.second; return is; } template ostream& operator<<(ostream& os, const vector& v) { for (size_t i = 0; i < v.size(); i++) { os << v[i] << (i + 1 != v.size() ? " " : ""); } return os; } template istream& operator>>(istream& is, vector& v) { for (T& in : v) is >> in; return is; } template bool chmax(T1& a, T2 b) { return a < b && (a = b, true); } template bool chmin(T1& a, T2 b) { return a > b && (a = b, true); } template vector make_v(size_t a) { return vector(a); } template auto make_v(size_t a, Ts... ts) { return vector(ts...))>(a, make_v(ts...)); } template enable_if_t == 0> fill_v(T& t, const V& v) { t = v; } template enable_if_t != 0> fill_v(T& t, const V& v) { for (auto& e : t) fill_v(e, v); } template struct FixPoint : F { explicit FixPoint(F&& f) : F(std::forward(f)) {} template decltype(auto) operator()(Args&&... args) const { return F::operator()(*this, std::forward(args)...); } }; template decltype(auto) MFP(F&& f) { return FixPoint{std::forward(f)}; } #line 2 "structure/others/priority-sum-structure.hpp" #include #include #include #include #include template , typename RCompare = std::greater> struct PrioritySumStructure { std::size_t k; T sum; std::priority_queue, Compare> in, d_in; std::priority_queue, RCompare> out, d_out; PrioritySumStructure(int k) : k(k), sum(0) {} void modify() { while (in.size() - d_in.size() < k && !out.empty()) { auto p = out.top(); out.pop(); if (!d_out.empty() && p == d_out.top()) { d_out.pop(); } else { sum += p; in.emplace(p); } } while (in.size() - d_in.size() > k) { auto p = in.top(); in.pop(); if (!d_in.empty() && p == d_in.top()) { d_in.pop(); } else { sum -= p; out.emplace(p); } } while (!d_in.empty() && in.top() == d_in.top()) { in.pop(); d_in.pop(); } } T query() const { return sum; } T kth_element() { assert(0 < k && k <= size()); modify(); return in.top(); } void insert(T x) { in.emplace(x); sum += x; modify(); } void erase(T x) { assert(size()); if (!in.empty() && in.top() == x) { sum -= x; in.pop(); } else if (!in.empty() && RCompare()(in.top(), x)) { sum -= x; d_in.emplace(x); } else { d_out.emplace(x); } modify(); } void set_k(std::size_t kk) { k = kk; modify(); } std::size_t get_k() const { return k; } std::size_t size() const { return in.size() + out.size() - d_in.size() - d_out.size(); } }; template using MaximumSum = PrioritySumStructure, std::less>; template using MinimumSum = PrioritySumStructure, std::greater>; int main() { int N, K, X; cin >> N >> K >> X; MaximumSum< int64 > que{1}; int64 ret = -infll; for (int i = 0; i < N; i++) { int a; cin >> a; que.insert(a); que.set_k(min(i + 1, K)); chmax(ret, que.query() - 1ll * X * (i + 1)); } cout << ret << "\n"; }