use proconio::input; fn main() { input! { n: usize, d: [u128; n], } // dの累積和を計算 let mut acc_d = vec![0; n+1]; for i in 0..n { acc_d[i+1] = acc_d[i] + d[i]; } input! { q: usize, } for _ in 0..q { solve(n, &&acc_d); } } fn solve(n: usize, acc_d: &Vec) { input! { y: u128, m: u128, d: u128, mut k: u128, } // 年月日を日数に換算 let add_d = (y-1) * acc_d[n] + acc_d[(m-1) as usize] + d-1; // 日数を加算 k += add_d; // 年 let ans_y = k / acc_d[n]; k -= ans_y * acc_d[n]; // 月 let ans_m = below_bound(acc_d, k); k -= acc_d[ans_m]; // 日 let ans_d = k; k -= ans_d; println!("{} {} {}", ans_y+1, ans_m+1, ans_d+1); } const INFS: usize = 1 << 60; // 二分探索 // val以下の最大のposを返す。0番目より小さい値では異常値として、「1<<60」を返す pub fn below_bound(vec: &Vec, val: T) -> usize { let mut l = 0; let mut r = vec.len(); while r - l > 0 { let m = (l + r) / 2; if vec[m] <= val { l = m + 1; } else { r = m; } } if l == 0 { INFS } else {l-1} } /* 5 1 1 1 1 1 1 1 1 1 5 1 1 1 26 5 1 1 2 1 1 2 1 2 1 1 1 25 23 5 7 8 271828182845904523 5 3 602874713526624977 */