#include<bits/stdc++.h>
using namespace std;
const int kmaxn=3e6+10;
int f[kmaxn];
int d[kmaxn],siz[kmaxn],rp[kmaxn];
bool rt[kmaxn];
struct Tree{
int l,r;
vector<pair<int,int> >lp;
}a[kmaxn];
int an[kmaxn],ans,n,m,k,addnow=0;
pair<int,int>sadd[kmaxn];
int F(int x){
if(f[x]==x){
d[x]=1;
return x;
}else{
F(f[x]);
if(!rt[x])d[x]=(d[f[x]]?0:1);
else d[x]=d[f[x]];
}
return F(f[x]);
}
void AddDad(int x,int y){
int q=x,r=y;
x=F(x);
y=F(y);
sadd[++addnow]={x,y};
if(x==y){
if(d[q]==d[r]){
ans++;
}
}else{
if(rp[x]<rp[y]){swap(x,y);swap(q,r);}
f[y]=x;
rp[x]+=rp[y];
if(d[q]==d[r]&&d[x]!=d[y]){
rt[y]=1;
}
if(d[q]!=d[r]&&d[x]==d[y]){
rt[y]=1;
}
}
}
void KillDad(int x,int y){
int q=x,r=y;
x=sadd[addnow].first;
y=sadd[addnow].second;
addnow--;
if(x==y){
if(d[q]==d[r]){
ans--;
}
}else{
if(rp[x]<rp[y])swap(x,y);
f[y]=y;
rp[x]-=rp[y];
rt[y]=0;
d[y]=0;
}
}
void build(int x,int l,int r){
int mid=(l+r)/2;
a[x].l=l;
a[x].r=r;
if(l==r)return ;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
return ;
}
void add(int x,int l,int r,int dx,int dy){
if(a[x].l>=l&&a[x].r<=r){
a[x].lp.push_back({dx,dy});
return ;
}
if(a[x].r<l||a[x].l>r){
return ;
}
add(x*2,l,r,dx,dy);
add(x*2+1,l,r,dx,dy);
}
void Find(int x){
for(int i=0;i<a[x].lp.size();i++){
AddDad(a[x].lp[i].first,a[x].lp[i].second);
}
if(a[x].l==a[x].r){
an[a[x].l]=ans;
for(int i=a[x].lp.size()-1;i>=0;i--){
KillDad(a[x].lp[i].first,a[x].lp[i].second);
}
return ;
}
Find(x*2);
Find(x*2+1);
for(int i=a[x].lp.size()-1;i>=0;i--){
KillDad(a[x].lp[i].first,a[x].lp[i].second);
}
return ;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
build(1,1,kmaxn/4);
for(int i=1;i<=m;i++){
int x,y,l,r;
cin>>x>>y>>l>>r;
add(1,l,r-1,x,y);
}
for(int i=1;i<=n;i++){
f[i]=i;
d[i]=1;
rp[i]=1;
}
Find(1);
for(int i=0;i<k;i++){
cout<<(an[i]?"No":"Yes")<<endl;
}
return 0;
}