#[allow(dead_code)] fn get_line() -> Vec { let stdin = std::io::stdin(); let mut s = String::new(); loop { stdin.read_line(&mut s).ok(); let s = s.trim(); if s.len() != 0 { return s.split_whitespace().map(|s| s.into()).collect(); } } } #[allow(dead_code)] fn read_array() -> Vec where T: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug { get_line().iter().map(|s| s.parse().unwrap()).collect() } #[allow(dead_code)] fn read2() -> (T, U) where T: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug, U: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug { let ary = get_line(); (ary[0].parse().unwrap(), ary[1].parse().unwrap()) } #[allow(dead_code)] fn read3() -> (T, U, W) where T: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug, U: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug, W: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug { let ary = get_line(); (ary[0].parse().unwrap(), ary[1].parse().unwrap(), ary[2].parse().unwrap()) } #[allow(dead_code)] fn read1() -> T where T: std::str::FromStr + std::marker::Copy, ::Err: std::fmt::Debug { read_array()[0] } fn main() { let (n, d, k): (usize, i64, i64) = read3(); let mut x = vec![0; n]; for i in 0..n { x[i] = read1(); } let mut l = 0; let mut r = 0; let mut ans = 0i64; let mut idx = 0; let mut max_value = Vec::new(); for i in (0..n).rev() { max_value.push((x[i], -(i as i64))); while max_value.len() > 1 { let m = max_value.len(); if max_value[m - 1] < max_value[m - 2] { break; } max_value[m - 2] = max_value[m - 1]; max_value.pop(); } idx = std::cmp::min(idx, max_value.len() - 1); while -max_value[idx].1 - (i as i64) > d { idx += 1 } let (val, day) = max_value[idx]; let profit = val - x[i]; // println!("{} {} {} {} {}", i, idx, val, day, profit); if ans <= profit { ans = profit; l = i; r = -day; } } println!("{}", ans * k); if ans != 0 { println!("{} {}", l, r); } }