QwQ不知道为什么写挂了呜呜呜
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Edge{
int v,to;
}e[2000005];
int n,m,tot,cnt;
long long maxn[1000005],minx[1000005];
int b[1000005],vis[1000005],head[1000005];
void addedge(int u,int v)
{
tot++;
e[tot].v=v;
e[tot].to=head[u];
head[u]=tot;
}
void dfs(int x)
{
cnt++;
b[cnt]=x;
vis[x]=1;
for(int i=head[x];i;i=e[i].to)
{
int v=e[i].v;
if(!vis[v])dfs(v);
}
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
int t;cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
head[i]=vis[i]=0;
for(int i=1;i<=m;i++)
{
int u,v;cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
for(int i=1;i<=n;i++)
{
if(vis[i])continue;
cnt=0;dfs(i);
// cout<<"size"<<i<<":"<<cnt<<'\n';//调试
int ma=0,mi=n+1;
for(int j=1;j<=cnt;j++)
mi=min(mi,b[j]),ma=max(ma,b[j]);
for(int j=1;j<=cnt;j++)
maxn[b[j]]=ma,minx[b[j]]=mi;
}
long long ans=LLONG_MAX;
for(int i=1;i<=n;i++)
{
// cout<<i<<" max:"<<maxn[i]<<" min:"<<minx[i]<<'\n';//调试
ans=min(ans,abs(minx[n]-maxn[i])*abs(minx[n]-maxn[i])+abs(minx[i]-maxn[1])*abs(minx[i]-maxn[1]));
}
ans=min(ans,abs(minx[n]-maxn[1])*abs(minx[n]-maxn[1]));
if(maxn[1]==n)ans=0;
cout<<ans<<'\n';
}
return 0;
}