#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i, a, b) for(rll i = a; i <= b; i++)
#define Fdn(i, a, b) for(rll i = a; i >= b; i--)
#define pii pair<int, int>
#define fi first
#define se second
#define ld long double
using namespace std;
const int inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7, _mod = 998244353;
const int maxn = 2e5 + 7, glz = 4e5 + 7;
int n, m, k;
vector<pii> Tree[maxn << 2];
int fa[maxn], h[maxn];
struct Stack { int u, v, add; } stk[maxn];
int top;
int ans[maxn];
inline void Modify(int p, int l, int r, int s, int t, pii v) {
if(s <= l && r <= t) return Tree[p].push_back(v), void();
int mid = (l + r) >> 1;
if(s <= mid) Modify(p << 1, l, mid, s, t, v);
if(mid < t) Modify(p << 1 | 1, mid + 1, r, s, t, v);
}
inline int Get(int x) { while(x ^ fa[x]) x = fa[x]; return x; }
inline void Merge(int u, int v) {
u = Get(u), v = Get(v);
if(h[u] < h[v]) swap(h[u], h[v]);
stk[++top] = {u, v, h[u] == h[v]};
fa[v] = u;
if(h[u] == h[v]) h[u]++;
}
inline void Solve(int p, int l, int r) {
int fl = 1, lst = top;
for(pii tmp : Tree[p]) {
int u = Get(tmp.fi), v = Get(tmp.se);
if(u == v) { fl = 0; break; }
Merge(tmp.fi, tmp.se + n); Merge(tmp.se, tmp.fi + n);
}
if(fl) {
if(l == r) ans[l] = 1;
else {
int mid = (l + r) >> 1;
Solve(p << 1, l, mid); Solve(p << 1 | 1, mid + 1, r);
}
}
while(top > lst) {
h[stk[top].u] -= stk[top].add;
fa[stk[top].v] = stk[top].v;
top--;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> k;
F(i, 1, m) {
int x, y, l, r; cin >> x >> y >> l >> r;
Modify(1, 1, k, l + 1, r, {x, y});
}
F(i, 1, n << 1) fa[i] = i, h[i] = 1;
Solve(1, 1, k);
F(i, 1, k) cout << (ans[i] ? "Yes" : "No") << '\n';
return 0;
}