#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define pii pair<int,int>
inline void dbg() { cout << '\n'; }
template <class Head, class... Tail>
inline void dbg(const Head& head, const Tail&... tail) {
cout << head << ' ';
dbg(tail...);
}
const int N = 2020;
const int M = 1e5+10;
const int MOD = 1e9+7;
int xi[N],yi[N],ri[N],p[N],ans[M][5],mark[N][5],adj[5][5];
struct hee {
int r,e,idx;
bool operator < (const hee&o) const {
return r < o.r;
}
};
vector<hee> ed;
hee qu[M];
int fr(int i) {
if (i == p[i]) return i;
return p[i] = fr(p[i]);
}
void upd(int i) {
for (int j = 1; j <= 4; j++) {
if (j == i) continue;
adj[i][j] = adj[j][i] = 1;
}
}
int32_t main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
int n,m; cin >> n >> m;
int w,h; cin >> w >> h;
for (int i = 1; i <= n; i++) {
p[i] = i;
cin >> xi[i] >> yi[i] >> ri[i];
}
for (int i = 1; i <= n; i++) {
for (int j = i+1; j <= n; j++) {
int dx = xi[i]-xi[j], dy = yi[i]-yi[j];
int l = 0, r = 1e9;
while (l < r) {
int mid = (l+r)/2;
int dr = ri[i]+ri[j]+2*mid;
if (dx*dx+dy*dy < dr*dr) r = mid;
else l = mid+1;
}
ed.push_back({l,i,j});
}
}
for (int i = 1; i <= m; i++) {
cin >> qu[i].r >> qu[i].e;
qu[i].idx = i;
}
sort(ed.begin(),ed.end());
sort(qu+1,qu+1+m);
// for (auto x : ed) cout << x.r << " " << x.e << " " << x.idx << "\n";
int now = 0;
for (int i = 1; i <= m; i++) {
int r = qu[i].r, e = qu[i].e, idx = qu[i].idx;
while (now < n && ed[now].r <= r) {
int i = ed[now].e, j = ed[now].idx;
int rii = fr(i), rjj = fr(j);
p[rjj] = rii;
now++;
if (xi[i]+ri[i]+r*2 > w) mark[rii][3] = 1;
if (xi[i]-ri[i]-r*2 < 0) mark[rii][1] = 1;
if (yi[i]+ri[i]+r*2 > h) mark[rii][4] = 1;
if (yi[i]-ri[i]-r*2 < 0) mark[rii][2] = 1;
if (xi[j]+ri[j]+r*2 > w) mark[rii][3] = 1;
if (xi[j]-ri[j]-r*2 < 0) mark[rii][1] = 1;
if (yi[j]+ri[j]+r*2 > h) mark[rii][4] = 1;
if (yi[j]-ri[j]-r*2 < 0) mark[rii][2] = 1;
if (mark[rii][1] && mark[rii][4]) upd(4);
if (mark[rii][4] && mark[rii][3]) upd(3);
if (mark[rii][3] && mark[rii][2]) upd(2);
if (mark[rii][1] && mark[rii][2]) upd(1);
if (mark[rii][4] && mark[rii][2]) {
adj[4][2] = adj[2][4] = 1;
adj[4][3] = adj[3][4] = 1;
adj[1][2] = adj[2][1] = 1;
adj[1][3] = adj[3][1] = 1;
}
if (mark[rii][1] && mark[rii][3]) {
adj[4][1] = adj[1][4] = 1;
adj[4][2] = adj[2][4] = 1;
adj[3][1] = adj[1][3] = 1;
adj[3][2] = adj[2][3] = 1;
}
}
for (int i = 1; i <= 4; i++) {
if (adj[e][i]) continue;
ans[idx][i] = 1;
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= 4; j++) {
if (!ans[i][j]) continue;
cout << j;
}
cout << "\n";
}
return 0;
}