fun main() { // Create stdin buffered reader val br = System.`in`.bufferedReader() val (n, q, m) = readInts(br) val p = readInts(br) val t = readInts(br).map { it + 1 } val hop = Array(18) { IntArray(n) } var r = 0 for (i in 0 until n) { while (r < n - 1 && p[r + 1] <= p[i] + m) { r++ } hop[0][i] = r } for (l in 1 until 18) { for (i in 0 until n) { hop[l][i] = hop[l - 1][hop[l - 1][i]] } } val inf = 2 * 1000000000 fun numHops(i: Int, j: Int): Int { var i = i var j = j if (i > j) { i = j.also { j = i } } if (hop[17][i] < j) { return inf } var h = 0 for (l in 17 downTo 0) { if (hop[l][i] < j) { h += 1 shl l i = hop[l][i] } } assert(i < j) i = hop[0][i] h++ assert(i >= j) return h } val jumpleft = IntArray(n) var best = t[0] for (i in 0 until n) { jumpleft[i] = minOf(t[i], best + 1) best = minOf(t[i], best) } val jumpright = IntArray(n) jumpright[n - 1] = t[n - 1] best = n - 1 for (i in n - 2 downTo 0) { val h = numHops(i, best) if (h == inf) { best = i jumpright[i] = t[i] continue } val viabest = numHops(i, best) + jumpright[best] if (t[i] < viabest) { jumpright[i] = t[i] best = i } else { jumpright[i] = viabest } } // Create a buffered reader to read query lines repeat(q) { val (x, y) = readInts(br).map { it - 1 } if (x < y) { println(1) return@repeat } val h = numHops(x, y) val l = jumpleft[y] val r = jumpright[y] println(minOf(h, l, r)) } } private fun readInts(br: java.io.BufferedReader) = readStrings(br).map { it.toInt() } private fun readStrings(br: java.io.BufferedReader) = br.readLine().split(" ")