#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,w,h;
int p[2500];
int find(int u) {
if(p[u] == u) return u;
return p[u] = find(p[u]);
}
void unite(int u,int v) {
u = find(u),v = find(v);
if(u == v) return;
p[u] = v;
}
struct query{
int id;double r; int st;
bool operator<(const query&o) {
return r<o.r;
}
} q[100005];
string ans[100005];
struct tree{
double x,y,r;
} t[2050];
struct pot{
int u,v; double r;
bool operator<(const pot&o) {
return r<o.r;
}
};
vector<pot> a;
int32_t main() {
ios_base::sync_with_stdio(0),cin.tie(0);
cin>>n>>m>>w>>h;
for(int i = 4 ; i<=n+3 ; ++i) {
cin>>t[i].x>>t[i].y>>t[i].r;
}
for(int i = 0 ; i<=n+3 ; ++i) p[i] = i;
for(int i = 4 ; i<=n+3 ; ++i) {
for(int j = i+1 ; j<=n+3 ; ++j) {
double dist = sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y));
dist -= t[i].r+t[j].r;
if(dist <= 1e-9) unite(i,j);
else {
a.push_back({i,j,dist});
}
}
}
for(int i = 4 ; i<=n+3 ; ++i) {
double dist = t[i].x;
dist-=t[i].r;
if(dist <= 1e-9) unite(0,i);
else a.push_back({0,i,dist});
}
for(int i =4 ; i<=n+3 ; ++i) {
double dist = t[i].y;
dist-=t[i].r;
if(dist <= 1e-9) unite(1,i);
else a.push_back({1,i,dist});
}
for(int i = 4 ; i<=n+3 ; ++i) {
double dist = w-t[i].x;
dist-=t[i].r;
if(dist <= 1e-9) unite(2,i);
else a.push_back({2,i,dist});
}
for(int i = 4 ; i<=n+3 ; ++i) {
double dist = h-t[i].y;
dist-=t[i].r;
if(dist <= 1e-9) unite(3,i);
else a.push_back({3,i,dist});
}
sort(a.begin(),a.end());
for(int i = 1 ; i<=m ; ++i) {
cin>>q[i].r>>q[i].st,q[i].id = i;
q[i].r*=2.0;
}
sort(q+1,q+1+m);
int now = 1;
for(int i = 0 ; i<a.size() ; ++i) {
while(now <= m && q[now].r -a[i].r < 1e-9) {
vector<bool> mark(5,0);
if(find(0) == find(2)) {
mark[5-q[now].st] = 1;
int now2 = 5-q[now].st;
if(now2 == 2 || now2 == 1) {
mark[3-now2] = 1;
}
else mark[7-now2] = 1;
}
if(find(1) == find(3)) {
int now2;
if(q[now].st == 1 || q[now].st == 2) now2 = 3-q[now].st;
else now2 = 7-q[now].st;
mark[now2] = 1;
mark[5-now2] = 1;
}
for(int i = 1 ; i<=4 ; ++i) {
int j1 = i%4,j2 = (i+1)%4;
if(find(j1) != find(j2)) continue;
if(j2 == q[now].st%4) {
for(int j = 1 ; j<=4 ; ++j) {
if(j != q[now].st) {
mark[j] = 1;
}
}
}
else {
mark[(j2>0?j2:4)] = 1;
}
}
for(int i = 1 ; i<=4 ; ++i) {
if(!mark[i]) ans[q[now].id]+=(char)(i+'0');
}
now++;
}
unite(a[i].u,a[i].v);
}
while(now <= m) {
vector<bool> mark(5,0);
if(find(0) == find(2)) {
mark[5-q[now].st] = 1;
int now2 = 5-q[now].st;
if(now2 == 2 || now2 == 1) {
mark[3-now2] = 1;
}
else mark[7-now2] = 1;
}
if(find(1) == find(3)) {
int now2;
if(q[now].st == 1 || q[now].st == 2) now2 = 3-q[now].st;
else now2 = 7-q[now].st;
mark[now2] = 1;
mark[5-now2] = 1;
}
for(int i = 1 ; i<=4 ; ++i) {
int j1 = i%4,j2 = (i+1)%4;
if(find(j1) != find(j2)) continue;
if(j2 == q[now].st%4) {
for(int j = 1 ; j<=4 ; ++j) {
if(j != q[now].st) {
mark[j] = 1;
}
}
}
else {
mark[(j2>0?j2:4)] = 1;
}
}
for(int i = 1 ; i<=4 ; ++i) {
if(!mark[i]) ans[q[now].id]+=(char)(i+'0');
}
now++;
}
for(int i = 1 ; i<=m ; ++i) cout << ans[i] << "\n";
}