分析:
这个机器人横向跟纵向走的距离都是k的倍数,所以可以先令dx = abs(xs - xf), dy = abs(ys - yf), 先对dx%k 与 dy %k 是否都为0 做特判,再令 gl = xs + ((n - xs)/k)*k; gl 代表纵向能走的最大值,再用线段树或者是ST表找出区间[ys, yf]上a数组的最大值standard,判断gl 是否大于standard,若大于,就输出YES,否则输出NO;
//AC code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 2e5 + 10;
ll a[maxn];
ll tree[maxn<<2];
void buildup(ll l, ll r, ll st){
if(l == r){
tree[st] = a[l];
return;
}
ll mid = (l + r)/2;
buildup(l, mid, st*2);
buildup(mid + 1, r, st*2 + 1);
tree[st] = max(tree[st*2], tree[st*2 + 1]);
}
ll querymax(ll x, ll y, ll l, ll r, ll st){
if(x <= l && y >= r){
return tree[st];
}
ll mid = (l + r)/2;
if(mid >= y) return querymax(x, y, l, mid, st*2);
else if(mid < x) return querymax(x, y, mid + 1, r, st*2 + 1);
else return max(querymax(x, y, l, mid, st*2), querymax(x, y, mid + 1, r, st*2 + 1));
}
int main(){
ll n, xs, xf, k;
ll m, q, ys, yf;
cin>>n>>m;
for(ll i = 1; i <= m; i++){
scanf("%lld", &a[i]);
}
buildup(1, m, 1);
cin>>q;
for(ll i = 1; i <= q; i++){
scanf("%lld%lld%lld%lld%lld", &xs, &ys, &xf, &yf, &k);
ll dx = abs(xs - xf);
ll dy = abs(ys - yf);
if(dx%k != 0 || dy%k != 0){
printf("NO\n");
continue;
}
if(dx == 0 && dy == 0){
printf("YES\n");
continue;
}
if(ys > yf){
swap(xs, xf);
swap(ys, yf);
}
ll standard = querymax(ys, yf, 1, m, 1);
ll gl = xs + ((n - xs)/k)*k;
if(gl > standard){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}