# include using namespace std; typedef long long ll; # define int long long # define lc u << 1 # define rc u << 1 | 1 # define fi first # define se second const int N = 100005; int n, d, k; int a[N]; struct SparseTable { struct node { int mx, id; bool operator < (const node &t) const { return mx != t.mx ? mx < t.mx : id > t.id; } } st[N][35]; int lg[N]; void init () { lg[1] = 0; for (int i = 2; i <= n; i ++ ) lg[i] = lg[i >> 1] + 1; for (int i = 0; i <= n; i ++ ) st[i][0] = {a[i], i}; for (int j = 1; j <= 30; j ++ ) { for (int i = 0; i + (1 << j) - 1 <= n; i ++ ) st[i][j] = max (st[i][j - 1], st[i + (1 << (j - 1))][j - 1]); } } node query (int l, int r) { int k = lg[r - l + 1]; return max (st[l][k], st[r - (1 << k) + 1][k]); } } ST; signed main () { // freopen ("stock.in", "r", stdin); freopen ("stock.out", "w", stdout); scanf ("%lld%lld%lld", &n, &d, &k); for (int i = 1; i <= n; i ++ ) scanf ("%lld", &a[i]); ST.init (); int ans = 0; int idl = 0, idr = 0; for (int i = 1; i <= n; i ++ ) { int l = min (i + 1, n), r = min (i + d, n); auto res = ST.query(l, r); if (res.mx - a[i] > ans) { ans = res.mx - a[i]; idl = i - 1, idr = res.id - 1; } } if (!ans) printf ("0\n"); else printf ("%lld\n%lld %lld", ans * k, idl, idr); return 0; }