我算我这个整体二分的复杂度是 O(nlog22n) 的,请问是哪里算挂了吗,T 了 4 个点。
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
il int read()
{
int re=0,k=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){re=re*10+ch-48;ch=getchar();}
return re*k;
}
il void write(int x)
{
if(x<0)return putchar('-'),write(-x),void();
if(x<10)return putchar(x+'0'),void();
return write(x/10),putchar(x%10+'0'),void();
}
int n,m,q;
struct st{
int x,y;
}Q[100005];
int ans[100005];
vector<st> e[100005];
int fa[100005],sz[100005];
int s[100005],ls;
int a[100005],b[100005];
int find(int x)
{
if(x==fa[x])return x;
return find(fa[x]);
}
void merge(int u,int v)
{
if(u==v)return;
if(sz[u]>sz[v])
swap(u,v);
fa[u]=v;
sz[v]+=sz[u];
s[++ls]=u;
}
void redo()
{
sz[fa[s[ls]]]-=sz[s[ls]];
fa[s[ls]]=s[ls];
ls--;
}
void sol(int l,int r,int ll,int rr)
{
if(l>r||ll>rr)return;
if(l==r)
{
int las=ls;
for(rg int j=0;j<e[l].size();j++)
{
merge(find(e[l][j].x),find(e[l][j].y));
}
for(rg int i=ll;i<=rr;i++)
{
if(find(Q[a[i]].x)==find(Q[a[i]].y))ans[a[i]]=l;
}
while(ls>las)redo();
return;
}
int mid=(l+r)>>1;
int las=ls;
for(rg int i=r;i>mid;i--)
{
for(rg int j=0;j<e[i].size();j++)
{
merge(find(e[i][j].x),find(e[i][j].y));
}
}
int t1=ll,t2=rr;
for(rg int i=ll;i<=rr;i++)
{
if(find(Q[a[i]].x)==find(Q[a[i]].y))
b[t2--]=a[i];
else b[t1++]=a[i];
}
for(rg int i=ll;i<=rr;i++)
a[i]=b[i];
sol(l,mid,ll,t2);
while(ls>las)redo();
sol(mid+1,r,t1,rr);
}
signed main()
{
n=read();m=read();
for(rg int i=1;i<=n;i++)
fa[i]=i;
for(rg int i=1,u,v,w;i<=m;i++)
{
u=read();v=read();w=read();
e[w].push_back((st){u,v});
}
q=read();
for(rg int i=1,u,v;i<=q;i++)
{
Q[i].x=read();Q[i].y=read();
}
for(rg int i=1;i<=q;i++)
ans[i]=-1,a[i]=i;
sol(0,100000,1,q);
for(rg int i=1;i<=q;i++)
{
write(ans[i]);puts("");
}
}