// ============== Notes =============== //
// common bugs
// - fastio
// - int overflow (especially intermediate expressionns)
// - array bounds (indices bigger than MAXN?)
// - special cases (n=1? graph not connected?)
// - re-initialize efficiently between test cases

#include <bits/stdc++.h>
using namespace std;

typedef long long i64;
//const i64 inf = 998244353;
const i64 inf = 1000000007;

int a[110000], b[110000];
stack<int> ret;

bool gao(int n) {
	static vector<pair<int, int>> ans;
	ans.emplace_back(a[0], b[0]);

	vector<int> idx;
	idx.push_back(-1);

	vector<int> tmp;

	for (int i = 1; i <= n; ++i) {
		if (a[i] < i && b[i] < i) {
			return false;
		}
		tmp.clear();

		if (a[i] >= i) {
			int k = idx.front();
			if (idx.size() > 1 && ans[idx.back()+1].second > ans[k+1].second) {
				k = idx.back();
			}
			if (ans[k+1].second >= i) {
				ans.emplace_back(k, 0);
				ans.emplace_back(a[i], ans[k+1].second);
				tmp.emplace_back(ans.size() - 2);
			}
		}

		if (b[i] >= i) {
			int k = idx.front();
			if (idx.size() > 1 && ans[idx.back()+1].first > ans[k+1].first) {
				k = idx.back();
			}
			if (ans[k+1].first >= i) {
				ans.emplace_back(k, 1);
				ans.emplace_back(ans[k+1].first, b[i]);
				tmp.emplace_back(ans.size() - 2);
			}
		}

		if (tmp.empty()) {
			return false;
		}
		swap(tmp, idx);
	}

	for (int k = idx.front(); k > 0; k = ans[k].first) {
		ret.push(ans[k].second);
	}
	return true;
}

int k[110000], x[110000], y[110000], u[110000], v[110000];
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		scanf("%d %d %d %d %d", &k[i], &x[i], &y[i], &u[i], &v[i]);
	}
	u[n+1] = x[n+1] = m+1;
	v[n+1] = y[n+1] = -1;

	static set<pair<int, int>> xy;
	static set<pair<int, int>> uv;
	xy.insert({0, 0});
	uv.insert({0, 0});

	for (int i = 1; i <= n+1; ++i) {
		xy.insert({k[i], i});
		while (not xy.empty() && y[i] < xy.rbegin()->first) {
			a[xy.rbegin()->second] = i - 1;
			xy.erase({xy.rbegin()->first, xy.rbegin()->second});
		}
		while (not xy.empty() && x[i] > xy.begin()->first) {
			a[xy.begin()->second] = i - 1;
			xy.erase(xy.begin());
		}

		uv.insert({k[i], i});
		while (not uv.empty() && v[i] < uv.rbegin()->first) {
			b[uv.rbegin()->second] = i - 1;
			uv.erase({uv.rbegin()->first, uv.rbegin()->second});
		}
		while (not uv.empty() && u[i] > uv.begin()->first) {
			b[uv.begin()->second] = i - 1;
			uv.erase(uv.begin());
		}
	}
	if (gao(n)) {
		puts("Yes");
		while (not ret.empty()) {
			printf("%d ", ret.top());
			ret.pop();
		}
		puts("");
	} else {
		puts("No");
	}
	return 0;
}
