讨论区里的警示后人都看了(可能看漏),没找到问题。
#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
#include <stack>
#include <utility>
using namespace std;
#define maxn 200005
#define ls (rt<<1)
#define rs ((rt<<1)|1)
#define mid ((l+r)>>1)
int n,m,k,sx[maxn],sy[maxn],fa[maxn<<1],dep[maxn<<1];
bool ans=true;
vector<int> seg[maxn<<2];
stack<pair<int,int> > s;
int get(int x){
if(fa[x]==x){
return x;
}
return get(fa[x]);
}
void merge(int x,int y){
x=get(x);
y=get(y);
if(dep[x]>dep[y]){
swap(x,y);
}
fa[x]=y;
s.push(make_pair(x,dep[y]));
dep[y]=max(dep[y],dep[x]+1);
}
void undo(void){
dep[fa[s.top().first]]=s.top().second;
fa[s.top().first]=s.top().first;
s.pop();
return;
}
void add(int x,int y,int id,int l,int r,int rt){
if(x<=l&&r<=y){
seg[rt].push_back(id);
return;
}
if(mid>=x){
add(x,y,id,l,mid,ls);
}
if(mid<y){
add(x,y,id,mid+1,r,rs);
}
return;
}
void dfs(int l,int r,int rt){
bool cnt=false;
for(int i=0;i<seg[rt].size();i++){
merge((sx[seg[rt][i]]<<1)-1,sy[seg[rt][i]]<<1);
merge(sx[seg[rt][i]]<<1,(sy[seg[rt][i]]<<1)-1);
if(ans&&get((sx[seg[rt][i]]<<1)-1)==get(sx[seg[rt][i]]<<1)){
cnt=true;
ans=false;
}
}
if(l==r){
if(ans){
cout<<"Yes\n";
}
else{
cout<<"No\n";
}
}
else{
dfs(l,mid,ls);
dfs(mid+1,r,rs);
}
for(int i=0;i<(seg[rt].size()<<1);i++){
undo();
}
if(cnt){
ans=true;
}
return;
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=(1<<n);i++){
fa[i]=i;
dep[i]=1;
}
for(int i=1;i<=m;i++){
int l,r;
cin>>sx[i]>>sy[i]>>l>>r;
if(l<r){
add(l+1,r,i,1,k,1);
}
}
dfs(1,k,1);
return 0;
}