#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,fma")
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
const int maxn=2010;
struct cyc {
ll r,x,y;
int dist(cyc o) {
return floor(sqrt((x-o.x)*(x-o.x)+(y-o.y)*(y-o.y)))-r-o.r;
}
};
vector<cyc> c(maxn);
vi dists(maxn);
int32_t main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int n,m;
cin >> n >> m;
int w,h;
cin >> w >> h;
for (int i=0; i<n; i++) {
cin >> c[i].x >> c[i].y >> c[i].r;
}
vector<vi> maxd(4,vi(4,1e9));
priority_queue<pi,vector<pi>,greater<pi>> q;
for (int i=0; i<n; i++) {
dists[i]=c[i].x-c[i].r;
q.push({dists[i],i});
}
while (q.size()) {
auto [d,cur]=q.top();
q.pop();
if (dists[cur]!=d) {
continue;
}
for (int i=0; i<n; i++) {
if (max(d,c[cur].dist(c[i]))<dists[i]) {
dists[i]=max(d,c[cur].dist(c[i]));
q.push({dists[i],i});
}
}
maxd[0][1]=min(maxd[0][1],max(d,(int)(c[cur].y-c[cur].r)));
maxd[0][2]=min(maxd[0][2],max(d,(int)(c[cur].y-c[cur].r)));
maxd[0][3]=min(maxd[0][3],max(d,(int)(c[cur].y-c[cur].r)));
maxd[0][2]=min(maxd[0][2],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[0][3]=min(maxd[0][3],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[1][2]=min(maxd[1][2],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[1][3]=min(maxd[1][3],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[0][3]=min(maxd[0][3],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[1][3]=min(maxd[1][3],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[2][3]=min(maxd[2][3],max(d,(int)(h-c[cur].y-c[cur].r)));
}
for (int i=0; i<n; i++) {
dists[i]=c[i].y-c[i].r;
q.push({dists[i],i});
}
while (q.size()) {
auto [d,cur]=q.top();
q.pop();
if (dists[cur]!=d) {
continue;
}
for (int i=0; i<n; i++) {
if (max(d,c[cur].dist(c[i]))<dists[i]) {
dists[i]=max(d,c[cur].dist(c[i]));
q.push({dists[i],i});
}
}
maxd[0][1]=min(maxd[0][1],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[1][2]=min(maxd[1][2],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[1][3]=min(maxd[1][3],max(d,(int)(w-c[cur].x-c[cur].r)));
maxd[0][1]=min(maxd[0][1],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[0][2]=min(maxd[0][2],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[1][3]=min(maxd[1][3],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[2][3]=min(maxd[2][3],max(d,(int)(h-c[cur].y-c[cur].r)));
}
for (int i=0; i<n; i++) {
dists[i]=w-c[i].x-c[i].r;
q.push({dists[i],i});
}
while (q.size()) {
auto [d,cur]=q.top();
q.pop();
if (dists[cur]!=d) {
continue;
}
for (int i=0; i<n; i++) {
if (max(d,c[cur].dist(c[i]))<dists[i]) {
dists[i]=max(d,c[cur].dist(c[i]));
q.push({dists[i],i});
}
}
maxd[0][2]=min(maxd[0][2],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[1][2]=min(maxd[1][2],max(d,(int)(h-c[cur].y-c[cur].r)));
maxd[2][3]=min(maxd[2][3],max(d,(int)(h-c[cur].y-c[cur].r)));
}
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
maxd[i][j]=min(maxd[i][j],maxd[j][i]);
}
}
int num,r;
for (int i=0; i<m; i++) {
cin >> r >> num;
num--;
r*=2;
for (int i=0; i<4; i++) {
if (r<=maxd[num][i]) {
cout << i+1;
}
}
cout << '\n';
}
return 0;
}