#include #define endl '\n' #define ll long long #define fi first #define se second #define int long long using namespace std; const int MAXN=1e5+5; mt19937 mt(rand()); int n,m; int a[MAXN]; vector w; ll val[MAXN]; vector edges[MAXN]; ll S,minS=2e18; vector solW; vector solPath; vector adj[MAXN]; vector tr[MAXN]; vector bck[MAXN]; int par[MAXN]; int depth[MAXN]; int roots[MAXN]; vector path; bool used[MAXN]; int usedCnt=0; int ptr[MAXN]; vector order; int out[MAXN]; int pos; int minDepth; int curR; void dfs1(int v) { for(int i=0;iout[tr[v][ptr[v]]]) continue; contPath(tr[v][ptr[v]]); if(path.back()==-1) return; } if(par[v]!=path[path.size()-2]) { contPath(par[v]); if(path.back()==-1) return; } if(pos>out[curR]) { for(int i=0;idepth[y]; } void find_path(int v) { depth[v]=1; par[v]=-1; dfs1(v); for(int i=1;i<=n;i++) sort(bck[i].begin(), bck[i].end(), cmp); dfs2(v); int cur=v; add(cur); while(tr[cur].size()>0) { cur=tr[cur][0]; add(cur); } path.push_back(-1); while(usedCnt > swp(int u,int v) { ll ret=val[u]+val[v]; ll newu=0; ll newv=0; for(int i=0;i>n>>m; for(int i=0;i>a[i]; for(int i=0;i>u>>v; adj[u].push_back(v); adj[v].push_back(u); } sort(a,a+n); w.resize(n+1); iota(roots,roots+n,1); shuffle(roots,roots+n,mt); for(int rt=0;rt tmp; for(int i=0;i