rt,调2h了,求救!qwq
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i <= b; i++)
const int N=2e5+10;
int fa[N<<1],n,m,q;
int find(int x){
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
int f[N<<1][24],ls[N<<1],rs[N<<1];
int l[N<<1],r[N<<1];
int val[N<<1];
void con(int x,int y,int k){
x=find(x),y=find(y);
f[x][0]=f[y][0]=k;
fa[x]=k;fa[y]=k;fa[k]=k;
ls[k]=x;rs[k]=y;
}
void init(){
for(int k=23;k;k--){
rep(i,1,n<<1){
f[i][k]=f[f[i][k-1]][k-1];
}
}
}
int tot=0;//n
int xxs=0;
int xl[N<<1];
int bxl[N<<1];
int ys[N<<1],tp[N<<1];
void dfs(int x){//1-n find dfs
if(!ls[x]&&!rs[x]){
l[x]=r[x]=++xxs;
xl[xxs]=x;
return;
}
dfs(ls[x]),dfs(rs[x]);
l[x]=l[ls[x]];
r[x]=r[rs[x]];
}
void cls(){
rep(i,0,n<<1)fa[i]=i,ls[i]=rs[i]=l[i]=r[i]=val[i]=xl[i]=tot=xxs=0;
rep(k,0,23)rep(i,1,n<<1)f[i][k]=0;
}
struct edge{
int u,v;
};
edge E[N];
struct quiz{
int s,e,l,r;
int l1,r1,l2,r2;
int id,ans;
};
quiz Q[N];
struct hjt{
int ls[N<<5],rs[N<<5],sz[N<<5],rt[N<<1];
int tott=0;
void pushup(int x){
sz[x]=sz[ls[x]]+sz[rs[x]];
}
void ins(int &x,int h,int p,int l,int r){
int mid=l+r>>1;
x=++tott;
ls[x]=ls[h];
rs[x]=rs[h];
sz[x]=sz[h];
if(l==r){
sz[x]++;
return;
}
if(p<=mid)ins(ls[x],ls[h],p,l,mid);
if(p>mid)ins(rs[x],rs[h],p,mid+1,r);
pushup(x);
}
int sum(int x,int L,int R,int l,int r){
int mid=l+r>>1;
if(L<=l&&r<=R){
return sz[x];
}
int ret=0;
if(L<=mid){
ret+=sum(ls[x],L,R,l,mid);
}
if(R>mid){
ret+=sum(rs[x],L,R,mid+1,r);
}return ret;
}
};
hjt tree;
signed main(){
//ios::sync_with_stdio(0);
cin>>n>>m>>q;
rep(i,1,m){
int u,v;
cin>>u>>v;
E[i]={u+1,v+1};
}
rep(i,1,q){
cin>>Q[i].s>>Q[i].e>>Q[i].l>>Q[i].r;
Q[i].s++;Q[i].e++;Q[i].l++;Q[i].r++;
}
//
cls();
rep(i,1,n)val[i]=i;
sort(E+1,E+m+1,[](edge a,edge b){
return max(a.u,a.v)<max(b.u,b.v);
});
tot=n;
rep(i,1,m){
if(find(E[i].u)==find(E[i].v))continue;
con(E[i].u,E[i].v,++tot);
val[tot]=max(E[i].u,E[i].v);
}
init();
dfs(tot);
rep(i,1,q){
int s=Q[i].e;
int xd=Q[i].r;
for(int k=23;k>=0;k--){
int w=f[s][k];
if(!w)continue;
if(val[w]<=xd)s=w;
}
Q[i].l2=l[s];
Q[i].r2=r[s];
}
//
rep(i,1,n<<1)bxl[i]=xl[i];
//
cls();
rep(i,1,n)val[i]=i;
sort(E+1,E+m+1,[](edge a,edge b){
return min(a.u,a.v)>min(b.u,b.v);
});
tot=n;
rep(i,1,m){
if(find(E[i].u)==find(E[i].v))continue;
con(E[i].u,E[i].v,++tot);
val[tot]=min(E[i].u,E[i].v);
}
init();
dfs(tot);
rep(i,1,q){
int s=Q[i].s;
int xd=Q[i].l;
for(int k=23;k>=0;k--){
int w=f[s][k];
if(!w)continue;
if(val[w]>=xd)s=w;
}
Q[i].l1=l[s];
Q[i].r1=r[s];
}
rep(i,1,q)Q[i].id=i;
rep(i,1,n){
tp[xl[i]]=i;
}
rep(i,1,n){
ys[i]=tp[bxl[i]];
tree.ins(tree.rt[i],tree.rt[i-1],ys[i],1,n);
}
rep(i,1,q){
auto w=tree.sum(tree.rt[Q[i].r2],Q[i].l1,Q[i].r1,1,n)-tree.sum(tree.rt[Q[i].l2-1],Q[i].l1,Q[i].r1,1,n);
if(w)puts("1");
else puts("0");
}
}