#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;
long double r;
int st;
bool operator<(const query &o) const
{
return r < o.r;
}
} q[100005];
string ans[100005];
struct tree
{
long double x, y, r;
} t[2050];
struct pot
{
int u, v;
long double r;
bool operator<(const pot &o) const
{
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)
{
long 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 <= 0.0)
unite(i, j);
else
{
a.push_back({i, j, dist});
}
}
}
for (int i = 4; i <= n + 3; ++i)
{
long double dist = t[i].x;
dist -= t[i].r;
if (dist <= 0.0)
unite(0, i);
else
a.push_back({0, i, dist});
}
for (int i = 4; i <= n + 3; ++i)
{
long double dist = t[i].y;
dist -= t[i].r;
if (dist <= 0.0)
unite(1, i);
else
a.push_back({1, i, dist});
}
for (int i = 4; i <= n + 3; ++i)
{
long double dist = w - t[i].x;
dist -= t[i].r;
if (dist <= 0.0)
unite(2, i);
else
a.push_back({2, i, dist});
}
for (int i = 4; i <= n + 3; ++i)
{
long double dist = h - t[i].y;
dist -= t[i].r;
if (dist <= 0.0)
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 < 0.0)
{
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] << (i < m ? "\n" : "");
}