#define _CRT_SECURE_NO_WARNINGS #define _USE_MATH_DEFINES #include using namespace std; using i32 = int; using i64 = long long int; using f64 = double; using str = string; template using vec = vector; template using heap = priority_queue, greater>; #define times(n, i) for (i32 i = 0; i < (n); ++i) #define range(a, b, i) for (i32 i = (a); i < (b); ++i) #define upto(a, b, i) for (i32 i = (a); i <= (b); ++i) #define downto(a, b, i) for (i32 i = (a); i >= (b); --i) #define all(xs) (xs).begin(), (xs).end() #define sortall(xs) sort(all(xs)) #define reverseall(xs) reverse(all(xs)) #define uniqueall(xs) (xs).erase(unique(all(xs)), (xs).end()) #define even(x) (((x) & 1) == 0) #define odd(x) (((x) & 1) == 1) #define append emplace_back const i64 MOD = 1000000007; i32 n, d, k; template struct segtree { i32 n; T defval; vec data; segtree(i32 size, T default_value) : defval(default_value) { n=1; while(n 0) { i = (i-1)/2; data[i] = Cmp()(data[i*2+1], data[i*2+2]) ? data[i*2+1] : data[i*2+2]; } } T query(i32 l, i32 r) { return _query(l, r, 0, 0, n); } T _query(i32 a, i32 b, i32 k, i32 l, i32 r) { if (r <= a || b <= l) return defval; if (a <= l && r <= b) return data[k]; else { T vl = _query(a, b, k*2+1, l, (l+r)/2); T vr = _query(a, b, k*2+2, (l+r)/2, r); return Cmp()(vl, vr) ? vl : vr; } } T leaf(i32 i) { return data[i+n-1]; } }; i32 main() { cin >> n >> d >> k; using P = pair; auto seg = segtree>(n, make_pair(-1, 1)); i32 jj = 0, kk = 0; i64 dd = 0; times(n, i) { i32 x; cin >> x; seg.update(i, make_pair(x, -i)); } times(n, i) { P x = seg.leaf(i); P maxx = seg.query(min(n-1, i+1), min(n, i+d+1)); if (maxx.first - x.first > dd) { dd = maxx.first - x.first; jj = i; kk = -maxx.second; } } if (dd == 0) { cout << 0 << endl; } else { cout << dd*k << endl; cout << jj << " " << kk << endl; } return 0; }