#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lx (x * 2)
#define rx (x * 2 + 1)
#define mid ((l + r) >> 1)
using namespace std;
const int M = 200000;
int n, m;
int h[M + 5];
int q;
void init()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++)
{
scanf("%d", &h[i]);
}
scanf("%d", &q);
}
struct Tr
{
int mx;
}tr[M * 4 + 5];
void pushup(int x)
{
tr[x].mx = max(tr[lx].mx, tr[rx].mx);
}
void build(int x, int l, int r)
{
if(l == r)
{
tr[x].mx = h[l];
return;
}
build(lx, l, mid);
build(rx, mid + 1, r);
pushup(x);
}
int ask(int x, int l, int r, int s, int t)
{
if(l >= s && r <= t)
{
return tr[x].mx;
}
int ret = -1;
if(s <= mid)
{
ret = max(ask(lx, l, mid, s, t), ret);
}
if(t > mid)
{
ret = max(ask(rx, mid + 1, r, s, t), ret);
}
return ret;
}
void solve()
{
int x[2], y[2], k;
scanf("%d %d %d %d %d", &x[0], &y[0], &x[1], &y[1], &k);
if(x[0] <= h[y[0]] || x[1] <= h[y[1]])
{
printf("NO\n");
return;
}
if(y[0] > y[1])
{
swap(x[0], x[1]);
swap(y[0], y[1]);
}
int t = x[0] + (n - x[0]) / k * k;
if(t > ask(1, 1, n, y[0], y[1]) && (y[0] % k == y[1] % k) && (x[0] % k == x[1] % k))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
int main()
{
init();
build(1, 1, n);
while(q--)
{
solve();
}
return 0;
}