luogu过了,loj过不了
#include"werewolf.h"
#include<bits/stdc++.h>
#define ls Tree[p].lc
#define rs Tree[p].rc
using namespace std;
const int MAXN=2e5+5;
int n,m,q;
int x,y;
int s,t,l,r;
struct Edge{
int u,v;
int val;
}edge1[MAXN*3],edge2[MAXN*3];
bool cmp1(Edge xs,Edge ys)
{
return xs.val>ys.val;
}
bool cmp2(Edge xs,Edge ys)
{
return xs.val<ys.val;
}
int fa[2*MAXN];
int find(int x)
{
if(fa[x]==x)
{
return x;
}
fa[x]=find(fa[x]);
return fa[x];
}
vector<int>g1[2*MAXN];
vector<int>g2[2*MAXN];
int a1[2*MAXN];
int a2[2*MAXN];
int Rel1[2*MAXN];
int Siz1[2*MAXN];
int cnt_dfn1;
int dfn1[2*MAXN];
int dp1[2*MAXN][25];
void dfs1(int x,int f)
{
// printf("%d %d?\n",x,f);
dp1[x][0]=f;
for(int i=1;i<=20;i++)
{
dp1[x][i]=dp1[dp1[x][i-1]][i-1];
}
Siz1[x]=1;
++cnt_dfn1;
dfn1[x]=cnt_dfn1;
Rel1[cnt_dfn1]=x;
for(int i=0;i<g1[x].size();i++)
{
int v=g1[x][i];
if(v==f)
{
continue;
}
dfs1(v,x);
Siz1[x]+=Siz1[v];
}
}
int Rel2[2*MAXN];
int Siz2[2*MAXN];
int cnt_dfn2;
int dfn2[2*MAXN];
int dp2[2*MAXN][25];
void dfs2(int x,int f)
{
// printf("%d %d?\n",x,f);
dp2[x][0]=f;
for(int i=1;i<=20;i++)
{
dp2[x][i]=dp2[dp2[x][i-1]][i-1];
}
Siz2[x]=1;
++cnt_dfn2;
dfn2[x]=cnt_dfn2;
Rel2[cnt_dfn2]=x;
for(int i=0;i<g2[x].size();i++)
{
int v=g2[x][i];
if(v==f)
{
continue;
}
dfs2(v,x);
Siz2[x]+=Siz2[v];
}
}
struct Seg{
int lc,rc;
int date;
}Tree[MAXN*20];
int cntf=0;
int New()
{
++cntf;
Tree[cntf].lc=0;
Tree[cntf].rc=0;
Tree[cntf].date=0;
return cntf;
}
int copy(int p)
{
++cntf;
Tree[cntf]=Tree[p];
return cntf;
}
int update(int p,int l,int r,int k,int x)
{
p=copy(p);
Tree[p].date+=x;
if(l==r)
{
return p;
}
int mid=(l+r)>>1;
if(k<=mid)
{
ls=update(ls,l,mid,k,x);
}
else
{
rs=update(rs,mid+1,r,k,x);
}
return p;
}
int rt[MAXN*2];
int Query(int p,int l,int r,int ql,int qr)
{
if(!p)
{
return 0;
}
if(l>=ql&&r<=qr)
{
return Tree[p].date;
}
// printf("%d %d %d %d %d???????\n",p,l,r,ql,qr);
int mid=(l+r)>>1;
int Res=0;
if(ql<=mid)
{
Res+=Query(ls,l,mid,ql,qr);
}
if(qr>mid)
{
Res+=Query(rs,mid+1,r,ql,qr);
}
return Res;
}
vector<int>check_validity(int N, vector<int>X, vector<int>Y, vector<int>S, vector<int> T, vector<int> L, vector<int> R)
{
n=N;
m=X.size();
q=S.size();
for(int i=1;i<=m;i++)
{
x=X[i-1];
y=Y[i-1];
x++;
y++;
edge1[i].u=x;
edge1[i].v=y;
edge1[i].val=min(x,y);
edge2[i].u=x;
edge2[i].v=y;
edge2[i].val=max(x,y);
}
sort(edge1+1,edge1+1+m,cmp1);
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
int cnt_node1=n;
for(int i=1;i<=m;i++)
{
int ex=find(edge1[i].u);
int ey=find(edge1[i].v);
if(ex==ey)
{
continue;
}
++cnt_node1;
fa[cnt_node1]=cnt_node1;
g1[cnt_node1].push_back(ex);
g1[cnt_node1].push_back(ey);
a1[cnt_node1]=edge1[i].val;
fa[ex]=cnt_node1;
fa[ey]=cnt_node1;
}
int cnt_node2=n;
for(int i=1;i<=cnt_node1;i++)
{
fa[i]=i;
}
sort(edge2+1,edge2+1+m,cmp2);
for(int i=1;i<=m;i++)
{
int ex=find(edge2[i].u);
int ey=find(edge2[i].v);
if(ex==ey)
{
continue;
}
++cnt_node2;
fa[cnt_node2]=cnt_node2;
g2[cnt_node2].push_back(ex);
g2[cnt_node2].push_back(ey);
a2[cnt_node2]=edge2[i].val;
fa[ex]=cnt_node2;
fa[ey]=cnt_node2;
}
dfs1(cnt_node1,0);
dfs2(cnt_node2,0);
for(int i=1;i<=cnt_node1;i++)
{
if(Rel1[i]<=n)
{
rt[i]=update(rt[i-1],1,cnt_node2,dfn2[Rel1[i]],1);
}
else
{
rt[i]=rt[i-1];
}
}
a1[0]=0;
a2[0]=n+1;
vector<int>Ans;
Ans.clear();
for(int fd=0;fd<q;fd++)
{
s=S[fd];
t=T[fd];
l=L[fd];
t=R[fd];
s++;
t++;
l++;
r++;
for(int i=20;i>=0;i--)
{
if(a1[dp1[s][i]]>=l)
{
s=dp1[s][i];
}
}
for(int i=20;i>=0;i--)
{
if(a2[dp2[t][i]]<=r)
{
t=dp2[t][i];
}
}
int L1=dfn1[s]-1,R1=dfn1[s]+Siz1[s]-1;
int L2=dfn2[t],R2=dfn2[t]+Siz2[t]-1;
int G=Query(rt[R1],1,cnt_node2,L2,R2)-Query(rt[L1],1,cnt_node2,L2,R2);
if(G)
{
Ans.push_back(1);
}
else
{
Ans.push_back(0);
}
}
return Ans;
}
#include<bits/stdc++.h>
#define ls Tree[p].lc
#define rs Tree[p].rc
using namespace std;
const int MAXN=2e5+5;
int n,m,q;
int x,y;
int s,t,l,r;
struct Edge{
int u,v;
int val;
}edge1[MAXN*3],edge2[MAXN*3];
bool cmp1(Edge xs,Edge ys)
{
return xs.val>ys.val;
}
bool cmp2(Edge xs,Edge ys)
{
return xs.val<ys.val;
}
int fa[2*MAXN];
int find(int x)
{
if(fa[x]==x)
{
return x;
}
fa[x]=find(fa[x]);
return fa[x];
}
vector<int>g1[2*MAXN];
vector<int>g2[2*MAXN];
int a1[2*MAXN];
int a2[2*MAXN];
int Rel1[2*MAXN];
int Siz1[2*MAXN];
int cnt_dfn1;
int dfn1[2*MAXN];
int dp1[2*MAXN][25];
void dfs1(int x,int f)
{
// printf("%d %d?\n",x,f);
dp1[x][0]=f;
for(int i=1;i<=20;i++)
{
dp1[x][i]=dp1[dp1[x][i-1]][i-1];
}
Siz1[x]=1;
++cnt_dfn1;
dfn1[x]=cnt_dfn1;
Rel1[cnt_dfn1]=x;
for(int i=0;i<g1[x].size();i++)
{
int v=g1[x][i];
if(v==f)
{
continue;
}
dfs1(v,x);
Siz1[x]+=Siz1[v];
}
}
int Rel2[2*MAXN];
int Siz2[2*MAXN];
int cnt_dfn2;
int dfn2[2*MAXN];
int dp2[2*MAXN][25];
void dfs2(int x,int f)
{
// printf("%d %d?\n",x,f);
dp2[x][0]=f;
for(int i=1;i<=20;i++)
{
dp2[x][i]=dp2[dp2[x][i-1]][i-1];
}
Siz2[x]=1;
++cnt_dfn2;
dfn2[x]=cnt_dfn2;
Rel2[cnt_dfn2]=x;
for(int i=0;i<g2[x].size();i++)
{
int v=g2[x][i];
if(v==f)
{
continue;
}
dfs2(v,x);
Siz2[x]+=Siz2[v];
}
}
struct Seg{
int lc,rc;
int date;
}Tree[MAXN*20];
int cntf=0;
int New()
{
++cntf;
Tree[cntf].lc=0;
Tree[cntf].rc=0;
Tree[cntf].date=0;
return cntf;
}
int copy(int p)
{
++cntf;
Tree[cntf]=Tree[p];
return cntf;
}
int update(int p,int l,int r,int k,int x)
{
p=copy(p);
Tree[p].date+=x;
if(l==r)
{
return p;
}
int mid=(l+r)>>1;
if(k<=mid)
{
ls=update(ls,l,mid,k,x);
}
else
{
rs=update(rs,mid+1,r,k,x);
}
return p;
}
int rt[MAXN*2];
int Query(int p,int l,int r,int ql,int qr)
{
if(!p)
{
return 0;
}
if(l>=ql&&r<=qr)
{
return Tree[p].date;
}
// printf("%d %d %d %d %d???????\n",p,l,r,ql,qr);
int mid=(l+r)>>1;
int Res=0;
if(ql<=mid)
{
Res+=Query(ls,l,mid,ql,qr);
}
if(qr>mid)
{
Res+=Query(rs,mid+1,r,ql,qr);
}
return Res;
}
int main()
{
scanf("%d %d %d",&n,&m,&q);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
x++;
y++;
edge1[i].u=x;
edge1[i].v=y;
edge1[i].val=min(x,y);
edge2[i].u=x;
edge2[i].v=y;
edge2[i].val=max(x,y);
// printf("%d %d\n",x,y);
}
sort(edge1+1,edge1+1+m,cmp1);
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
int cnt_node1=n;
// printf("---\n");
// for(int i=1;i<=m;i++)
// {
// printf("%d %d\n",edge1[i].u,edge1[i].v);
// }
// printf("------\n");
for(int i=1;i<=m;i++)
{
int ex=find(edge1[i].u);
int ey=find(edge1[i].v);
if(ex==ey)
{
continue;
}
++cnt_node1;
fa[cnt_node1]=cnt_node1;
g1[cnt_node1].push_back(ex);
g1[cnt_node1].push_back(ey);
a1[cnt_node1]=edge1[i].val;
fa[ex]=cnt_node1;
fa[ey]=cnt_node1;
// printf("%d %d\n",cnt_node1,ex);
// printf("%d %d\n",cnt_node1,ey);
}
//printf("-----\n");
int cnt_node2=n;
for(int i=1;i<=cnt_node1;i++)
{
fa[i]=i;
}
sort(edge2+1,edge2+1+m,cmp2);
for(int i=1;i<=m;i++)
{
int ex=find(edge2[i].u);
int ey=find(edge2[i].v);
if(ex==ey)
{
continue;
}
++cnt_node2;
fa[cnt_node2]=cnt_node2;
g2[cnt_node2].push_back(ex);
g2[cnt_node2].push_back(ey);
a2[cnt_node2]=edge2[i].val;
fa[ex]=cnt_node2;
fa[ey]=cnt_node2;
// printf("%d %d\n",cnt_node2,ex);
// printf("%d %d\n",cnt_node2,ey);
}
dfs1(cnt_node1,0);
dfs2(cnt_node2,0);
for(int i=1;i<=cnt_node1;i++)
{
if(Rel1[i]<=n)
{
rt[i]=update(rt[i-1],1,cnt_node2,dfn2[Rel1[i]],1);
// printf("%d %d %d\n",i,dfn2[Rel1[i]],Rel1[i]);
}
else
{
rt[i]=rt[i-1];
}
}
a1[0]=0;
a2[0]=n+1;
while(q--)
{
scanf("%d %d %d %d",&s,&t,&l,&r);
s++;
t++;
l++;
r++;
// printf("%d???\n",a1[10]);
for(int i=20;i>=0;i--)
{
if(a1[dp1[s][i]]>=l)
{
s=dp1[s][i];
}
}
for(int i=20;i>=0;i--)
{
if(a2[dp2[t][i]]<=r)
{
t=dp2[t][i];
}
}
// printf("%d %d?\n",s,t);
int L1=dfn1[s]-1,R1=dfn1[s]+Siz1[s]-1;
int L2=dfn2[t],R2=dfn2[t]+Siz2[t]-1;
int G=Query(rt[R1],1,cnt_node2,L2,R2)-Query(rt[L1],1,cnt_node2,L2,R2);
// printf("%d %d??????\n",Query(rt[R1],1,cnt_node2,L2,R2),Query(rt[L1],1,cnt_node2,L2,R2));
// printf("%d %d ???\n",Tree[rt[R1]].date,Tree[rt[L1]].date);
// printf("%d %d %d %d %d?\n",L1,R1,L2,R2,cnt_node2);
if(G)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
}