0%

Jumping Around

Jumping Around

time limit per test: 5 seconds

memory limit per test: 256 megabytes

Articles

There is an infinite pond that can be represented with a number line. There are n rocks in the pond, numbered from 11 to nn. The ii-th rock is located at an integer coordinate aia_i. The coordinates of the rocks are pairwise distinct. The rocks are numbered in the increasing order of the coordinate, so a1<a2<<ana_1<a_2<⋯<a_n.

A robot frog sits on the rock number ss. The frog is programmable. It has a base jumping distance parameter dd. There also is a setting for the jumping distance range. If the jumping distance range is set to some integer kk, then the frog can jump from some rock to any rock at a distance from dkd−k to d+kd+k inclusive in any direction. The distance between two rocks is an absolute difference between their coordinates.

You are assigned a task to implement a feature for the frog. Given two integers ii and kk determine if the frog can reach a rock number ii from a rock number ss performing a sequence of jumps with the jumping distance range set to kk. The sequence can be arbitrarily long or empty.

You will be given qq testcases for that feature, the jj-th testcase consists of two integers ii and kk. Print “Yes” if the i-th rock is reachable and “No” otherwise.

You can output “YES” and “NO” in any case (for example, strings “yEs”, “yes”, “Yes” and ‘YES"’ will be recognized as a positive answer).

Input

The first line contains four integers nn, qq, ss and dd (1n,q2105;1sn;1d106)(1≤n,q≤2⋅10^5; 1≤s≤n; 1≤d≤10^6) — the number of rocks, the number of testcases, the starting rock and the base jumping distance parameter.

The second line contains nn integers a1,a2,,an(1ai106)a_1,a_2,…,a_n (1≤a_i≤10^6) — the coordinates of the rocks. The coordinates of the rocks are pairwise distinct. The rocks are numbered in the increasing order of distance from the land, so a1<a2<<ana_1<a_2<⋯<a_n.

Each of the next qq lines contains two integers ii and kk (1in;1k106)(1≤i≤n; 1≤k≤10^6) — the parameters to the testcase.

Output

For each of the testcases print an answer. If there is a sequence of jumps from a rock number ss to a rock number ii with the jumping distance range set to kk, then print “Yes”. Otherwise, print “No”.

Examples

input

1
2
3
4
5
6
7 4 4 5
1 5 10 13 20 22 28
4 1
7 2
7 3
3 2

output

1
2
3
4
Yes
No
Yes
Yes

input

1
2
3
4
5
6
7
8
9
10
10 8 6 11
1 2 4 7 8 9 11 13 19 20
2 13
5 8
8 1
6 15
1 15
2 7
7 6
8 9

output

1
2
3
4
5
6
7
8
Yes
Yes
No
Yes
Yes
Yes
Yes
Yes

input

1
2
3
4
5
6
7
8
9
10
11
6 9 6 6
1 2 4 9 18 19
2 17
1 18
5 4
2 11
5 17
6 8
4 3
3 3
6 6

output

1
2
3
4
5
6
7
8
9
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes

input

1
2
3
4 1 1 10
1 8 10 19
2 1

output

1
Yes

Note

Explanation of the first example:

In the first testcase the destination rock is the same as the starting rock, thus no jumps are required to reach it.

In the second testcase the frog can jump any distance in the range [52;5+2][5−2;5+2]. Thus, it can reach rock number 55 (by jumping 77 to the right) and rock number 33 (by jumping 33 to the left). From rock number 33 it can reach rock number 22 (by jumping 55 to the left). From rock number 22 it can reach rock number 11 (by jumping 44 to the left). However, there is no way to reach rock number 77.

In the third testcase the frog can jump any distance in the range [53;5+3][5−3;5+3]. Thus, it can reach rock number 77 by jumping to rock 55 first and to 77 afterwards.

The fourth testcase is shown in the explanation for the second testcase.

Tutorial

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e6+1;
int a[maxn], ans[maxn];
typedef pair<int,int> pii;
set<int> g[maxn];
set<pii> se;
struct node {
int to, val;
};
vector<node> G[maxn];
int f[maxn], fi[maxn];

int fd(int x) {
if (f[x] == x) return x;
return f[x] = fd(f[x]);
}

void dfs(int x, int pre) {
for(auto to: G[x]) {
if (to.to == pre) continue;
ans[to.to] = max(ans[x], to.val);
dfs(to.to, x);
}
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, q, s, d;
cin >> n >> q >> s >> d;
for(int i = 1; i <= n; ++ i) {
cin >> a[i];
}
int tot = n;
for(int i = 1; i <= n; ++ i) {
f[i] = i;
se.insert({a[i], i});
}
while(tot != 1) {
for(int i = 1; i <= n; ++ i) {
g[fd(i)].insert(i);
}
for(int i = 1; i <= n; ++ i) {
if (g[i].empty()) continue;
int u, v, val = INT_MAX;
for(auto to: g[i]) {
se.erase({a[to], to});
}
for(auto to: g[i]) {
auto l = se.lower_bound({a[to] - d, 0});
if (l != se.end() && abs(a[to]-d - l->first) < val) {
u = to;
v = l -> second;
val = abs(a[to]-d - l->first);
}
if (l != se.begin()) {
-- l;
if (abs(a[to]-d - l->first) < val) {
u = to;
v = l -> second;
val = abs(a[to]-d - l->first);
}
}
auto r = se.lower_bound({a[to] + d, 0});
if (r != se.end() && abs(a[to]+d - r->first) < val) {
u = to;
v = r -> second;
val = abs(a[to]+d - r->first);
}
if (r != se.begin()) {
-- r;
if (abs(a[to]+d - r->first) < val) {
u = to;
v = r -> second;
val = abs(a[to]+d - r->first);
}
}
}
for(auto to: g[i]) {
se.insert({a[to], to});
}
g[i].clear();
int id = fd(v);
if (id == i) continue;
G[u].push_back({v, val});
G[v].push_back({u, val});
f[i] = id;
tot --;
}
}
dfs(s, s);
while(q --) {
int i, k;
cin >> i >> k;
if (ans[i] > k) cout << "No\n";
else cout << "Yes\n";
}
return 0;
}
-------------本文结束感谢您的阅读-------------