Rorororobot
Contest: Educational Codeforces Round 132 (Rated for Div. 2)
Difficulty rating: 1700
Tags: binary search, data structures, greedy, math

There is a grid, consisting of $$$n$$$ rows and $$$m$$$ columns. The rows are numbered from $$$1$$$ to $$$n$$$ from bottom to top. The columns are numbered from $$$1$$$ to $$$m$$$ from left to right. The $$$i$$$-th column has the bottom $$$a_i$$$ cells blocked (the cells in rows $$$1, 2, \dots, a_i$$$), the remaining $$$n - a_i$$$ cells are unblocked.

A robot is travelling across this grid. You can send it commands — move up, right, down or left. If a robot attempts to move into a blocked cell or outside the grid, it explodes.

However, the robot is broken — it executes each received command $$$k$$$ times. So if you tell it to move up, for example, it will move up $$$k$$$ times ($$$k$$$ cells). You can't send it commands while the robot executes the current one.

You are asked $$$q$$$ queries about the robot. Each query has a start cell, a finish cell and a value $$$k$$$. Can you send the robot an arbitrary number of commands (possibly, zero) so that it reaches the finish cell from the start cell, given that it executes each command $$$k$$$ times?

The robot must stop in the finish cell. If it visits the finish cell while still executing commands, it doesn't count.

Input format:
The first line contains two integers $$$n$$$ and $$$m$$$ ($$$1 \le n \le 10^9$$$; $$$1 \le m \le 2 \cdot 10^5$$$) — the number of rows and columns of the grid.

The second line contains $$$m$$$ integers $$$a_1, a_2, \dots, a_m$$$ ($$$0 \le a_i \le n$$$) — the number of blocked cells on the bottom of the $$$i$$$-th column.

The third line contains a single integer $$$q$$$ ($$$1 \le q \le 2 \cdot 10^5$$$) — the number of queries.

Each of the next $$$q$$$ lines contain five integers $$$x_s, y_s, x_f, y_f$$$ and $$$k$$$ ($$$a[y_s] < x_s \le n$$$; $$$1 \le y_s \le m$$$; $$$a[y_f] < x_f \le n$$$; $$$1 \le y_f \le m$$$; $$$1 \le k \le 10^9$$$) — the row and the column of the start cell, the row and the column of the finish cell and the number of times each your command is executed. The start and the finish cell of each query are unblocked.

Output format:
For each query, print "YES" if you can send the robot an arbitrary number of commands (possibly, zero) so that it reaches the finish cell from the start cell, given that it executes each command $$$k$$$ times. Otherwise, print "NO".

Constraints:
Time limit: 2.0 s
Memory limit: 256.0 MB

Example input:
11 10
9 0 0 10 3 4 8 11 10 8
6
1 2 1 3 1
1 2 1 3 2
4 3 4 5 2
5 3 11 5 3
5 3 11 5 2
11 9 9 10 1

Example output:
YES
NO
NO
NO
YES
YES

Editorial:
What if there were no blocked cells? Then the movement is easy. From cell $$$(x, y)$$$ we can go to cells $$$(x + k, y)$$$, $$$(x, y + k)$$$, $$$(x - k, y)$$$ or $$$(x, y - k)$$$. Thus, we can visit all cells that have the same remainder modulo $$$k$$$ over both dimensions. The answer would be "YES" if $$$x_s \bmod k = x_f \bmod k$$$ and $$$y_s \bmod k = y_f \bmod k$$$.
Let's choose the following path from start to finish. Let $$$x_s$$$ be less or equal to $$$x_f$$$. If that isn't the case, swap the cells. First, move up until the row is the same, then move to the side until the column is the same.
What stops us from doing the same on a grid with blocked cells? The first part of the part can remain the same — we can always move up from the cell. Only cells below the start cell can be blocked. The second part is trickier. If there is a column with too many blocked cells between the start and the finish column, then we won't be able to pass through it.
Let's adjust the path for that. Move up as high as possible — to the highest cell with the same remainder modulo $$$k$$$ in this column. Then move to the finish column and go down to the finish cell.
If there still exists a column with too many blocked cells, then the answer is "NO". No matter what we do, we won't be able to go around that column. Otherwise, the answer is "YES".
Thus, the solution is to check for remainders, then find the largest number of blocked cells between the query columns and compare it to the highest row with the same remainder modulo $$$k$$$ as the start or the finish. You can use any RMQ data structure you want.
Overall complexity: $$$O(n \log n + q)$$$ with sparse table for RMQ, for example.