rt,TLE50,不知道哪里有问题,求改改/kel
#include<bits/stdc++.h>
using namespace std;
int B;
inline int get(int x){return (x+B-1)/B;}
int n,q,m;
inline int getr(int x){return x*B>=m?m:x*B;}
inline int getl(int x){return (x-1)*B+1;}
struct edge{int u,v,a,b;}e[200005];
bool cmp(edge x,edge y){return x.a<y.a;}
bool cmp3(edge x,edge y){return x.b<y.b;}
edge ee[200005];
int ecnt;
struct query{int u,v,a,b,id;}qu[200005];
bool cmp2(query x,query y){return x.b<y.b;}
bool ans[200005];
int cntb,bmi[200005],bma[200005];
struct dsu
{
struct node{int fau,fav,sizfau,maafau,mabfau,fafav;}stk[200005];
int top;
int fa[200005];
int siz[200005];
int maa[200005],mab[200005];
int find(int x){if(x!=fa[x])return find(fa[x]);return x;}
void init(int n){top=0;for(int i=1;i<=n;i++)fa[i]=i,siz[i]=1,maa[i]=mab[i]=-1e9;}
void merge(edge x)
{
int u=x.u,v=x.v;
int fau=find(u),fav=find(v);
if(fau==fav)
{
node change;
change.fau=fau;
change.fav=fav;
change.fafav=fa[fav];
change.maafau=maa[fau];
change.mabfau=mab[fau];
change.sizfau=siz[fau];
stk[++top]=change;
maa[fau]=max(maa[fau],x.a);
mab[fau]=max(mab[fau],x.b);
return;
}
if(siz[fau]<siz[fav])swap(fau,fav);
node change;
change.fau=fau;
change.fav=fav;
change.fafav=fa[fav];
change.maafau=maa[fau];
change.mabfau=mab[fau];
change.sizfau=siz[fau];
stk[++top]=change;
fa[fav]=fau;
maa[fau]=max(maa[fau],maa[fav]);
maa[fau]=max(maa[fau],x.a);
mab[fau]=max(mab[fau],mab[fav]);
mab[fau]=max(mab[fau],x.b);
siz[fau]+=siz[fav];
}
void undo()
{
node change=stk[top];
top--;
fa[change.fav]=change.fafav;
maa[change.fau]=change.maafau;
mab[change.fau]=change.mabfau;
siz[change.fau]=change.sizfau;
}
bool getans(query x)
{
int u=x.u,v=x.v;
int fau=find(u),fav=find(v);
if(fau!=fav)return false;
if(maa[fau]!=x.a)return false;
if(mab[fau]!=x.b)return false;
return true;
}
}akari;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].a,&e[i].b);
scanf("%d",&q);
B=max((int)(1.0*m/sqrt(q))-100,1);
sort(e+1,e+m+1,cmp);
cntb=get(m);
for(int i=1;i<=cntb;i++)bmi[i]=e[getl(i)].a,bma[i]=e[getr(i)].a;
for(int i=1;i<=q;i++)scanf("%d%d%d%d",&qu[i].u,&qu[i].v,&qu[i].a,&qu[i].b),qu[i].id=i;
sort(qu+1,qu+q+1,cmp2);
akari.init(n);
for(int i=1;i<=cntb;i++)
{
int posa=0;
for(int j=1;j<=q;j++)
{
if((bmi[i]<=qu[j].a&&qu[j].a<=bma[i])||(i==cntb&&qu[j].a>bma[i]))
{
while(posa<ecnt&&ee[posa+1].b<=qu[j].b)akari.merge(ee[++posa]);
int nowtop=akari.top;
for(int k=getl(i);k<=getr(i);k++)
if(e[k].a<=qu[j].a&&e[k].b<=qu[j].b)
akari.merge(e[k]);
ans[qu[j].id]=akari.getans(qu[j]);
while(akari.top>nowtop)akari.undo();
}
}
akari.init(n);
int qwq=ecnt;
int posl=1,posr=qwq;
for(int j=getl(i);j<=getr(i);j++)ee[++ecnt]=e[j];
sort(ee+1,ee+ecnt+1,cmp3);
}
for(int i=1;i<=q;i++)puts(ans[i]?"Yes":"No");
return 0;
}