#include <bits/stdc++.h>
using namespace std;
struct Point {
static long long Radius;
int x, y;
bool checked;
Point() : x(-1), y(-1), checked(false) {}
Point(int u, int v) : x(u), y(v), checked(false) {}
friend ostream &operator << (ostream &os, const Point &o) {
return os << "(" << o.x << ", " << o.y << ")";
}
friend istream &operator >> (istream &is, Point &o) {
return is >> o.x >> o.y;
}
bool operator < (const Point &o) const {
return x != o.x ? x < o.x : y < o.y;
}
friend long long dis(const Point &a, const Point &b) {
return 1LL * (a.x - b.x) * (a.x - b.x) + 1LL * (a.y - b.y) * (a.y - b.y);
}
friend bool connected(const Point &a, const Point &b) {
return dis(a, b) <= 1LL * Point::Radius * Point::Radius;
}
};
long long Point::Radius = 0;
struct DSU {
int n;
vector<int> e;
vector<bool> c;
DSU(int n = 0) : n(n), e(n + 1, -1), c(n + 1, 0) {}
int fp(int u) {
return e[u] < 0 ? u : e[u] = fp(e[u]);
}
bool unon(int u, int v) {
u = fp(u);
v = fp(v);
if(u == v) return false;
if(e[u] > e[v]) swap(u, v);
c[u] = c[u] | c[v];
e[u] += e[v];
e[v] = u;
return true;
}
};
const int MX = 100005;
int n, r;
int d[MX];
Point point[MX];
vector<int> G[MX];
int CNT = 0;
void addEdge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
}
void buildGraph(bool ord) {
vector<int> orderId(n);
iota(orderId.begin(), orderId.end(), 1);
sort(orderId.begin(), orderId.end(),
ord ? [](const int &i, const int &j) -> bool {
return point[i] < point[j];
} : [](const int &i, const int &j) -> bool {
return point[j] < point[i];
});
set<pair<int, int>> wl;
for(size_t x = 0, y = 0, i; x < orderId.size(); ++x) {
i = orderId[x];
while(y < x && abs(point[orderId[y]].x - point[i].x) > Point::Radius) {
int j = orderId[y];
wl.erase({point[j].y, j});
++y;
}
// proceed here
auto itr = wl.lower_bound({point[i].y - Point::Radius, -1});
vector<set<pair<int, int>>::iterator>connect;
while(itr != wl.end() && itr->first <= point[i].y + Point::Radius) {
if(connected(point[i], point[itr->second])) {
connect.push_back(itr);
addEdge(i, itr->second);
}
++itr;
}
if(connect.size() > 3) {
for(auto itr: connect) {
int i = itr->second;
point[i].checked = true;
wl.erase(itr);
}
}
wl.insert({point[i].y, i});
}
}
void dfs(int u) {
for(int v: G[u]) {
if(!d[v]) d[v] = 3 - d[u], dfs(v);
else if(d[v] == d[u]) point[u].checked = true;
}
}
void verify() {
DSU dsu(n);
for(int i = 1; i <= n; ++i) if(!d[i]) d[i] = 1, dfs(i);
for(int i = 1; i <= n; ++i) if(point[i].checked) dsu.c[i] = true;
for(int i = 1; i <= n; ++i) for(int j: G[i]) dsu.unon(i, j);
for(int i = 1; i <= n; ++i) if(dsu.c[dsu.fp(i)] == true) point[i].checked = true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> Point::Radius;
for(int i = 1; i <= n; ++i) cin >> point[i];
buildGraph(true);
buildGraph(false);
verify();
for(int i = 1; i <= n; ++i) cout << point[i].checked;
return 0;
}
/*
6 5
4 1
4 4
1 5
5 9
9 6
10 2
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgUG9pbnQgewogICAgc3RhdGljIGxvbmcgbG9uZyBSYWRpdXM7CiAgICBpbnQgeCwgeTsKICAgIGJvb2wgY2hlY2tlZDsKICAgIFBvaW50KCkgOiB4KC0xKSwgeSgtMSksIGNoZWNrZWQoZmFsc2UpIHt9CiAgICBQb2ludChpbnQgdSwgaW50IHYpIDogeCh1KSwgeSh2KSwgY2hlY2tlZChmYWxzZSkge30KCiAgICBmcmllbmQgb3N0cmVhbSAmb3BlcmF0b3IgPDwgKG9zdHJlYW0gJm9zLCBjb25zdCBQb2ludCAmbykgewogICAgICAgIHJldHVybiBvcyA8PCAiKCIgPDwgby54IDw8ICIsICIgPDwgby55IDw8ICIpIjsKICAgIH0KCiAgICBmcmllbmQgaXN0cmVhbSAmb3BlcmF0b3IgPj4gKGlzdHJlYW0gJmlzLCBQb2ludCAmbykgewogICAgICAgIHJldHVybiBpcyA+PiBvLnggPj4gby55OwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgUG9pbnQgJm8pIGNvbnN0IHsKICAgICAgICByZXR1cm4geCAhPSBvLnggPyB4IDwgby54IDogeSA8IG8ueTsKICAgIH0KCiAgICBmcmllbmQgbG9uZyBsb25nIGRpcyhjb25zdCBQb2ludCAmYSwgY29uc3QgUG9pbnQgJmIpIHsKICAgICAgICByZXR1cm4gMUxMICogKGEueCAtIGIueCkgKiAoYS54IC0gYi54KSArIDFMTCAqIChhLnkgLSBiLnkpICogKGEueSAtIGIueSk7CiAgICB9CgogICAgZnJpZW5kIGJvb2wgY29ubmVjdGVkKGNvbnN0IFBvaW50ICZhLCBjb25zdCBQb2ludCAmYikgewogICAgICAgIHJldHVybiBkaXMoYSwgYikgPD0gMUxMICogUG9pbnQ6OlJhZGl1cyAqIFBvaW50OjpSYWRpdXM7CiAgICB9Cn07IAoKbG9uZyBsb25nIFBvaW50OjpSYWRpdXMgPSAwOwoKc3RydWN0IERTVSB7CiAgICBpbnQgbjsKICAgIHZlY3RvcjxpbnQ+IGU7CiAgICB2ZWN0b3I8Ym9vbD4gYzsKICAgIERTVShpbnQgbiA9IDApIDogbihuKSwgZShuICsgMSwgLTEpLCBjKG4gKyAxLCAwKSB7fQoKICAgIGludCBmcChpbnQgdSkgewogICAgICAgIHJldHVybiBlW3VdIDwgMCA/IHUgOiBlW3VdID0gZnAoZVt1XSk7CiAgICB9CgogICAgYm9vbCB1bm9uKGludCB1LCBpbnQgdikgewogICAgICAgIHUgPSBmcCh1KTsKICAgICAgICB2ID0gZnAodik7CiAgICAgICAgaWYodSA9PSB2KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYoZVt1XSA+IGVbdl0pIHN3YXAodSwgdik7CiAgICAgICAgY1t1XSA9IGNbdV0gfCBjW3ZdOwogICAgICAgIGVbdV0gKz0gZVt2XTsKICAgICAgICBlW3ZdID0gdTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfTsKCmNvbnN0IGludCBNWCA9IDEwMDAwNTsKaW50IG4sIHI7CmludCBkW01YXTsKUG9pbnQgcG9pbnRbTVhdOwp2ZWN0b3I8aW50PiBHW01YXTsKaW50IENOVCA9IDA7CnZvaWQgYWRkRWRnZShpbnQgdSwgaW50IHYpIHsKICAgIEdbdV0ucHVzaF9iYWNrKHYpOwoJR1t2XS5wdXNoX2JhY2sodSk7Cn0KCnZvaWQgYnVpbGRHcmFwaChib29sIG9yZCkgewogICAgdmVjdG9yPGludD4gb3JkZXJJZChuKTsKICAgIGlvdGEob3JkZXJJZC5iZWdpbigpLCBvcmRlcklkLmVuZCgpLCAxKTsKICAgIHNvcnQob3JkZXJJZC5iZWdpbigpLCBvcmRlcklkLmVuZCgpLAogICAgb3JkID8gW10oY29uc3QgaW50ICZpLCBjb25zdCBpbnQgJmopIC0+IGJvb2wgewogICAgICAgIHJldHVybiBwb2ludFtpXSA8IHBvaW50W2pdOwogICAgfSA6IFtdKGNvbnN0IGludCAmaSwgY29uc3QgaW50ICZqKSAtPiBib29sIHsKICAgICAgICByZXR1cm4gcG9pbnRbal0gPCBwb2ludFtpXTsKICAgIH0pOwoKICAgIHNldDxwYWlyPGludCwgaW50Pj4gd2w7CiAgICBmb3Ioc2l6ZV90IHggPSAwLCB5ID0gMCwgaTsgeCA8IG9yZGVySWQuc2l6ZSgpOyArK3gpIHsKICAgICAgICBpID0gb3JkZXJJZFt4XTsKICAgICAgICB3aGlsZSh5IDwgeCAmJiBhYnMocG9pbnRbb3JkZXJJZFt5XV0ueCAtIHBvaW50W2ldLngpID4gUG9pbnQ6OlJhZGl1cykgewogICAgICAgICAgICBpbnQgaiA9IG9yZGVySWRbeV07CiAgICAgICAgICAgIHdsLmVyYXNlKHtwb2ludFtqXS55LCBqfSk7CiAgICAgICAgICAgICsreTsKICAgICAgICB9CgogICAgICAgIC8vIHByb2NlZWQgaGVyZQogICAgICAgIGF1dG8gaXRyID0gd2wubG93ZXJfYm91bmQoe3BvaW50W2ldLnkgLSBQb2ludDo6UmFkaXVzLCAtMX0pOwogICAgICAgIHZlY3RvcjxzZXQ8cGFpcjxpbnQsIGludD4+OjppdGVyYXRvcj5jb25uZWN0OwogICAgICAgIHdoaWxlKGl0ciAhPSB3bC5lbmQoKSAmJiBpdHItPmZpcnN0IDw9IHBvaW50W2ldLnkgKyBQb2ludDo6UmFkaXVzKSB7CiAgICAgICAgICAgIGlmKGNvbm5lY3RlZChwb2ludFtpXSwgcG9pbnRbaXRyLT5zZWNvbmRdKSkgewogICAgICAgICAgICAgICAgY29ubmVjdC5wdXNoX2JhY2soaXRyKTsKICAgICAgICAgICAgICAgIGFkZEVkZ2UoaSwgaXRyLT5zZWNvbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICsraXRyOwogICAgICAgIH0KCiAgICAgICAgaWYoY29ubmVjdC5zaXplKCkgPiAzKSB7CiAgICAgICAgICAgIGZvcihhdXRvIGl0cjogY29ubmVjdCkgewogICAgICAgICAgICAgICAgaW50IGkgPSBpdHItPnNlY29uZDsKICAgICAgICAgICAgICAgIHBvaW50W2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2wuZXJhc2UoaXRyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd2wuaW5zZXJ0KHtwb2ludFtpXS55LCBpfSk7CiAgICB9Cn0KCnZvaWQgZGZzKGludCB1KSB7CiAgICBmb3IoaW50IHY6IEdbdV0pIHsKICAgICAgICBpZighZFt2XSkgZFt2XSA9IDMgLSBkW3VdLCBkZnModik7CiAgICAgICAgZWxzZSBpZihkW3ZdID09IGRbdV0pIHBvaW50W3VdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Cgp2b2lkIHZlcmlmeSgpIHsKICAgIERTVSBkc3Uobik7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgaWYoIWRbaV0pIGRbaV0gPSAxLCBkZnMoaSk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgaWYocG9pbnRbaV0uY2hlY2tlZCkgZHN1LmNbaV0gPSB0cnVlOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyArK2kpIGZvcihpbnQgajogR1tpXSkgZHN1LnVub24oaSwgaik7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgaWYoZHN1LmNbZHN1LmZwKGkpXSA9PSB0cnVlKSBwb2ludFtpXS5jaGVja2VkID0gdHJ1ZTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCk7CgogICAgY2luID4+IG4gPj4gUG9pbnQ6OlJhZGl1czsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSBjaW4gPj4gcG9pbnRbaV07CiAgICAKICAgIGJ1aWxkR3JhcGgodHJ1ZSk7CiAgICBidWlsZEdyYXBoKGZhbHNlKTsKICAgIHZlcmlmeSgpOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSBjb3V0IDw8IHBvaW50W2ldLmNoZWNrZWQ7CgogICAgcmV0dXJuIDA7Cn0KCi8qCgo2IDUKNCAxCjQgNAoxIDUKNSA5CjkgNgoxMCAyCgoqLw==