#include #define MAXN 100001 #pragma GCC optimize ("O3") using namespace std; struct node{ int x=0; bool mst=false; }; struct durvnode{ int x=0,stx=0,sty=0; }; struct hamnode{ bool imali=false; int prev=-1,prevmask=-1; }; time_t start,endd; vector rebra[MAXN]; bool artt[MAXN]; vector durvreb[MAXN]; long long st[MAXN],st1[MAXN]; bool done=false; int n,m,dayind[MAXN],realst[MAXN],realstind=1,startnode=1; vector day,vrebra[MAXN]; int in[MAXN],nv[MAXN],vr=0,mstind=0; bool g[MAXN],finall=false,gg[MAXN]; pair mostove[MAXN]; void dfsmst(int x,int p,int ind){ in[x]=vr; g[x]=true; nv[x]=vr; bool flag=false; int deca=0; vr++; int pi; for(int i=0;i=in[x]){ flag=true; } nv[x]=min(nv[x],nv[rebra[x][i].x]); } } if(((x==1) && (deca>1)) || ((x!=1) && (flag==true))){ artt[x]=true; } if(nv[x]>=in[x] && p!=-1){ // cout<> izh[MAXN]; bool globalg[MAXN]; void addtopath(int x){ day.push_back(x); daysz++; if(daysz!=1){ vrebra[x].push_back(day[daysz-2]); vrebra[day[daysz-2]].push_back(x); } // cout< bfs; int y=0,sz; bfs.push(x); g[x]=true; bool sv=false; sz=izh[x].size(); while(sz!=0 && (izh[x][sz-1].first==forb || durvg[izh[x][sz-1].first])){ // if(x==12) cout<=0;i--){ addtopath(obh[i]); if(done) break; } int retval=izh[y][izh[y].size()-1].second; izh[y].pop_back(); return retval; } int dist[MAXN]; int deqbfs(int curr,bool nextd){ for(int i=0;i<=n;i++){ par[i]=0; dist[i]=0; g[i]=false; } queue bfs,bfs1; bfs.push(curr); g[curr]=true; dist[curr]=0; bool sv=false; int mxdist=0,mxi=curr; while(!bfs.empty() || !bfs1.empty()){ int fron; if(bfs1.empty()){ fron=bfs.front(); bfs.pop(); }else{ fron=bfs1.front(); bfs1.pop(); } // cout<<"vlizam "<=mxdist){ mxdist=dist[to]; mxi=to; } g[to]=true; par[to]=fron; }else{ bool da=false; int nzd=par[fron]; while(nzd!=curr){ if(to==nzd){ da=true; break; } nzd=par[nzd]; } if(to==curr) continue; if(da) continue; if(dist[par[to]]=mxdist){ mxdist=dist[to]; mxi=to; } } } } } if(mxdist==0) return curr; //if(nextd) dayind++; int y=mxi,ind=0; while(y!=curr){ obh[ind]=y; ind++; y=par[y]; } for(int i=ind-1;i>=0;i--){ addtopath(obh[i]); if(done) break; } return mxi; } pair bfsnaob(int curr,int x,bool blockuse){ queue bfs; int y,sz; for(int i=0;i<=n;i++){ par[i]=0; globalg[i]=false; } bfs.push(x); globalg[x]=true; /*if(curr==x){ // cout< ass=bfsnaob(cur1,curr,true); if(!ass.first) ass=bfsnaob(cur1,curr,false); int y=ass.second,ind=0; while(y!=curr){ // cout<=1;i--){ // cout< bfs; bfs.push(x); int broqch=0; g[x]=true; while(!bfs.empty()){ int fron=bfs.front(); realst[fron]=broqch; broqch++; bfs.pop(); for(int i=0;i currmass[5*MAXN]; int curr; pair rebs[MAXN*5]; void dfsdurv(int x,int p){ //x=prin[curr]; // cout<<"\n"<3) break; for(int i1=1;i1<=n;i1++){ g[i1]=false; } long long myscore=0,myscore1=0; prestigebfs(i); for(int i1=1;i120){ finall=true; for(int i=1;i<=n;i++){ cout<1 && day[day.size()-1]==startnode && !da) ds--; if(i==0) cout<>n>>m; for(int i=0;i>st[i]; st1[i]=st[i]; } sort(st,st+n); sort(st1,st1+n,greater()); for(int i=0;i>x>>y; node n1,n2; n1.x=y; n2.x=x; rebs[i]={x,y}; rebra[x].push_back(n1); rebra[y].push_back(n2); x--; y--; if(n<=20){ rebex[x][y]=true; rebex[y][x]=true; } } // cout<<"vlizam\n"; if(n>15 || !Hamiltonian_path()){ dfsmst(1,-1,-1); for(int i=1;i<=n;i++){ g[i]=false; } int ind=1; for(int i=1;i<=n;i++){ if(!g[i]){ dfs(i,ind,i); ind++; } } int indd=1; for(int i=1;i<=n;i++){ if(isprin[prin[i]]==0){ isprin[prin[i]]=indd; preds[indd]=i; indd++; } prin[i]=isprin[prin[i]]; //cout<100){ q=1; z=150; pll=n/z; } for(int i2=1;i2<=q;i2++){ srand(i2*mnoj+nach); for(int i0=1;i0<=n;i0+=pll){ startnode=i0; curr=startnode; int qq=testdfs(startnode,-1); if(ima){ int x=lst; while(x!=-1){ addtopath(x); x=par[x]; } for(int i=0;i