#include <bits/stdc++.h>
#define MMAX 100000
#define NMAX 2000
#define x first
#define y second
using namespace std;
pair<int, int> trees_coord[NMAX+1];
int trees_r[NMAX+1];
pair<double, pair<int, int>> muchii[NMAX*NMAX+1];
int cnt=0;
double dist(pair<int, int> a, pair<int, int> b)
{
return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));
}
int t[NMAX+5], sz[NMAX+5];
int find(int node)
{
if(node==t[node]) return node;
t[node]=find(t[node]);
return t[node];
}
void merge(int node1, int node2)
{
node1=find(node1);
node2=find(node2);
if(node1==node2) return;
if(sz[node1]<sz[node2]) swap(node1, node2);
t[node2]=node1;
sz[node1]+=sz[node2];
}
bool same_cc(int node1, int node2)
{
node1=find(node1);
node2=find(node2);
return (node1==node2);
}
struct query
{
int r, e, idx;
} queries[MMAX+1];
bool cmp(query a, query b)
{
return a.r<b.r;
}
bool ans[MMAX+1][5];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, w, h;
cin >> n >> m >> w >> h;
for(int i=1; i<=n; i++)
{
cin >> trees_coord[i].x >> trees_coord[i].y >> trees_r[i];
muchii[++cnt]={trees_coord[i].y-trees_r[i], {i, n+1}};
muchii[++cnt]={w-trees_coord[i].x-trees_r[i], {i, n+2}};
muchii[++cnt]={h-trees_coord[i].y-trees_r[i], {i, n+3}};
muchii[++cnt]={trees_coord[i].x-trees_r[i], {i, n+4}};
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<i; j++)
{
double d=dist(trees_coord[i], trees_coord[j])-(trees_r[i]+trees_r[j]);
muchii[++cnt]={d, {i, j}};
}
}
for(int i=1; i<=n+4; i++)
{
t[i]=i;
sz[i]=1;
}
sort(muchii+1, muchii+cnt+1);
for(int i=1; i<=m; i++)
{
cin >> queries[i].r >> queries[i].e;
queries[i].idx=i;
}
sort(queries+1, queries+m+1, cmp);
int j=1;
for(int i=1; i<=m; i++)
{
while(j<=cnt && muchii[j].first<2*queries[i].r)
{
merge(muchii[j].second.first, muchii[j].second.second);
j++;
}
ans[queries[i].idx][1]=ans[queries[i].idx][2]=ans[queries[i].idx][3]=ans[queries[i].idx][4]=1;
if(same_cc(n+4, n+1) && queries[i].e!=1) ans[queries[i].idx][1]=0;
if(same_cc(n+1, n+2) && queries[i].e!=2) ans[queries[i].idx][2]=0;
if(same_cc(n+2, n+3) && queries[i].e!=3) ans[queries[i].idx][3]=0;
if(same_cc(n+3, n+4) && queries[i].e!=4) ans[queries[i].idx][4]=0;
if(same_cc(n+1, n+3))
{
if(queries[i].e==1 || queries[i].e==4) ans[queries[i].idx][2]=ans[queries[i].idx][3]=0;
else ans[queries[i].idx][1]=ans[queries[i].idx][4]=0;
}
if(same_cc(n+2, n+4))
{
if(queries[i].e==1 || queries[i].e==2) ans[queries[i].idx][3]=ans[queries[i].idx][4]=0;
else ans[queries[i].idx][1]=ans[queries[i].idx][2]=0;
}
}
for(int i=1; i<=m; i++)
{
for(int e=1; e<=4; e++)
if(ans[i][e]) cout << e;
cout << "\n";
}
return 0;
}