#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define pii pair<int,int>
#define x first
#define y second
const int N=5e5+10;
int n,m,k,x[N],y[N],p[N],d[N];
struct node{
int l,r;
vector<int> a;
} tr[N*4];
stack<pii> s;
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r) return ;
int mid=(l+r)>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
void ins(int u,int l,int r,int x){
if(tr[u].l>=l&&tr[u].r<=r) {
tr[u].a.push_back(x);
return ;
}
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) ins(u<<1,l,r,x);
if(r>mid) ins(u<<1|1,l,r,x);
}
int find(int x){
while(x!=p[x]) x=p[x];
return x;
}
void merge(int x,int y){
if(x==y) return ;
if(d[x]>d[y]) swap(x,y);
s.push({x,d[x]}),p[x]=y,d[y]+=d[x];
}
void dfs(int u,int l,int r){
bool f=1;
int sz=s.size();
for(int i:tr[u].a){
int u=find(x[i]),v=find(y[i]);
if(p[u]==p[v]){
rep(j,l,r) cout<<"No"<<endl;
f=0;
break;
}
u=find(x[i]),v=find(y[i]);
merge(find(x[i]+n),v),merge(find(y[i]+n),u);
}
if(f){
if(l==r) cout<<"Yes"<<endl;
else{
int mid=(l+r)>>1;
dfs(u<<1,l,mid),dfs(u<<1|1,mid+1,r);
}
}
while(s.size()>sz) d[s.top().x]-=s.top().y,p[s.top().x]=s.top().x,s.pop();
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m>>k;
build(1,1,k);
rep(i,1,m){
int l,r;
cin>>x[i]>>y[i]>>l>>r;
if(l!=r) ins(1,l+1,r,i);
}
rep(i,1,2*n) p[i]=i,d[i]=1;
dfs(1,1,k);
return 0;
}
以上是我按size合并的代码,为什么hack数据T了?