rt,hack数据t了
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5,maxm=2e5+5,maxk=1e5+5;
int e[maxm][2];
vector<int>upd[maxk<<2];
inline int read(){
register int x=0,y=1;
register char ch=getchar();
while(ch<48||ch>57){if(ch==45)y=-1;ch=getchar();}
while(ch>=48&&ch<=57)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*y;
}
void modify(int k,int l,int r,int x,int y,int id){
if(x>y)return ;
if(l>y||r<x)return ;
if(l>=x&&r<=y){
upd[k].push_back(id);
return ;
}
int mid=l+((r-l)>>1);
modify(k<<1,l,mid,x,y,id);
modify(k<<1|1,mid+1,r,x,y,id);
return ;
}
int f[maxn],d[maxn],rk[maxn];
bool flag;
int tp;
int px[maxn],pd[maxn],pr[maxn];
bool ans[maxk];
int dist;
inline int find(int x){
if(f[x]==x)return x;
dist^=d[x];
return find(f[x]);
}
inline int update(int k){
int cur=0;
for(register int i=0;i<upd[k].size();i++){
int id=upd[k][i];
int u=e[id][0],v=e[id][1],w=1;
int x,y;
dist=0;x=find(u);w^=dist;
dist=0;y=find(v);w^=dist;
if(x^y){
tp++;
px[tp]=x;f[x]=y;
pd[tp]=d[x];d[x]=w;
pr[tp]=rk[y];if(rk[x]==rk[y])rk[y]++;
cur++;
}
else if(w){flag=1;break;}
}
return cur;
}
inline void clear(int cur){
while(cur--){
int x=px[tp],y=f[x];
f[x]=x;
d[x]=pd[tp];
rk[y]=pr[y];
tp--;
}
return ;
}
inline void solve(int k,int l,int r){
flag=0;
int cur=update(k);
if(flag){
clear(cur);
for(register int i=l;i<=r;i++)puts("No");
return ;
}
if(l==r){clear(cur);puts("Yes");return ;}
int mid=l+((r-l)>>1);
solve(k<<1,l,mid);
solve(k<<1|1,mid+1,r);
clear(cur);
return ;
}
int main(){
freopen("【模板】线段树分治.in","r",stdin);
freopen("【模板】线段树分治.out","w",stdout);
int n,m,k;
n=read();m=read();k=read();
for(register int i=1;i<=n;i++){f[i]=i;d[i]=0;rk[i]=1;}
for(register int i=1;i<=m;i++){
int x,y,l,r;
x=read();y=read();l=read();r=read();
e[i][0]=x;e[i][1]=y;
modify(1,1,k,l+1,r,i);
}
solve(1,1,k);
return 0;
}