#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define PII pair<int, int>
const int N = 1e5 + 10;
int n, m, k, u[N << 1], v[N << 1], fa[N << 1], siz[N << 1];
stack<PII> s;
struct T
{
int l, r;
vector<int> e;
}t[N << 2];
int find(int x)
{
if(x != fa[x]) return find(fa[x]);
return fa[x];
}
void mg(int x, int y)
{
x = find(x), y = find(y);
if(x == y) return;
if(siz[x] > siz[y]) swap(x, y);
s.push(PII{x, (siz[x] == siz[y])});
if(siz[x] == siz[y]) siz[y] ++;
fa[x] = y;
}
void build(int p, int l, int r)
{
t[p].l = l, t[p].r = r;
if(l == r) return;
int mid = t[p].l + t[p].r >> 1;
build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);
}
void update(int p, int l, int r, int x)
{
if(l <= t[p].l && t[p].r <= r)
{
t[p].e.push_back(x);
return;
}
int mid = t[p].l + t[p].r >> 1;
if(l <= mid) update(p << 1, l, r, x);
if(r > mid) update(p << 1 | 1, l, r, x);
}
void dfs(int p, int l, int r)
{
bool f = 1;
LL len = s.size();
for(LL i = 0; i < t[p].e.size(); i ++)
{
int id = t[p].e[i];
int a = find(u[id]), b = find(v[id]);
if(a == b)
{
for(int j = l; j <= r; j ++) puts("No");
f = 0;
break;
}
mg(a, b + n), mg(a + n, b);
}
if(f)
{
int mid = t[p].l + t[p].r >> 1;
if(l == r) puts("Yes");
else dfs(p << 1, l, mid), dfs(p << 1 | 1, mid + 1, r);
}
while(s.size() > len)
{
siz[fa[s.top().first]] -= s.top().second;
fa[s.top().first] = s.top().first;
s.pop();
}
}
int main()
{
cin >> n >> m >> k;
build(1, 1, k);
for(int i = 1; i <= m; i ++)
{
int l, r;
scanf("%d%d%d%d", &u[i], &v[i], &l, &r);
update(1, l + 1, r, i);
}
for(int i = 1; i <= 2 * n; i ++) fa[i] = i, siz[i] = 1;
dfs(1, 1, k);
return 0;
}