fn main() { let stdin = std::io::read_to_string(std::io::stdin().lock()).unwrap(); let mut stdin = stdin.split_ascii_whitespace(); let n: usize = stdin.next().unwrap().parse().unwrap(); let d: i32 = stdin.next().unwrap().parse().unwrap(); let tasks: Vec<(i32, i32)> = (0..n) .map(|_| { ( stdin.next().unwrap().parse().unwrap(), stdin.next().unwrap().parse().unwrap(), ) }) .collect(); use std::io::Write; std::io::stdout() .lock() .write_all(output(solve(d, tasks)).as_bytes()) .unwrap(); } fn solve(d: i32, tasks: Vec<(i32, i32)>) -> i32 { let n = tasks.len(); let mut dp = [[i32::MIN; 2]; 2]; dp[0][0] = 0; tasks.into_iter().enumerate().for_each(|(i, (t, k))| { dp[(i & 1) ^ 1][0] = dp[i & 1][0].max(dp[i & 1][1].saturating_sub(d)) + t; dp[(i & 1) ^ 1][1] = dp[i & 1][1].max(dp[i & 1][0].saturating_sub(d)) + k; }); dp[n & 1][0].max(dp[n & 1][1]) } fn output(ans: i32) -> String { ans.to_string() + "\n" }