package main import . "fmt" import . "os" import bf "bufio" import . "sort" func main() { rd := bf.NewReader(Stdin) wr := bf.NewWriter(Stdout) defer wr.Flush() var n int Fscan(rd, &n) ds := make([]int, n) sum := make([]int, n+1) for i := range ds { Fscan(rd, &ds[i]) sum[i+1] = sum[i]+ds[i] } var q int Fscan(rd, &q) for ; q > 0; q-- { var y,m,d,k int Fscan(rd, &y,&m,&d,&k) a,b,c := solve(n, ds, sum, y, m, d, k) Fprintln(wr, a, b, c) } } func solve(n int, ds, sum []int, y, m, d, k int) (int, int, int) { y += k / sum[n] k = k % sum[n] if d+k <= ds[m-1] { return y, m, d+k } r := sum[n]-sum[m]+ds[m-1]-d if k <= r { k -= ds[m-1]-d+1 m++ if m > n { m = 1 y++ } d = 1 } else { k -= r+1 y++ m = 1 d = 1 } if k == 0 { return y,m,d } p := Search(n-m, func(i int) bool { return sum[m-1+i]-sum[m-1]>=k+1 }) // println(Sprintf("p=%d",p)) // println(Sprintf("y=%d,m=%d,d=%d,k=%d",y,m,d,k)) k -= sum[m-1+p-1]-sum[m-1] m += p-1 d += k if d > ds[m-1] { d -= ds[m-1] m++ if m > n { m = 1 y++ } } return y,m,d } func bruteforce(n int, ds []int, y, m, d, k int) (int, int, int) { for ; k > 0; k-- { d++ if d > ds[m-1] { d = 1 m++ if m > n { m = 1 y++ } } } return y,m,d } func check() { ds := []int{3, 4, 5, 6, 7} n := len(ds) y := 1 sum := make([]int, n+1) for i, dm := range ds { sum[i+1] = sum[i]+dm } for i, dm := range ds { m := i+1 for d := 1; d <= dm; d++ { for k := 1; k < 100; k++ { a1,b1,c1 := solve(n, ds, sum, y, m, d, k) a2,b2,c2 := bruteforce(n, ds, y, m, d, k) if a1 != a2 || b1 != b2 || c1 != c2 { println(Sprintf("n=%d",n)) println(Sprintf("ds=%#v", ds)) println(Sprintf("sum=%#v", sum)) println(Sprintf("y=%d,m=%d,d=%d,k=%d",y,m,d,k)) println(Sprintf("a1=%d,b1=%d,c1=%d",a1,b1,c1)) println(Sprintf("a2=%d,b2=%d,c2=%d",a2,b2,c2)) panic("Wrong Answer") } } } } } func init() { check() }