#include using namespace std; using ll = long long; template void range_increment(vector &d, int i, int j, int n) { if (i > j) { range_increment(d, i, n - 1, n); range_increment(d, 0, j, n); return; } d[i] += 1; d[j + 1] -= 1; }; static constexpr ll root = 62; static constexpr ll M0 = 998244353; static constexpr ll M1 = 1004535809; ll modpow(ll b, ll e, ll mod) { ll ans = 1; for (; e; b = b * b % mod, e /= 2) if (e & 1) ans = ans * b % mod; return ans; } template void ntt(vector &a) { int n = int(a.size()), L = 31 - __builtin_clz(n); static vector rt(2, 1); for (static int k = 2, s = 2; k < n; k *= 2, s++) { rt.resize(n); ll z[] = {1, modpow(root, mod >> s, mod)}; for (int i = k; i < 2 * k; i++) rt[i] = rt[i / 2] * z[i & 1] % mod; } vector rev(n); for (int i = 0; i < n; i++) rev[i] = (rev[i / 2] | (i & 1) << L) / 2; for (int i = 0; i < n; i++) if (i < rev[i]) swap(a[i], a[rev[i]]); for (int k = 1; k < n; k *= 2) for (int i = 0; i < n; i += 2 * k) for (int j = 0; j < k; j++) { ll z = rt[j + k] * a[i + j + k] % mod, &ai = a[i + j]; a[i + j + k] = ai - z + (z > ai ? mod : 0); ai += (ai + z >= mod ? z - mod : z); } } template vector conv(const vector &a, const vector &b) { if (a.empty() || b.empty()) return {}; int s = int(a.size()) + int(b.size()) - 1, B = 32 - __builtin_clz(s), n = 1 << B; int inv = modpow(n, mod - 2, mod); vector L(a), R(b), out(n); L.resize(n), R.resize(n); ntt(L), ntt(R); for (int i = 0; i < n; i++) out[-i & (n - 1)] = (ll)L[i] * R[i] % mod * inv % mod; ntt(out); return {out.begin(), out.begin() + s}; } ll euclid(ll a, ll b, ll &x, ll &y) { if (!b) return x = 1, y = 0, a; ll d = euclid(b, a % b, y, x); return y -= a / b * x, d; } ll crt(ll a, ll m, ll b, ll n) { if (n > m) swap(a, b), swap(m, n); ll x, y, g = euclid(m, n, x, y); assert((a - b) % g == 0); // else no solution x = (b - a) % n * x % n / g * m + a; return x < 0 ? x + m * n / g : x; } int main() { int n, k, p, q; cin >> n >> k >> p >> q; vector a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } int mn = *min_element(a.begin(), a.end()); if (mn < 0) { mn = -mn; for (int i = 0; i < n; i++) { a[i] += mn; } } else { mn = 0; } vector multiplier(n + 1); for (int i = 0; i < p; i++) { ll from = (k * 1ll * i) % n; int to = (from + q - 1) % n; range_increment(multiplier, from, to, n); } partial_sum(multiplier.begin(), multiplier.end(), multiplier.begin()); multiplier.pop_back(); vector marked(n + 1); for (int i = 0; i <= n - p; i++) { ll from = (k * 1ll * i) % n; int to = (from + n - q) % n; range_increment(marked, from, to, n); } partial_sum(marked.begin(), marked.end(), marked.begin()); reverse(multiplier.begin(), multiplier.end()); for (int i = 0; i < n; i++) { multiplier.push_back(0); a.push_back(a[i]); } auto c0 = conv(multiplier, a); auto c1 = conv(multiplier, a); ll ret = -1e18; for (int i = 0; i < n; i++) { if (marked[i]) { ll sol = crt(c0[i + n - 1], M0, c1[i + n - 1], M1) - mn * 1ll * p * 1ll * q; ret = max(ret, sol); } } cout << ret << '\n'; }