RT,交一发发现全RE,查出来是sort的锅。求助各路大佬
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#define rep(i,n) for(int i=1;i<=n;++i)
#define pb push_back
#define l(x) (x-1)*blk+1
#define r(x) min(m+q,x*blk)
#define getblk(x) ((x+blk-1)/blk)
using namespace std;
const int N=5e4+7,M=1e5+7,blk=300;
vector<int>pv[N];
struct tup{
int v,a,b;
};
vector<tup>G[N];
struct nd{
int u,v,a,b,id;
}e[M+N];
int fa[N],n,m,q,ans[N],vis[N],jkl,pos[N],mxa[N],mxb[N];
bool cmpa(nd a,nd b){
if(a.a!=b.a)return a.a<b.a;
return a.b<b.b;
}
bool cmpb(nd a,nd b){
if(a.b!=b.b)return a.b<b.b;
return b.id!=0;
}
int find(int a){
if(fa[a]==a)return a;
return fa[a]=find(fa[a]);
}
void U(int a,int b,int _,int __){
a=find(a);b=find(b);fa[a]=b;mxa[b]=max(mxa[b],mxa[a]);
mxb[b]=max(mxb[b],mxb[a]);
mxa[b]=max(mxa[b],_);
mxb[b]=max(mxb[b],__);
}
tup bfs(int s,int t){
queue<int>q;s=find(s);t=find(t);
q.push(s);vis[s]=jkl;int ma(0),mb(0);
while(!q.empty()){
int u=q.front();q.pop();ma=max(ma,mxa[find(u)]);
mb=max(mb,mxb[find(u)]);
for(auto V:G[u]){
int v=V.v,a=V.a,b=V.b;ma=max(ma,a),mb=max(mb,b);
if(vis[v]!=jkl)q.push(v),vis[v]=jkl;
}
}
return {vis[t]==jkl,ma,mb};
}
main(){
cin>>n>>m;
rep(i,m){
cin>>e[i].u>>e[i].v>>e[i].a>>e[i].b;
}
cin>>q;
rep(i,q){
e[m+i].id=i;
cin>>e[m+i].u>>e[m+i].v>>e[m+i].a>>e[m+i].b;
}
sort(e+1,e+1+m+q,cmpa);
rep(i,(m+q+blk-1)/blk){
rep(j,n)fa[j]=j;
rep(o,i)pos[o]=l(o),mxa[o]=mxb[o]=0;
cout<<l(i)<<' '<<r(i)<<'\n';
sort(e+l(i),e+r(i)+1,cmpb);
cout<<"sort没挂\n";
for(int j=l(i);j<=r(i);++j)
if(e[j].id)pv[i].pb(j);
for(auto v:pv[i]){
rep(o,i-1){
while(pos[o]<=r(o)&&e[pos[o]].b<=e[v].b){
if(e[pos[o]].id){++pos[o];continue;}
U(e[pos[o]].u,e[pos[o]].v,e[pos[o]].a,e[pos[o]].b),++pos[o];
}
}
for(int j=l(i);j<=r(i);++j){
int x=find(e[j].u),y=find(e[j].v);
if(e[j].id)continue;
if(e[j].a<=e[v].a&&e[j].b<=e[v].b)
G[x].pb({y,e[j].a,e[j].b}),G[y].pb({x,e[j].a,e[j].b});
}
++jkl;
auto tmp=bfs(e[v].u,e[v].v);
for(int j=l(i);j<=r(i);++j)
G[find(e[j].u)].clear(),G[find(e[j].v)].clear();
if(!tmp.v)continue;
ans[e[v].id]=(tmp.a==e[v].a&&tmp.b==e[v].b);
}
}
rep(i,q)printf("%s\n",ans[i]?"Yes":"No");
return 0;
}