{"model_name":"claude-4.6-sonnet-medium","codes":{"1":{"ahc001":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN = 205;\nint n, px[MAXN], py[MAXN];\nlong long pr[MAXN];\nint ra[MAXN], rb[MAXN], rc[MAXN], rd[MAXN];\n\nvoid solve(vector<int> comp, int x1, int y1, int x2, int y2) {\n    int nc = (int)comp.size();\n    if (nc == 1) { int i=comp[0]; ra[i]=x1;rb[i]=y1;rc[i]=x2;rd[i]=y2; return; }\n    long long tr=0; for(int i:comp) tr+=pr[i];\n    vector<int> bx(comp), by(comp);\n    sort(bx.begin(),bx.end(),[](int a,int b){return px[a]<px[b];});\n    sort(by.begin(),by.end(),[](int a,int b){return py[a]<py[b];});\n    int best_kx=-1,best_sx=-1; double best_ex=1e18;\n    { long long pf=0; for(int k=1;k<nc;k++){pf+=pr[bx[k-1]];int cx=px[bx[k-1]],nx=px[bx[k]];if(cx>=nx)continue;int lo=max(cx+1,x1+1),hi=min(nx,x2-1);if(lo>hi)continue;int sx=(int)round(x1+(double)(x2-x1)*pf/tr);sx=max(lo,min(hi,sx));double e=fabs((double)pf/tr-(double)(sx-x1)/(x2-x1));if(e<best_ex){best_ex=e;best_sx=sx;best_kx=k;}}}\n    int best_ky=-1,best_sy=-1; double best_ey=1e18;\n    { long long pf=0; for(int k=1;k<nc;k++){pf+=pr[by[k-1]];int cy=py[by[k-1]],ny=py[by[k]];if(cy>=ny)continue;int lo=max(cy+1,y1+1),hi=min(ny,y2-1);if(lo>hi)continue;int sy=(int)round(y1+(double)(y2-y1)*pf/tr);sy=max(lo,min(hi,sy));double e=fabs((double)pf/tr-(double)(sy-y1)/(y2-y1));if(e<best_ey){best_ey=e;best_sy=sy;best_ky=k;}}}\n    if(best_kx==-1&&best_ky==-1){for(int i:comp){ra[i]=px[i];rb[i]=py[i];rc[i]=px[i]+1;rd[i]=py[i]+1;}return;}\n    bool use_x=(best_kx!=-1)&&(best_ky==-1||best_ex<=best_ey);\n    if(use_x){vector<int>L(bx.begin(),bx.begin()+best_kx),R(bx.begin()+best_kx,bx.end());solve(L,x1,y1,best_sx,y2);solve(R,best_sx,y1,x2,y2);}\n    else{vector<int>B(by.begin(),by.begin()+best_ky),T(by.begin()+best_ky,by.end());solve(B,x1,y1,x2,best_sy);solve(T,x1,best_sy,x2,y2);}\n}\n\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    cin>>n; for(int i=0;i<n;i++) cin>>px[i]>>py[i]>>pr[i];\n    vector<int> all(n); iota(all.begin(),all.end(),0);\n    solve(all,0,0,10000,10000);\n    for(int i=0;i<n;i++){\n        int x1=ra[i],y1=rb[i],x2=rc[i],y2=rd[i],W=x2-x1,H=y2-y1;\n        long long A=(long long)W*H,ri=pr[i]; int xi=px[i],yi=py[i];\n        if(A<=ri){cout<<x1<<\" \"<<y1<<\" \"<<x2<<\" \"<<y2<<\"\\n\";continue;}\n        double best_ratio=0.0; int bw=1,bh=1; bool done=false;\n        for(int w=1;w<=W&&!done;w++){long long h0=ri/w;for(int dh=0;dh<=1;dh++){long long hh=h0+dh;if(hh<1||hh>H)continue;long long area=(long long)w*hh;double ratio=(area<=ri)?(double)area/ri:(double)ri/area;if(ratio>best_ratio){best_ratio=ratio;bw=w;bh=(int)hh;if(best_ratio>=1.0-1e-9){done=true;break;}}}}\n        int a=max(x1,xi+1-bw),b=max(y1,yi+1-bh);\n        cout<<a<<\" \"<<b<<\" \"<<(a+bw)<<\" \"<<(b+bh)<<\"\\n\";\n    }\n    return 0;\n}","ahc002":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef chrono::steady_clock Clock;\nconst int N=50, MAXM=N*N+1;\nint si,sj,M,tid[N][N],pval[N][N];\nconst int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\nconst char dc[]={'U','D','L','R'};\nmt19937 rng;\nbool tu[MAXM],btu[MAXM];\nint pi_[MAXM],pj_[MAXM],pt_[MAXM],bpi[MAXM],bpj[MAXM],bpt[MAXM];\nchar pmv[MAXM],bpmv[MAXM];\nint plen,blen;long long cscore,bscore;int ci,cj;\nvoid save_best(){if(cscore<=bscore)return;bscore=cscore;blen=plen;memcpy(btu,tu,M);memcpy(bpi,pi_,plen*4);memcpy(bpj,pj_,plen*4);memcpy(bpt,pt_,plen*4);if(plen>1)memcpy(bpmv,pmv,plen-1);}\nvoid restore_best(){cscore=bscore;plen=blen;memcpy(tu,btu,M);memcpy(pi_,bpi,plen*4);memcpy(pj_,bpj,plen*4);memcpy(pt_,bpt,plen*4);if(plen>1)memcpy(pmv,bpmv,plen-1);ci=pi_[plen-1];cj=pj_[plen-1];}\nvoid walk_init(){fill(tu,tu+M,false);plen=1;ci=si;cj=sj;pi_[0]=si;pj_[0]=sj;pt_[0]=tid[si][sj];tu[tid[si][sj]]=true;cscore=pval[si][sj];}\nbool walk_step(double a,double b,double g){int bd=-1;double bh=-1e18;for(int d=0;d<4;d++){int ni=ci+dx[d],nj=cj+dy[d];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;int t=tid[ni][nj];if(tu[t])continue;tu[t]=true;int deg=0;double nv=0;for(int d2=0;d2<4;d2++){int nni=ni+dx[d2],nnj=nj+dy[d2];if((unsigned)nni>=(unsigned)N||(unsigned)nnj>=(unsigned)N)continue;if(!tu[tid[nni][nnj]]){deg++;nv+=pval[nni][nnj];}}tu[t]=false;double h=a*pval[ni][nj]+g*nv-b*deg+uniform_real_distribution<double>(-0.5,0.5)(rng);if(h>bh){bh=h;bd=d;}}if(bd==-1)return false;int ni=ci+dx[bd],nj=cj+dy[bd];tu[tid[ni][nj]]=true;cscore+=pval[ni][nj];pmv[plen-1]=dc[bd];pi_[plen]=ni;pj_[plen]=nj;pt_[plen]=tid[ni][nj];plen++;ci=ni;cj=nj;return true;}\nvoid walk_extend(double a,double b,double g){while(walk_step(a,b,g));}\nvoid walk_undo(int steps){steps=min(steps,plen-1);while(steps-->0){plen--;tu[pt_[plen]]=false;cscore-=pval[pi_[plen]][pj_[plen]];}ci=pi_[plen-1];cj=pj_[plen-1];}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    rng.seed(chrono::steady_clock::now().time_since_epoch().count());\n    cin>>si>>sj;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>tid[i][j];\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>pval[i][j];\n    M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)M=max(M,tid[i][j]+1);\n    bscore=pval[si][sj];blen=1;bpi[0]=si;bpj[0]=sj;bpt[0]=tid[si][sj];\n    fill(btu,btu+M,false);btu[tid[si][sj]]=true;\n    auto deadline=Clock::now()+chrono::milliseconds(1850);\n    int iter=0;\n    while(Clock::now()<deadline){\n        double a=uniform_real_distribution<double>(0.5,2.0)(rng);\n        double b=uniform_real_distribution<double>(0,25)(rng);\n        double g=uniform_real_distribution<double>(0,0.5)(rng);\n        if(iter%4==0||blen<=1){walk_init();}\n        else{restore_best();walk_undo(uniform_int_distribution<int>(1,blen-1)(rng));}\n        walk_extend(a,b,g);save_best();iter++;\n    }\n    cout<<string(bpmv,bpmv+blen-1)<<\"\\n\";\n}","ahc003":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int N = 30;\ndouble mu_h[N][N-1], mu_v[N-1][N];\ndouble sig2_h[N][N-1], sig2_v[N-1][N];\n\nstring dijkstra(int sr, int sc, int tr, int tc) {\n    static double dist[N*N];\n    static int par[N*N];\n    static char pdir[N*N];\n    fill(dist, dist+N*N, 1e18);\n    priority_queue<pair<double,int>, vector<pair<double,int>>, greater<>> pq;\n    int src=sr*N+sc, dst=tr*N+tc;\n    dist[src]=0; pq.push({0.0,src});\n    while (!pq.empty()) {\n        auto [d,u]=pq.top(); pq.pop();\n        if (d>dist[u]+1e-9) continue;\n        if (u==dst) break;\n        int r=u/N, c=u%N;\n        auto relax=[&](int nr,int nc,char dir,double w){\n            int nv=nr*N+nc; double nd=d+w;\n            if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]=dir;pq.push({nd,nv});}\n        };\n        if(r>0) relax(r-1,c,'U',mu_v[r-1][c]);\n        if(r<N-1) relax(r+1,c,'D',mu_v[r][c]);\n        if(c>0) relax(r,c-1,'L',mu_h[r][c-1]);\n        if(c<N-1) relax(r,c+1,'R',mu_h[r][c]);\n    }\n    string path;\n    for(int cur=dst;cur!=src;cur=par[cur]) path+=pdir[cur];\n    reverse(path.begin(),path.end());\n    return path;\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    for(int i=0;i<N;i++) for(int j=0;j<N-1;j++){mu_h[i][j]=5000;sig2_h[i][j]=1e7;}\n    for(int i=0;i<N-1;i++) for(int j=0;j<N;j++){mu_v[i][j]=5000;sig2_v[i][j]=1e7;}\n    for(int q=0;q<1000;q++){\n        int sr,sc,tr,tc; cin>>sr>>sc>>tr>>tc;\n        string path=dijkstra(sr,sc,tr,tc);\n        cout<<path<<\"\\n\"; cout.flush();\n        int obs; cin>>obs;\n        struct E{bool is_h;int i,j;};\n        vector<E> edges;\n        double pred=0,path_sig2=0;\n        int r=sr,c=sc;\n        for(char ch:path){\n            if(ch=='U'){edges.push_back({false,r-1,c});pred+=mu_v[r-1][c];path_sig2+=sig2_v[r-1][c];r--;}\n            else if(ch=='D'){edges.push_back({false,r,c});pred+=mu_v[r][c];path_sig2+=sig2_v[r][c];r++;}\n            else if(ch=='L'){edges.push_back({true,r,c-1});pred+=mu_h[r][c-1];path_sig2+=sig2_h[r][c-1];c--;}\n            else{edges.push_back({true,r,c});pred+=mu_h[r][c];path_sig2+=sig2_h[r][c];c++;}\n        }\n        if(edges.empty()) continue;\n        double noise_var=(double)obs*obs/300.0;\n        double total_var=path_sig2+noise_var;\n        double residual=(double)obs-pred;\n        for(auto& e:edges){\n            double& mu=e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j];\n            double& sig2=e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j];\n            double K=sig2/total_var;\n            mu=clamp(mu+K*residual,1000.0,9000.0);\n            sig2=max(sig2*(1.0-K),1e4);\n        }\n    }\n    return 0;\n}","ahc004":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20,MAXM=800,MAXL=12;\nint M;\nint8_t grid[N][N],h_mm[N][MAXM][N],v_mm[N][MAXM][N],S[MAXM][MAXL];\nint match_count[MAXM],slen[MAXM];\nint8_t char_pos[MAXM][8][MAXL],char_pos_cnt[MAXM][8];\nuint8_t char_appears[MAXM];\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int n;cin>>n>>M;\n    for(int k=0;k<M;k++){string s;cin>>s;slen[k]=s.size();char_appears[k]=0;memset(char_pos_cnt[k],0,sizeof(char_pos_cnt[k]));for(int p=0;p<slen[k];p++){int ch=s[p]-'A';S[k][p]=ch;char_pos[k][ch][char_pos_cnt[k][ch]++]=p;char_appears[k]|=(1<<ch);}}\n    mt19937 rng(42);\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)grid[i][j]=rng()%8;\n    for(int r=0;r<N;r++)for(int k=0;k<M;k++)for(int j=0;j<N;j++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[r][(j+p)%N]!=S[k][p]);h_mm[r][k][j]=mm;}\n    for(int c=0;c<N;c++)for(int k=0;k<M;k++)for(int i=0;i<N;i++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[(i+p)%N][c]!=S[k][p]);v_mm[c][k][i]=mm;}\n    int score=0;\n    for(int k=0;k<M;k++){match_count[k]=0;for(int r=0;r<N;r++)for(int j=0;j<N;j++)match_count[k]+=(h_mm[r][k][j]==0);for(int c=0;c<N;c++)for(int i=0;i<N;i++)match_count[k]+=(v_mm[c][k][i]==0);score+=(match_count[k]>0);}\n    int best_score=score;int8_t best_grid[N][N];memcpy(best_grid,grid,sizeof(grid));\n    auto t0=chrono::steady_clock::now();\n    const double T_start=5.0,T_end=0.001,TL=2.85;double T=T_start;\n    for(int iter=0;;iter++){\n        if((iter&0xFFF)==0){double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();if(el>=TL)break;T=T_start*pow(T_end/T_start,el/TL);}\n        int r=rng()%N,c=rng()%N,nc=rng()%8,oc=grid[r][c];\n        if(nc==oc)continue;\n        uint8_t mask=(1u<<oc)|(1u<<nc);\n        int delta=0;\n        for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int mc=match_count[k];for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi];mc-=(h_mm[r][k][(c-p+N)%N]==0);mc-=(v_mm[c][k][(r-p+N)%N]==0);}for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi];mc+=(h_mm[r][k][(c-p+N)%N]==1);mc+=(v_mm[c][k][(r-p+N)%N]==1);}delta+=(mc>0)-(match_count[k]>0);}\n        if(delta<0&&(double)rng()>=exp((double)delta/T)*4294967295.0)continue;\n        for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi];int j=(c-p+N)%N,i2=(r-p+N)%N;match_count[k]-=(h_mm[r][k][j]==0);h_mm[r][k][j]++;match_count[k]-=(v_mm[c][k][i2]==0);v_mm[c][k][i2]++;}for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi];int j=(c-p+N)%N,i2=(r-p+N)%N;h_mm[r][k][j]--;match_count[k]+=(h_mm[r][k][j]==0);v_mm[c][k][i2]--;match_count[k]+=(v_mm[c][k][i2]==0);}}\n        grid[r][c]=nc;score+=delta;\n        if(score>best_score){best_score=score;memcpy(best_grid,grid,sizeof(grid));}\n    }\n    for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<(char)('A'+best_grid[i][j]);cout<<'\\n';}\n}","ahc005":"#include <bits/stdc++.h>\nusing namespace std;\nint N, si, sj;\nvector<string> grid;\nbool isRoad(int r, int c) { return r>=0&&r<N&&c>=0&&c<N&&grid[r][c]!='#'; }\nconst int INF=1e9;\npair<vector<int>,vector<int>> dijkstra(int src) {\n    vector<int> dist(N*N,INF),par(N*N,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;\n    dist[src]=0; pq.push({0,src});\n    const int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\n    while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>dist[u])continue;int r=u/N,c=u%N;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!isRoad(nr,nc))continue;int v=nr*N+nc,nd=dd+(grid[nr][nc]-'0');if(nd<dist[v]){dist[v]=nd;par[v]=u;pq.push({nd,v});}}}\n    return{dist,par};\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>si>>sj;grid.resize(N);for(int i=0;i<N;i++)cin>>grid[i];\n    vector<int> roads;vector<int> rIdx(N*N,-1);\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)if(isRoad(r,c)){rIdx[r*N+c]=roads.size();roads.push_back(r*N+c);}\n    int R=roads.size();\n    vector<vector<int>> vis(R);\n    for(int i=0;i<R;i++){int r=roads[i]/N,c=roads[i]%N;vis[i].push_back(i);for(int dd=1;c+dd<N&&isRoad(r,c+dd);dd++)vis[i].push_back(rIdx[r*N+(c+dd)]);for(int dd=1;c-dd>=0&&isRoad(r,c-dd);dd++)vis[i].push_back(rIdx[r*N+(c-dd)]);for(int dd=1;r+dd<N&&isRoad(r+dd,c);dd++)vis[i].push_back(rIdx[(r+dd)*N+c]);for(int dd=1;r-dd>=0&&isRoad(r-dd,c);dd++)vis[i].push_back(rIdx[(r-dd)*N+c]);}\n    vector<bool> covered(R,false);int uncov=R;vector<int> cnt(R);for(int i=0;i<R;i++)cnt[i]=vis[i].size();\n    priority_queue<pair<int,int>> pqsc;for(int i=0;i<R;i++)pqsc.push({cnt[i],i});\n    vector<int> sents;\n    while(uncov>0){int best=-1;while(!pqsc.empty()){auto[cv,id]=pqsc.top();pqsc.pop();if(cv==cnt[id]){best=id;break;}}if(best<0)break;sents.push_back(roads[best]);for(int j:vis[best])if(!covered[j]){covered[j]=true;uncov--;for(int k:vis[j]){cnt[k]--;pqsc.push({cnt[k],k});}}}\n    int stSq=si*N+sj;{auto it=find(sents.begin(),sents.end(),stSq);if(it==sents.end())sents.insert(sents.begin(),stSq);else swap(*it,sents[0]);}\n    int S=sents.size();\n    {vector<int> covCnt(R,0);for(int sq:sents)for(int j:vis[rIdx[sq]])covCnt[j]++;bool changed=true;while(changed){changed=false;for(int i=S-1;i>=1;i--){if(sents[i]<0)continue;int ridx=rIdx[sents[i]];bool red=true;for(int j:vis[ridx])if(covCnt[j]<=1){red=false;break;}if(red){for(int j:vis[ridx])covCnt[j]--;sents[i]=-1;changed=true;}}}sents.erase(remove(sents.begin(),sents.end(),-1),sents.end());S=sents.size();}\n    vector<vector<int>> allDist(S),allPar(S);\n    for(int i=0;i<S;i++){auto[d,p]=dijkstra(sents[i]);allDist[i]=move(d);allPar[i]=move(p);}\n    vector<vector<int>> dm(S,vector<int>(S,INF));for(int i=0;i<S;i++)for(int j=0;j<S;j++)dm[i][j]=allDist[i][sents[j]];\n    vector<bool> tvis(S,false);vector<int> tour={0};tvis[0]=true;\n    for(int s=1;s<S;s++){int cur=tour.back(),best=-1,bd=INF;for(int j=0;j<S;j++)if(!tvis[j]&&dm[cur][j]<bd){bd=dm[cur][j];best=j;}tour.push_back(best);tvis[best]=true;}\n    for(bool imp=true;imp;){imp=false;for(int i=0;i<S-1;i++)for(int j=i+2;j<S;j++){if(i==0&&j==S-1)continue;int ta=tour[i],tb=tour[i+1],tc=tour[j],td=tour[(j+1)%S];if(dm[ta][tc]+dm[tb][td]<dm[ta][tb]+dm[tc][td]){reverse(tour.begin()+i+1,tour.begin()+j+1);imp=true;}}}\n    string res;\n    for(int i=0;i<S;i++){int fi=tour[i],toSq=sents[tour[(i+1)%S]],srcSq=sents[fi];vector<int> path;for(int cur=toSq;cur!=srcSq;cur=allPar[fi][cur])path.push_back(cur);reverse(path.begin(),path.end());int pp=srcSq;for(int nx:path){int pr=pp/N,pc=pp%N,nr=nx/N,nc=nx%N;if(nr<pr)res+='U';else if(nr>pr)res+='D';else if(nc<pc)res+='L';else res+='R';pp=nx;}}\n    cout<<res<<\"\\n\";return 0;\n}","future-contest-2022-qual":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N, M, K, R;\nvector<vector<int>> d, succs;\nvector<int> task_st, task_pre, task_w, worker_t, task_sd;\nvector<vector<double>> sk;\nvector<vector<int>> lb;\nvector<vector<pair<int,int>>> obs;\nvector<double> cp;\nvector<vector<double>> et;\nint cur_day;\ndouble prior_sk;\n\nvoid upd_et(int w) {\n    for (int i = 0; i < N; i++) {\n        double ww = 0;\n        for (int k = 0; k < K; k++) { double df = d[i][k] - sk[w][k]; if (df > 0) ww += df; }\n        et[i][w] = ww < 0.5 ? 1.0 : ww;\n    }\n}\n\nvoid calc_cp() {\n    cp.assign(N, 0.0);\n    for (int i = N-1; i >= 0; i--) {\n        if (task_st[i] == 2) continue;\n        double mn;\n        if (task_st[i] == 1) { double rem = task_sd[i] + et[i][task_w[i]] - cur_day; mn = max(1.0, rem); }\n        else { mn = et[i][0]; for (int j = 1; j < M; j++) mn = min(mn, et[i][j]); }\n        double mx = 0;\n        for (int v : succs[i]) mx = max(mx, cp[v]);\n        cp[i] = mn + mx;\n    }\n}\n\nvoid refit(int w) {\n    int n = (int)obs[w].size();\n    double decay = exp(-0.1 * n);\n    for (int k = 0; k < K; k++) sk[w][k] = max((double)lb[w][k], prior_sk * decay);\n    double lr = 1.0;\n    for (int it = 0; it < 200; it++) {\n        double delta[20] = {}; double loss = 0;\n        for (auto& [ti, to] : obs[w]) {\n            double wh = 0;\n            for (int k = 0; k < K; k++) { double df = d[ti][k] - sk[w][k]; if (df > 0) wh += df; }\n            double tgt = to == 1 ? 0.0 : (double)to, err = wh - tgt;\n            loss += err * err;\n            for (int k = 0; k < K; k++) {\n                if (d[ti][k] > sk[w][k]) delta[k] += err;\n                else if (err < -0.5 && d[ti][k] > 0) delta[k] += 0.3 * err;\n            }\n        }\n        bool ch = false;\n        for (int k = 0; k < K; k++) {\n            double ns = max((double)lb[w][k], max(0.0, sk[w][k] + lr * delta[k] / n));\n            if (ns != sk[w][k]) { sk[w][k] = ns; ch = true; }\n        }\n        if (!ch || loss / n < 0.1) break;\n        lr *= 0.95;\n    }\n    upd_et(w);\n}\n\nint main() {\n    ios::sync_with_stdio(false); cin.tie(nullptr);\n    cin >> N >> M >> K >> R;\n    d.assign(N, vector<int>(K));\n    for (int i = 0; i < N; i++) for (int k = 0; k < K; k++) cin >> d[i][k];\n    succs.assign(N, {}); task_pre.assign(N, 0);\n    for (int r = 0; r < R; r++) { int u, v; cin >> u >> v; u--; v--; succs[u].push_back(v); task_pre[v]++; }\n    task_st.assign(N, 0); task_w.assign(N, -1); worker_t.assign(M, -1); task_sd.assign(N, 0);\n    prior_sk = 40.0 / sqrt((double)K);\n    sk.assign(M, vector<double>(K, prior_sk)); lb.assign(M, vector<int>(K, 0)); obs.resize(M);\n    et.assign(N, vector<double>(M));\n    for (int j = 0; j < M; j++) upd_et(j);\n    set<int> avail, idle;\n    for (int i = 0; i < N; i++) if (!task_pre[i]) avail.insert(i);\n    for (int j = 0; j < M; j++) idle.insert(j);\n    cur_day = 0;\n    while (true) {\n        cur_day++; calc_cp();\n        vector<int> av(avail.begin(), avail.end());\n        sort(av.begin(), av.end(), [](int a, int b){ return cp[a] > cp[b]; });\n        vector<pair<int,int>> asgn; set<int> id = idle;\n        for (int t : av) {\n            if (id.empty()) break;\n            int bw = -1; double bt = 1e18;\n            for (int j : id) if (et[t][j] < bt) { bt = et[t][j]; bw = j; }\n            asgn.push_back({bw, t}); id.erase(bw);\n        }\n        cout << asgn.size();\n        for (auto [w, t] : asgn) {\n            cout << ' ' << w+1 << ' ' << t+1;\n            task_w[t] = w; worker_t[w] = t; task_sd[t] = cur_day;\n            task_st[t] = 1; avail.erase(t); idle.erase(w);\n        }\n        cout << '\\n'; cout.flush();\n        int nc; cin >> nc;\n        if (nc == -1) break;\n        for (int i = 0; i < nc; i++) {\n            int w; cin >> w; w--;\n            int t = worker_t[w], tk = cur_day - task_sd[t] + 1;\n            obs[w].push_back({t, tk});\n            if (tk == 1) for (int k = 0; k < K; k++) lb[w][k] = max(lb[w][k], d[t][k]);\n            refit(w);\n            task_st[t] = 2; task_w[t] = -1; worker_t[w] = -1; idle.insert(w);\n            for (int v : succs[t]) if (!--task_pre[v]) avail.insert(v);\n        }\n    }\n}","ahc006":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int OX=400,OY=400,TOT=1000,K=50,NN=2*K+1;\nint A[TOT],B[TOT],C[TOT],D[TOT];\nint sel[K];\nint NX[NN],NY[NN];\n\nint md(int x1,int y1,int x2,int y2){return abs(x1-x2)+abs(y1-y2);}\nint ec(int u,int v){return md(NX[u],NY[u],NX[v],NY[v]);}\n\nvoid refresh(){\n    NX[0]=OX;NY[0]=OY;\n    for(int i=0;i<K;i++){\n        NX[i+1]=A[sel[i]];NY[i+1]=B[sel[i]];\n        NX[K+i+1]=C[sel[i]];NY[K+i+1]=D[sel[i]];\n    }\n}\n\nint tcost(const vector<int>&r){\n    int s=0;\n    for(int i=0;i+1<(int)r.size();i++) s+=ec(r[i],r[i+1]);\n    return s;\n}\n\nbool feasible(const vector<int>&r){\n    bool p[K+1]={};\n    for(int v:r){\n        if(v>=1&&v<=K) p[v]=true;\n        else if(v>K&&!p[v-K]) return false;\n    }\n    return true;\n}\n\nvector<int> build_nn(){\n    bool vis[NN]={},has[K+1]={};\n    vector<int> r={0};vis[0]=true;\n    for(int s=0;s<2*K;s++){\n        int cur=r.back(),bv=-1,bd=INT_MAX;\n        for(int v=1;v<NN;v++){\n            if(vis[v]||(v>K&&!has[v-K])) continue;\n            int dd=ec(cur,v);\n            if(dd<bd){bd=dd;bv=v;}\n        }\n        r.push_back(bv);vis[bv]=true;\n        if(bv<=K) has[bv]=true;\n    }\n    r.push_back(0);\n    return r;\n}\n\nbool two_opt_pass(vector<int>&r){\n    int n=r.size();bool any=false;\n    for(int i=1;i<n-2;i++)\n        for(int j=i+1;j<n-1;j++)\n            if(ec(r[i-1],r[j])+ec(r[i],r[j+1])<ec(r[i-1],r[i])+ec(r[j],r[j+1])){\n                reverse(r.begin()+i,r.begin()+j+1);\n                if(feasible(r)) any=true;\n                else reverse(r.begin()+i,r.begin()+j+1);\n            }\n    return any;\n}\n\nbool or1_pass(vector<int>&r){\n    int n=r.size();bool any=false;\n    for(int i=1;i<n-1;i++){\n        int v=r[i];\n        int rem=ec(r[i-1],v)+ec(v,r[i+1])-ec(r[i-1],r[i+1]);\n        if(rem<=0) continue;\n        int bj=-1,bd=0;\n        for(int j=0;j<n-1;j++){\n            if(j==i-1||j==i) continue;\n            int ins=ec(r[j],v)+ec(v,r[j+1])-ec(r[j],r[j+1]);\n            if(rem-ins>bd){bd=rem-ins;bj=j;}\n        }\n        if(bj<0) continue;\n        vector<int> nr;nr.reserve(n);\n        for(int k=0;k<n;k++) if(k!=i) nr.push_back(r[k]);\n        nr.insert(nr.begin()+((bj<i)?bj+1:bj),v);\n        if(feasible(nr)){r=nr;any=true;}\n    }\n    return any;\n}\n\nvoid full_search(vector<int>&r){\n    for(;;){bool a=two_opt_pass(r),b=or1_pass(r);if(!a&&!b)break;}\n}\nvoid quick_search(vector<int>&r,int it=5){\n    for(int i=0;i<it;i++){bool a=two_opt_pass(r),b=or1_pass(r);if(!a&&!b)break;}\n}\n\nvector<int> build_perturbed(const vector<int>&base,int si){\n    int pi=si+1,di=K+si+1;\n    vector<int> r;r.reserve(base.size()-2);\n    for(int v:base) if(v!=pi&&v!=di) r.push_back(v);\n    int n=r.size();\n    int bc=INT_MAX,bp=0,bd2=1;\n    for(int p=0;p<n-1;p++){\n        int cp=md(NX[r[p]],NY[r[p]],NX[pi],NY[pi])\n              +md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]])\n              -md(NX[r[p]],NY[r[p]],NX[r[p+1]],NY[r[p+1]]);\n        {\n            int cd=md(NX[pi],NY[pi],NX[di],NY[di])\n                  +md(NX[di],NY[di],NX[r[p+1]],NY[r[p+1]])\n                  -md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]]);\n            if(cp+cd<bc){bc=cp+cd;bp=p;bd2=p+1;}\n        }\n        for(int d=p+2;d<n;d++){\n            int cd=md(NX[r[d-1]],NY[r[d-1]],NX[di],NY[di])\n                  +md(NX[di],NY[di],NX[r[d]],NY[r[d]])\n                  -md(NX[r[d-1]],NY[r[d-1]],NX[r[d]],NY[r[d]]);\n            if(cp+cd<bc){bc=cp+cd;bp=p;bd2=d;}\n        }\n    }\n    vector<int> res=r;\n    res.insert(res.begin()+bp+1,pi);\n    res.insert(res.begin()+bd2+1,di);\n    return res;\n}\n\nvoid emit(const vector<int>&r){\n    cout<<K;\n    for(int i=0;i<K;i++) cout<<\" \"<<(sel[i]+1);\n    cout<<\"\\n\"<<r.size();\n    for(int v:r) cout<<\" \"<<NX[v]<<\" \"<<NY[v];\n    cout<<\"\\n\";cout.flush();\n}\n\nusing Clk=chrono::steady_clock;\nClk::time_point T0;\ndouble esec(){return chrono::duration<double>(Clk::now()-T0).count();}\n\nint bcost=INT_MAX;\nvector<int> broute;\nint bsel[K];\nbool inS[TOT]={};\n\nvoid trysel(){\n    refresh();\n    auto r=build_nn();full_search(r);\n    int c=tcost(r);\n    if(c<bcost){bcost=c;broute=r;copy(sel,sel+K,bsel);}\n}\n\nbool greedy_step(){\n    int n=broute.size();\n    vector<int> pos(NN,-1);\n    for(int i=0;i<n;i++) pos[broute[i]]=i;\n    vector<int> rem(K);\n    for(int i=0;i<K;i++){\n        int pi=i+1,di=K+i+1,pp=pos[pi],dp=pos[di];\n        rem[i]=ec(broute[pp-1],pi)+ec(pi,broute[pp+1])-ec(broute[pp-1],broute[pp+1])\n              +ec(broute[dp-1],di)+ec(di,broute[dp+1])-ec(broute[dp-1],broute[dp+1]);\n    }\n    int bg=0,bsi=-1,bj=-1;\n    for(int j=0;j<TOT;j++){\n        if(inS[j]) continue;\n        int px=A[j],py=B[j],dx=C[j],dy=D[j];\n        int ins=INT_MAX;\n        for(int p=0;p<n-1;p++){\n            int c=md(NX[broute[p]],NY[broute[p]],px,py)\n                 +md(px,py,dx,dy)\n                 +md(dx,dy,NX[broute[p+1]],NY[broute[p+1]])\n                 -ec(broute[p],broute[p+1]);\n            if(c<ins) ins=c;\n        }\n        for(int si=0;si<K;si++){\n            int g=rem[si]-ins;\n            if(g>bg){bg=g;bsi=si;bj=j;}\n        }\n    }\n    if(bsi<0) return false;\n    int old=sel[bsi];\n    sel[bsi]=bj;refresh();\n    auto nr=build_perturbed(broute,bsi);\n    quick_search(nr,10);\n    int nc=tcost(nr);\n    if(nc<bcost){\n        bcost=nc;broute=nr;copy(sel,sel+K,bsel);\n        inS[bj]=true;inS[old]=false;\n        return true;\n    }\n    sel[bsi]=old;refresh();\n    return false;\n}\n\nint main(){\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    T0=Clk::now();\n    for(int i=0;i<TOT;i++) cin>>A[i]>>B[i]>>C[i]>>D[i];\n\n    // Strategy 1: isolated tour cost\n    {\n        vector<pair<int,int>> sc(TOT);\n        for(int i=0;i<TOT;i++)\n            sc[i]={md(OX,OY,A[i],B[i])+md(A[i],B[i],C[i],D[i])+md(C[i],D[i],OX,OY),i};\n        sort(sc.begin(),sc.end());\n        for(int i=0;i<K;i++) sel[i]=sc[i].second;\n        trysel();\n    }\n    // Strategy 2: sum of distances to office\n    {\n        vector<pair<int,int>> sc(TOT);\n        for(int i=0;i<TOT;i++)\n            sc[i]={md(OX,OY,A[i],B[i])+md(OX,OY,C[i],D[i]),i};\n        sort(sc.begin(),sc.end());\n        for(int i=0;i<K;i++) sel[i]=sc[i].second;\n        trysel();\n    }\n    // Strategy 3: minimax distance to office\n    {\n        vector<pair<int,int>> sc(TOT);\n        for(int i=0;i<TOT;i++)\n            sc[i]={max(md(OX,OY,A[i],B[i]),md(OX,OY,C[i],D[i])),i};\n        sort(sc.begin(),sc.end());\n        for(int i=0;i<K;i++) sel[i]=sc[i].second;\n        trysel();\n    }\n\n    copy(bsel,bsel+K,sel);refresh();\n    memset(inS,false,sizeof(inS));\n    for(int i=0;i<K;i++) inS[sel[i]]=true;\n    emit(broute);\n\n    // Greedy swap phase\n    while(esec()<0.7) if(!greedy_step()) break;\n\n    // Random swap phase\n    mt19937 rng(42);\n    while(esec()<1.80){\n        int si=rng()%K,no;\n        do{no=rng()%TOT;}while(inS[no]);\n        int oo=sel[si];sel[si]=no;refresh();\n        auto nr=build_perturbed(broute,si);quick_search(nr,5);\n        int nc=tcost(nr);\n        if(nc<bcost){\n            bcost=nc;broute=nr;copy(sel,sel+K,bsel);\n            inS[no]=true;inS[oo]=false;\n        }else{sel[si]=oo;refresh();}\n    }\n\n    // Final output\n    copy(bsel,bsel+K,sel);refresh();\n    for(;;){\n        if(esec()>1.95) break;\n        bool a=two_opt_pass(broute),b=or1_pass(broute);\n        if(!a&&!b) break;\n    }\n    emit(broute);\n    return 0;\n}","ahc007":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N = 400, M = 1995;\nint px[N], py[N];\nint eu[M], ev[M];\nlong long ed[M];\nstruct UF {\n    int p[N], r[N];\n    void init() { for(int i=0;i<N;i++) p[i]=i, r[i]=0; }\n    int find(int x) { while(p[x]!=x) x=p[x]=p[p[x]]; return x; }\n    bool same(int x, int y) { return find(x)==find(y); }\n    void unite(int x, int y) {\n        x=find(x); y=find(y); if(x==y) return;\n        if(r[x]<r[y]) swap(x,y); p[y]=x; if(r[x]==r[y]) r[x]++;\n    }\n    int ncomp() { int c=0; for(int i=0;i<N;i++) if(find(i)==i) c++; return c; }\n} uf;\nint main(){\n    ios::sync_with_stdio(false); cin.tie(nullptr);\n    for(int i=0;i<N;i++) cin>>px[i]>>py[i];\n    for(int i=0;i<M;i++){\n        cin>>eu[i]>>ev[i];\n        double dx=px[eu[i]]-px[ev[i]], dy=py[eu[i]]-py[ev[i]];\n        ed[i]=llround(sqrt(dx*dx+dy*dy));\n    }\n    uf.init();\n    for(int i=0;i<M;i++){\n        long long l; cin>>l;\n        if(uf.same(eu[i],ev[i])){ cout<<0<<endl; continue; }\n        { UF tmp=uf; for(int j=i+1;j<M;j++) tmp.unite(eu[j],ev[j]);\n          if(tmp.ncomp()>1){ cout<<1<<endl; uf.unite(eu[i],ev[i]); continue; } }\n        int cu=uf.find(eu[i]), cv=uf.find(ev[i]);\n        int k=0; long long min_d=LLONG_MAX;\n        for(int j=i+1;j<M;j++){\n            int fu=uf.find(eu[j]), fv=uf.find(ev[j]);\n            if((fu==cu&&fv==cv)||(fu==cv&&fv==cu)){ k++; min_d=min(min_d,ed[j]); }\n        }\n        double threshold;\n        if(k>0){ threshold=(double)min_d*(1.0+2.0/(k+1.0)); }\n        else {\n            int comp_id[N]; fill(comp_id,comp_id+N,-1); int nc=0;\n            for(int v=0;v<N;v++){ int rv=uf.find(v); if(comp_id[rv]==-1) comp_id[rv]=nc++; }\n            vector<vector<pair<int,double>>> cadj(nc);\n            for(int j=i+1;j<M;j++){\n                int fu=uf.find(eu[j]), fv=uf.find(ev[j]);\n                if(fu!=fv){ int idu=comp_id[fu],idv=comp_id[fv]; double w=2.0*ed[j];\n                    cadj[idu].push_back({idv,w}); cadj[idv].push_back({idu,w}); }\n            }\n            int src=comp_id[cu], dst=comp_id[cv];\n            vector<double> dist(nc,1e18);\n            priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>> pq;\n            dist[src]=0; pq.push({0.0,src});\n            while(!pq.empty()){\n                auto [dv,u]=pq.top(); pq.pop();\n                if(dv>dist[u]+1e-9) continue; if(u==dst) break;\n                for(auto [v,w]:cadj[u]){ double nd=dist[u]+w; if(nd<dist[v]){ dist[v]=nd; pq.push({nd,v}); } }\n            }\n            threshold=(dist[dst]>1e17)?2.0*ed[i]:dist[dst];\n        }\n        if((double)l<=threshold){ cout<<1<<endl; uf.unite(eu[i],ev[i]); }\n        else { cout<<0<<endl; }\n    }\n    return 0;\n}","ahc008":"#include <bits/stdc++.h>\nusing namespace std;\nconst int G=30;\nint N,M,px[20],py[20],hx[10],hy[10];\nbool wall[G+2][G+2];\nint spx[20],spy[20],shx[10],shy[10];\nconst int ddx[]={-1,1,0,0},ddy[]={0,0,-1,1};\nconst char DIRS[]=\"UDLR\",WDIRS[]=\"udlr\";\nbool inb(int x,int y){return x>=1&&x<=G&&y>=1&&y<=G;}\nint dbuf[G+2][G+2];\nvoid bfs(int tx,int ty){\n    for(int i=0;i<=G+1;i++)fill(dbuf[i],dbuf[i]+G+2,-1);\n    dbuf[tx][ty]=0;queue<pair<int,int>>q;q.push({tx,ty});\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int d=0;d<4;d++){int nx=x+ddx[d],ny=y+ddy[d];if(!inb(nx,ny)||wall[nx][ny]||dbuf[nx][ny]!=-1)continue;dbuf[nx][ny]=dbuf[x][y]+1;q.push({nx,ny});}}\n}\nchar gmv(int sx,int sy,int tx,int ty){if(sx==tx&&sy==ty)return '.';bfs(tx,ty);if(dbuf[sx][sy]==-1)return '.';for(int d=0;d<4;d++){int nx=sx+ddx[d],ny=sy+ddy[d];if(!inb(nx,ny)||wall[nx][ny])continue;if(dbuf[nx][ny]==dbuf[sx][sy]-1)return DIRS[d];}return '.';}\nbool cpl(int wx,int wy){if(!inb(wx,wy)||wall[wx][wy])return false;for(int i=0;i<N;i++)if(spx[i]==wx&&spy[i]==wy)return false;for(int i=0;i<M;i++)if(shx[i]==wx&&shy[i]==wy)return false;for(int d=0;d<4;d++){int ax=wx+ddx[d],ay=wy+ddy[d];for(int i=0;i<N;i++)if(spx[i]==ax&&spy[i]==ay)return false;}return true;}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);memset(wall,false,sizeof(wall));\n    cin>>N;for(int i=0;i<N;i++){int t;cin>>px[i]>>py[i]>>t;}cin>>M;for(int i=0;i<M;i++)cin>>hx[i]>>hy[i];\n    double bv=-1e18;int wt=0,wp=16;bool hp=true;\n    auto ch=[&](int wtype,int wpos,bool hpos)->int{int c=0;for(int i=0;i<M;i++){bool ok=wtype==0?(hpos?hy[i]<wpos:hy[i]>=wpos):(hpos?hx[i]<wpos:hx[i]>=wpos);if(ok)c++;}return c;};\n    auto ev=[&](int area,int pets,int wtype,int wpos,bool hpos)->double{return (double)area/900.0*pow(2.0,-(double)pets)*(0.7+0.3*ch(wtype,wpos,hpos)/M);};\n    for(int c=2;c<=G;c++){int lp=0,rp=0;for(int i=0;i<N;i++){if(py[i]<c)lp++;else rp++;}double vl=ev((c-1)*G,lp,0,c,true),vr=ev((G-c+1)*G,rp,0,c,false);if(vl>bv){bv=vl;wt=0;wp=c;hp=true;}if(vr>bv){bv=vr;wt=0;wp=c;hp=false;}}\n    for(int r=2;r<=G;r++){int tp=0,bp=0;for(int i=0;i<N;i++){if(px[i]<r)tp++;else bp++;}double vt=ev((r-1)*G,tp,1,r,true),vb=ev((G-r+1)*G,bp,1,r,false);if(vt>bv){bv=vt;wt=1;wp=r;hp=true;}if(vb>bv){bv=vb;wt=1;wp=r;hp=false;}}\n    struct Task{int wx,wy,sx,sy,wd;};vector<Task> tasks(G);\n    if(wt==0){if(hp)for(int r=1;r<=G;r++)tasks[r-1]={r,wp,r,wp-1,3};else for(int r=1;r<=G;r++)tasks[r-1]={r,wp-1,r,wp,2};}\n    else{if(hp)for(int c=1;c<=G;c++)tasks[c-1]={wp,c,wp-1,c,1};else for(int c=1;c<=G;c++)tasks[c-1]={wp-1,c,wp,c,0};}\n    vector<int> hord(M);iota(hord.begin(),hord.end(),0);\n    if(wt==0)sort(hord.begin(),hord.end(),[&](int a,int b){return hx[a]<hx[b];});else sort(hord.begin(),hord.end(),[&](int a,int b){return hy[a]<hy[b];});\n    vector<int> te(M),ct(M);for(int i=0;i<M;i++){int h=hord[i];ct[h]=i*G/M;te[h]=(i+1)*G/M;}\n    auto ons=[&](int h)->bool{return wt==0?(hp?hy[h]<wp:hy[h]>=wp):(hp?hx[h]<wp:hx[h]>=wp);};\n    for(int turn=0;turn<300;turn++){\n        for(int i=0;i<N;i++){spx[i]=px[i];spy[i]=py[i];}for(int i=0;i<M;i++){shx[i]=hx[i];shy[i]=hy[i];}\n        bool all_safe=true;for(int h=0;h<M;h++)if(!ons(h)){all_safe=false;break;}\n        string acts(M,'.');set<pair<int,int>> pl;\n        for(int h=0;h<M;h++){\n            while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n            if(ct[h]>=te[h]){acts[h]='.';continue;}\n            Task&t=tasks[ct[h]];bool ig=(ct[h]==G-1)&&!all_safe;\n            if(hx[h]==t.sx&&hy[h]==t.sy){if(!ig&&cpl(t.wx,t.wy)&&!pl.count({t.wx,t.wy})){acts[h]=WDIRS[t.wd];pl.insert({t.wx,t.wy});wall[t.wx][t.wy]=true;ct[h]++;}}\n            else{char mv=gmv(hx[h],hy[h],t.sx,t.sy);acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}}\n        }\n        cout<<acts<<\"\\n\";cout.flush();\n        for(int i=0;i<N;i++){string s;cin>>s;for(char c:s){if(c=='U')px[i]--;else if(c=='D')px[i]++;else if(c=='L')py[i]--;else if(c=='R')py[i]++;}}\n    }\n}","ahc009":"#include <bits/stdc++.h>\nusing namespace std;\nint si,sj,ti,tj; double pf;\nbool H[20][19],V[19][20];\nint nbr[400][4],G;\nvoid initN(){for(int i=0;i<20;i++)for(int j=0;j<20;j++){int c=i*20+j;nbr[c][0]=(i>0&&!V[i-1][j])?(i-1)*20+j:c;nbr[c][1]=(i<19&&!V[i][j])?(i+1)*20+j:c;nbr[c][2]=(j>0&&!H[i][j-1])?i*20+(j-1):c;nbr[c][3]=(j<19&&!H[i][j])?i*20+(j+1):c;}}\nint dc(char c){return c=='U'?0:c=='D'?1:c=='L'?2:3;}\ndouble PP[201][400],PE[201];\nvoid buildP(const string&s,int fr){for(int t=fr;t<(int)s.size();t++){int d=dc(s[t]);double*a=PP[t],*b=PP[t+1];memset(b,0,400*8);for(int k=0;k<400;k++){double v=a[k];if(v<1e-15)continue;b[k]+=v*pf;b[nbr[k][d]]+=v*(1-pf);}double e=b[G]*(401.0-(t+1));b[G]=0;PE[t+1]=PE[t]+e;}}\ndouble evalF(const string&s,int fr){double prob[400],np[400];memcpy(prob,PP[fr],400*8);double E=PE[fr];for(int t=fr;t<(int)s.size();t++){int d=dc(s[t]);memset(np,0,sizeof(np));for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nbr[k][d]]+=v*(1-pf);}E+=np[G]*(401.0-(t+1));np[G]=0;memcpy(prob,np,sizeof(prob));}return E;}\ndouble fullE(const string&s){memset(PP[0],0,400*8);PP[0][si*20+sj]=1.0;PE[0]=0;buildP(s,0);return PE[s.size()];}\nstring bfsPath(){int d[400];fill(d,d+400,-1);int p[400],pd[400];int src=si*20+sj;queue<int>q;q.push(src);d[src]=0;while(!q.empty()){int k=q.front();q.pop();for(int dd=0;dd<4;dd++){int nk=nbr[k][dd];if(nk==k||d[nk]!=-1)continue;d[nk]=d[k]+1;p[nk]=k;pd[nk]=dd;q.push(nk);}}string r;for(int c=G;c!=src;c=p[c])r+=\"UDLR\"[pd[c]];reverse(r.begin(),r.end());return r;}\nstring greedyPath(){int bd[400];fill(bd,bd+400,-1);queue<int>q;q.push(G);bd[G]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nbr[k][d];if(nk==k||bd[nk]!=-1)continue;bd[nk]=bd[k]+1;q.push(nk);}}double prob[400]={},np[400];prob[si*20+sj]=1.0;string s(200,'D');for(int t=0;t<200;t++){double best=-1e18;int bd2=0;for(int d=0;d<4;d++){double g=0;for(int k=0;k<400;k++){if(prob[k]<1e-15)continue;g+=prob[k]*(1-pf)*(bd[k]-bd[nbr[k][d]]);}if(g>best){best=g;bd2=d;}}s[t]=\"UDLR\"[bd2];memset(np,0,sizeof(np));for(int k=0;k<400;k++){if(prob[k]<1e-15)continue;np[k]+=prob[k]*pf;np[nbr[k][bd2]]+=prob[k]*(1-pf);}np[G]=0;memcpy(prob,np,sizeof(prob));}return s;}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>si>>sj>>ti>>tj>>pf;\n    for(int i=0;i<20;i++){string r;cin>>r;for(int j=0;j<19;j++)H[i][j]=(r[j]=='1');}\n    for(int i=0;i<19;i++){string r;cin>>r;for(int j=0;j<20;j++)V[i][j]=(r[j]=='1');}\n    initN(); G=ti*20+tj;\n    string path=bfsPath(); int k=path.size();\n    string s1(200,'D'); for(int i=0;i<200;i++)s1[i]=path[i%k];\n    string s2=greedyPath();\n    double e1=fullE(s1),e2=fullE(s2);\n    string best=(e1>=e2)?s1:s2; double bestE=max(e1,e2);\n    memset(PP[0],0,400*8); PP[0][si*20+sj]=1.0; PE[0]=0; buildP(best,0);\n    auto t0=chrono::steady_clock::now();\n    for(;;){\n        if(chrono::duration<double>(chrono::steady_clock::now()-t0).count()>1.8)break;\n        bool imp=false;\n        for(int t=0;t<200;t++){\n            int od=dc(best[t]);\n            for(int d=0;d<4;d++){\n                if(d==od)continue;\n                best[t]=\"UDLR\"[d];\n                double e=evalF(best,t);\n                if(e>bestE+1e-12){bestE=e;od=d;buildP(best,t);imp=true;}\n                else best[t]=\"UDLR\"[od];\n            }\n        }\n        if(!imp)break;\n    }\n    cout<<best<<\"\\n\";\n}","ahc010":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N = 30, TOTAL = N * N * 4;\nconst int to_t[8][4] = {\n    {1,0,-1,-1},{3,-1,-1,0},{-1,-1,3,2},{-1,2,1,-1},\n    {1,0,3,2},{3,2,1,0},{2,-1,0,-1},{-1,3,-1,1}};\nconst int di[4]={0,-1,0,1}, dj[4]={-1,0,1,0};\nint tiles[N][N], init_t[N][N], rots[N][N], best_rots[N][N];\ninline int apply_rot(int t,int r){\n    if(t<=3)return(t+r)&3;\n    if(t<=5)return 4+((t-4+r)&1);\n    return 6+((t-6+r)&1);}\nint nxt[TOTAL]; uint8_t col[TOTAL];\ninline void update_nxt(int i,int j){\n    int base=(i*N+j)*4, t=tiles[i][j];\n    for(int d=0;d<4;d++){\n        int d2=to_t[t][d];\n        if(d2<0){nxt[base+d]=-1;continue;}\n        int ni=i+di[d2],nj=j+dj[d2];\n        if((unsigned)ni>=N||(unsigned)nj>=N){nxt[base+d]=-1;continue;}\n        nxt[base+d]=(ni*N+nj)*4+((d2+2)&3);}}\nlong long evaluate(){\n    memset(col,0,TOTAL); int t1=0,t2=0;\n    for(int s=0;s<TOTAL;s++){\n        if(col[s])continue;\n        int c=s;\n        while(c>=0&&!col[c]){col[c]=1;c=nxt[c];}\n        if(c>=0&&col[c]==1){\n            int len=0,cc=c;\n            do{cc=nxt[cc];len++;}while(cc!=c);\n            if(len>t1){t2=t1;t1=len;}else if(len>t2)t2=len;}\n        c=s;\n        while(c>=0&&col[c]==1){col[c]=2;c=nxt[c];}}\n    return(long long)t1*t2;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++){\n        string s;cin>>s;\n        for(int j=0;j<N;j++){\n            init_t[i][j]=s[j]-'0';tiles[i][j]=init_t[i][j];rots[i][j]=0;}}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n    long long cur=evaluate(),best=cur;\n    memcpy(best_rots,rots,sizeof(rots));\n    mt19937 rng(42);\n    const auto ts=chrono::steady_clock::now();\n    const double TL=1.85;\n    double elapsed=0; int cnt=0;\n    const double T0=10000.0,Tf=1.0,lnr=log(Tf/T0);\n    while(elapsed<TL){\n        if((cnt&255)==0)\n            elapsed=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n        cnt++;\n        double T=T0*exp(lnr*elapsed/TL);\n        int i=rng()%N,j=rng()%N;\n        int dr=(rng()%3)+1,nr=(rots[i][j]+dr)&3,ot=tiles[i][j];\n        tiles[i][j]=apply_rot(init_t[i][j],nr);\n        update_nxt(i,j);\n        long long ns=evaluate(),delta=ns-cur;\n        if(delta>=0||rng()/4294967296.0<exp((double)delta/T)){\n            rots[i][j]=nr;cur=ns;\n            if(ns>best){best=ns;memcpy(best_rots,rots,sizeof(rots));}}\n        else{tiles[i][j]=ot;update_nxt(i,j);}}\n    string out(N*N,'0');\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)out[i*N+j]='0'+best_rots[i][j];\n    cout<<out<<\"\\n\";return 0;}","ahc011":"#include <bits/stdc++.h>\nusing namespace std;\nint N,T,board[10][10],board_label[10][10],er,ec,tgt[10][10],avail[16];\nbool fixed_cells[10][10];\nstring out;\nvoid read_input(){cin>>N>>T;for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){char c=s[j];board[i][j]=(c>='0'&&c<='9')?c-'0':c-'a'+10;if(!board[i][j]){er=i;ec=j;}}}}\nbool valid_pos(int v,int i,int j){return!((v&1)&&!j)&&!((v&2)&&!i)&&!((v&4)&&j==N-1)&&!((v&8)&&i==N-1);}\nbool is_tree(){bool vis[10][10]={};int sr=-1,sc=0;for(int i=0;i<N&&sr<0;i++)for(int j=0;j<N;j++)if(tgt[i][j]>0){sr=i;sc=j;break;}if(sr<0)return false;queue<pair<int,int>>q;q.push({sr,sc});vis[sr][sc]=true;int cnt=1,ed=0;int dr[]={0,1,0,-1},dc[]={1,0,-1,0},cb[]={4,8,1,2},nb[]={1,2,4,8};while(!q.empty()){auto[r,c]=q.front();q.pop();for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=N||nc<0||nc>=N||tgt[nr][nc]<=0)continue;if((tgt[r][c]&cb[d])&&(tgt[nr][nc]&nb[d])){ed++;if(!vis[nr][nc]){vis[nr][nc]=true;cnt++;q.push({nr,nc});}}}}return cnt==N*N-1&&ed==2*(N*N-2);}\nbool find_target(int pos){if(pos==N*N)return is_tree();int i=pos/N,j=pos%N;if(i==N-1&&j==N-1){tgt[i][j]=0;return find_target(pos+1);}bool fl=(j>0),nl=fl&&(tgt[i][j-1]&4);bool fu=(i>0),nu=fu&&(tgt[i-1][j]&8);for(int v=1;v<=15;v++){if(!avail[v]||!valid_pos(v,i,j))continue;if(fl&&!!(v&1)!=nl)continue;if(fu&&!!(v&2)!=nu)continue;avail[v]--;tgt[i][j]=v;if(find_target(pos+1))return true;avail[v]++;}tgt[i][j]=-1;return false;}\nvoid init_labels(){vector<pair<int,int>>cp[16],tp[16];for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(board[i][j]>0)cp[board[i][j]].push_back({i,j});if(tgt[i][j]>0)tp[tgt[i][j]].push_back({i,j});}for(int v=1;v<=15;v++){sort(cp[v].begin(),cp[v].end());sort(tp[v].begin(),tp[v].end());for(int k=0;k<(int)cp[v].size();k++){auto[cr,cc]=cp[v][k];auto[tr,tc]=tp[v][k];board_label[cr][cc]=tr*N+tc;}}}\nbool check_solvable(){vector<int>s;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]>=0)s.push_back(board_label[i][j]);int inv=0;for(int a=0;a<(int)s.size();a++)for(int b=a+1;b<(int)s.size();b++)if(s[a]>s[b])inv++;if(N%2)return!(inv%2);return(inv+er)%2==1;}\nvoid fix_parity(){if(check_solvable())return;for(int v=1;v<=15;v++){vector<pair<int,int>>cp;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]==v)cp.push_back({i,j});if(cp.size()>=2){swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);if(check_solvable())return;swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);}}}\nvoid do_move(char m){int tr=er,tc=ec;if(m=='U')tr--;else if(m=='D')tr++;else if(m=='L')tc--;else tc++;board[er][ec]=board[tr][tc];board_label[er][ec]=board_label[tr][tc];board[tr][tc]=0;board_label[tr][tc]=-1;er=tr;ec=tc;out+=m;}\nbool move_empty(int gr,int gc){if(er==gr&&ec==gc)return true;if((int)out.size()>=T||fixed_cells[gr][gc])return false;int NN=N*N;vector<int>prv(NN,-2);int s=er*N+ec,g=gr*N+gc;prv[s]=-1;queue<int>q;q.push(s);int dr[]={-1,1,0,0},dcc[]={0,0,-1,1};while(!q.empty()){int cur=q.front();q.pop();if(cur==g)break;int r=cur/N,c=cur%N;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dcc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int nxt=nr*N+nc;if(prv[nxt]!=-2)continue;prv[nxt]=cur;q.push(nxt);}}if(prv[g]==-2)return false;vector<int>path;int cur=g;while(cur!=s){path.push_back(cur);cur=prv[cur];}reverse(path.begin(),path.end());for(int nxt:path){if((int)out.size()>=T)return false;int nr=nxt/N,nc=nxt%N;char m;if(nr==er-1)m='U';else if(nr==er+1)m='D';else if(nc==ec-1)m='L';else m='R';do_move(m);}return true;}\nbool bfs_tile(int&tr,int&tc,int dr,int dc){if(tr==dr&&tc==dc)return true;if((int)out.size()>=T)return false;int NN=N*N,t0=tr*N+tc,e0=er*N+ec,tg=dr*N+dc,tot=NN*NN;vector<int>prv(tot,-2);vector<char>mv(tot,0);prv[t0*NN+e0]=-1;queue<int>q;q.push(t0*NN+e0);int ddr[]={-1,1,0,0},ddc[]={0,0,-1,1};const char dch[]={'U','D','L','R'};int goal=-1;while(!q.empty()){int cur=q.front();q.pop();int ct=cur/NN,ce=cur%NN;if(ct==tg){goal=cur;break;}int er_=ce/N,ec_=ce%N;for(int d=0;d<4;d++){int nr=er_+ddr[d],nc=ec_+ddc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int np=nr*N+nc,nt=(np==ct)?ce:ct,ne=np;if(nt==ne)continue;int nst=nt*NN+ne;if(nst<0||nst>=tot||prv[nst]!=-2)continue;prv[nst]=cur;mv[nst]=dch[d];q.push(nst);}}if(goal<0){for(int e=0;e<NN&&goal<0;e++){if(e==tg||fixed_cells[e/N][e%N])continue;int s=tg*NN+e;if(s<tot&&prv[s]!=-2)goal=s;}}if(goal<0)return false;vector<char>path;int cur=goal;while(cur!=t0*NN+e0){path.push_back(mv[cur]);cur=prv[cur];}reverse(path.begin(),path.end());for(char m:path){if((int)out.size()>=T)return false;do_move(m);}tr=dr;tc=dc;return true;}\npair<int,int>find_lbl(int lbl){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]==lbl)return{i,j};return{-1,-1};}\nvoid solve_row(int row){if((int)out.size()>=T)return;for(int col=0;col<=N-3&&(int)out.size()<T;col++){auto[cr,cc]=find_lbl(row*N+col);if(cr<0)continue;if(cr==row&&cc==col){fixed_cells[row][col]=true;continue;}bfs_tile(cr,cc,row,col);fixed_cells[row][col]=true;}if((int)out.size()>=T)return;auto[ar,ac]=find_lbl(row*N+(N-2));auto[br,bc]=find_lbl(row*N+(N-1));if(ar<0||br<0)return;if(ar==row&&ac==N-2&&br==row&&bc==N-1){fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;return;}bfs_tile(ar,ac,row,N-1);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl(row*N+(N-1));if(br2<0)return;fixed_cells[row][N-1]=true;bfs_tile(br2,bc2,row+1,N-1);fixed_cells[row][N-1]=false;if((int)out.size()>=T)return;fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=true;move_empty(row,N-2);fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=false;if((int)out.size()<T&&er==row&&ec==N-2){do_move('R');if((int)out.size()<T)do_move('D');}fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;}\nvoid solve_col(int col){if((int)out.size()>=T)return;auto[ar,ac]=find_lbl((N-2)*N+col);auto[br,bc]=find_lbl((N-1)*N+col);if(ar<0||br<0)return;if(ar==N-2&&ac==col&&br==N-1&&bc==col){fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;return;}bfs_tile(ar,ac,N-1,col);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl((N-1)*N+col);if(br2<0)return;fixed_cells[N-1][col]=true;bfs_tile(br2,bc2,N-1,col+1);fixed_cells[N-1][col]=false;if((int)out.size()>=T)return;fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=true;move_empty(N-2,col);fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=false;if((int)out.size()<T&&er==N-2&&ec==col){do_move('D');if((int)out.size()<T)do_move('R');}fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;}\nvoid solve_2x2(){if((int)out.size()>=T)return;int p0=(N-2)*N+(N-2),p1=(N-2)*N+(N-1),p2=(N-1)*N+(N-2);int a=board_label[N-2][N-2],b=board_label[N-2][N-1],c=board_label[N-1][N-2],d=board_label[N-1][N-1];if(a==p0&&b==p1&&c==p2&&d==-1)return;auto el=[&](int l)->int{if(l==p0)return 0;if(l==p1)return 1;if(l==p2)return 2;return 3;};auto enc=[](int v0,int v1,int v2,int v3){return v0*64+v1*16+v2*4+v3;};int gs=enc(0,1,2,3),ss=enc(el(a),el(b),el(c),el(d));if(ss==gs)return;array<int,256>par;par.fill(-2);array<char,256>mfr;mfr.fill(0);queue<int>q;q.push(ss);par[ss]=-1;static const int adj[4][2]={{1,2},{0,3},{0,3},{1,2}};static const char amv[4][2]={{'R','D'},{'L','D'},{'U','R'},{'U','L'}};while(!q.empty()){int cur=q.front();q.pop();if(cur==gs)break;int v[4]={(cur>>6)&3,(cur>>4)&3,(cur>>2)&3,cur&3};int ep=-1;for(int p=0;p<4;p++)if(v[p]==3){ep=p;break;}if(ep<0)continue;for(int k=0;k<2;k++){int np=adj[ep][k];char m=amv[ep][k];int nv[4]={v[0],v[1],v[2],v[3]};nv[ep]=nv[np];nv[np]=3;int nst=enc(nv[0],nv[1],nv[2],nv[3]);if(par[nst]==-2){par[nst]=cur;mfr[nst]=m;q.push(nst);}}}if(par[gs]==-2)return;vector<char>path;int cur=gs;while(cur!=ss){path.push_back(mfr[cur]);cur=par[cur];}reverse(path.begin(),path.end());for(char m:path){if((int)out.size()>=T)break;do_move(m);}}\nvoid solve(){for(int row=0;row<=N-3&&(int)out.size()<T;row++)solve_row(row);for(int col=0;col<=N-3&&(int)out.size()<T;col++)solve_col(col);solve_2x2();}\nint main(){ios::sync_with_stdio(false);cin.tie(nullptr);read_input();memset(avail,0,sizeof(avail));for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]>0)avail[board[i][j]]++;memset(tgt,-1,sizeof(tgt));memset(fixed_cells,0,sizeof(fixed_cells));memset(board_label,-1,sizeof(board_label));if(!find_target(0)){cout<<\"\\n\";return 0;}init_labels();fix_parity();solve();cout<<out<<\"\\n\";return 0;}","ahc012":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef unsigned long long ull;\ntypedef pair<ull,ull> puu;\nstruct PH{size_t operator()(const puu&p)const{size_t h=hash<ull>()(p.first);h^=hash<ull>()(p.second)+0x9e3779b9ULL+(h<<6)+(h>>2);return h;}};\nmt19937 rng(42);\nint N,K,a[11],stx[5501],sty[5501];\nstruct Line{ll px,py,qx,qy;};\nconst int MK=100;\nLine cur_lines[MK],best_lines[MK];\nint8_t sgn_data[5501][MK];\null slo[5501],shi[5501];\nunordered_map<puu,int,PH>grps;\nint b_arr[12],cscore,best_score;\nstruct Change{int idx;puu old_sig,new_sig;int8_t new_sgn;};\nvector<Change>pending;\nvector<pair<puu,int>>dvec;\nll ecross(const Line&l,ll x,ll y){return(l.qx-l.px)*(y-l.py)-(l.qy-l.py)*(x-l.px);}\nvoid upd(int oc,int nc){if(oc>=1&&oc<=10){cscore-=min(a[oc],b_arr[oc]);b_arr[oc]--;cscore+=min(a[oc],b_arr[oc]);}if(nc>=1&&nc<=10){cscore-=min(a[nc],b_arr[nc]);b_arr[nc]++;cscore+=min(a[nc],b_arr[nc]);}}\nvoid build(){grps.clear();grps.reserve(32768);grps.max_load_factor(0.3f);memset(b_arr,0,sizeof(b_arr));cscore=0;for(int i=0;i<N;i++){slo[i]=shi[i]=0;for(int j=0;j<MK;j++){int8_t s=(ecross(cur_lines[j],stx[i],sty[i])>=0)?1:-1;sgn_data[i][j]=s;if(s==1){if(j<64)slo[i]|=(1ULL<<j);else shi[i]|=(1ULL<<(j-64));}}auto[it,ins]=grps.emplace(puu{slo[i],shi[i]},0);upd(it->second,it->second+1);it->second++;}}\nint try_ch(int j,const Line&nl){pending.clear();dvec.clear();for(int i=0;i<N;i++){int8_t ns=(ecross(nl,stx[i],sty[i])>=0)?1:-1;if(ns==sgn_data[i][j])continue;puu os{slo[i],shi[i]};ull nl2=slo[i],nh2=shi[i];if(j<64){if(ns==1)nl2|=(1ULL<<j);else nl2&=~(1ULL<<j);}else{if(ns==1)nh2|=(1ULL<<(j-64));else nh2&=~(1ULL<<(j-64));}puu nsig{nl2,nh2};pending.push_back({i,os,nsig,ns});dvec.push_back({os,-1});dvec.push_back({nsig,+1});}sort(dvec.begin(),dvec.end());int nb[12];memcpy(nb,b_arr,sizeof(nb));int nsc=cscore;for(int i=0;i<(int)dvec.size();){int j2=i,d=0;while(j2<(int)dvec.size()&&dvec[j2].first==dvec[i].first){d+=dvec[j2].second;j2++;}if(d){auto it=grps.find(dvec[i].first);int c=it!=grps.end()?it->second:0,nc=c+d;if(c>=1&&c<=10){nsc-=min(a[c],nb[c]);nb[c]--;nsc+=min(a[c],nb[c]);}if(nc>=1&&nc<=10){nsc-=min(a[nc],nb[nc]);nb[nc]++;nsc+=min(a[nc],nb[nc]);}}i=j2;}return nsc;}\nvoid do_ch(int j,const Line&nl){for(auto&ch:pending){{auto it=grps.find(ch.old_sig);upd(it->second,it->second-1);if(!--it->second)grps.erase(it);}slo[ch.idx]=ch.new_sig.first;shi[ch.idx]=ch.new_sig.second;sgn_data[ch.idx][j]=ch.new_sgn;{auto[it2,ins]=grps.emplace(ch.new_sig,0);upd(it2->second,it2->second+1);it2->second++;}}cur_lines[j]=nl;}\nLine rline(){double th=(rng()%314159)*(M_PI/314159.0);double r=(int)(rng()%18001)-9000;double cx=r*cos(th),cy=r*sin(th),sdx=-sin(th)*9000,sdy=cos(th)*9000;return{llround(cx+sdx),llround(cy+sdy),llround(cx-sdx),llround(cy-sdy)};}\nLine pline(const Line&l,int s){ll dx=(ll)(rng()%(2*s+1))-s,dy=(ll)(rng()%(2*s+1))-s;int t=rng()%3;if(t==0)return{l.px+dx,l.py+dy,l.qx,l.qy};if(t==1)return{l.px,l.py,l.qx+dx,l.qy+dy};return{l.px+dx,l.py+dy,l.qx-dx,l.qy-dy};}\nint main(){ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N>>K;for(int d=1;d<=10;d++)cin>>a[d];for(int i=0;i<N;i++)cin>>stx[i]>>sty[i];\nfor(int i=0;i<50;i++){ll y=llround(-9000.0+18000.0*i/49.0);cur_lines[i]={-10000,y,10000,y};}\nfor(int i=0;i<50;i++){ll x=llround(-9000.0+18000.0*i/49.0);cur_lines[50+i]={x,-10000,x,10000};}\nbuild();best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));pending.reserve(N+10);dvec.reserve(2*N+10);\nauto t0=chrono::steady_clock::now();double T=15.0;int iter=0;\nwhile(true){if(!(++iter&511)){double e=chrono::duration<double>(chrono::steady_clock::now()-t0).count();if(e>2.75)break;T=max(0.05,15.0*pow(0.05/15.0,e/2.75));}\nint j=rng()%MK;Line nl;int sel=rng()%100;\nif(sel<35)nl=pline(cur_lines[j],30);else if(sel<60)nl=pline(cur_lines[j],300);else if(sel<80)nl=pline(cur_lines[j],2000);else nl=rline();\nif(nl.px==nl.qx&&nl.py==nl.qy)continue;\nint ns=try_ch(j,nl);int ds=ns-cscore;bool acc=(ds>=0);\nif(!acc&&T>0.01)acc=((double)(rng()>>8)/(double)(1u<<24))<exp((double)ds/T);\nif(acc){do_ch(j,nl);if(cscore>best_score){best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));}}}\ncout<<MK<<\"\\n\";for(int j=0;j<MK;j++)cout<<best_lines[j].px<<\" \"<<best_lines[j].py<<\" \"<<best_lines[j].qx<<\" \"<<best_lines[j].qy<<\"\\n\";return 0;}","ahc014":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=65;\nint N,M;\nbool dots[MAXN][MAXN],h_seg[MAXN][MAXN],v_seg[MAXN][MAXN],d1_seg[MAXN][MAXN],d2_seg[MAXN][MAXN];\nvector<int> row_dots[MAXN],col_dots[MAXN],diag_dots[130],ad_dots[130];\nstruct Op{int x1,y1,x2,y2,x3,y3,x4,y4;};\nvector<Op> ops;\nvoid insertSorted(vector<int>&v,int x){v.insert(lower_bound(v.begin(),v.end(),x),x);}\nvoid addDot(int x,int y){dots[x][y]=true;insertSorted(row_dots[y],x);insertSorted(col_dots[x],y);insertSorted(diag_dots[x-y+64],x);insertSorted(ad_dots[x+y],x);}\nbool edgeClear(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)if(v_seg[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)if(h_seg[x][y1])return false;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)if(d1_seg[xm+t][ym+t])return false;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)if(d2_seg[xm+t][ymx-t])return false;}}\n    return true;}\nbool edgeNoDots(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2)+1;y<max(y1,y2);y++)if(dots[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2)+1;x<max(x1,x2);x++)if(dots[x][y1])return false;}\n    else{int n=abs(x2-x1),dx=(x2>x1)?1:-1,dy=(y2>y1)?1:-1;for(int t=1;t<n;t++)if(dots[x1+t*dx][y1+t*dy])return false;}\n    return true;}\nvoid drawEdge(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)v_seg[x1][y]=true;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)h_seg[x][y1]=true;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)d1_seg[xm+t][ym+t]=true;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)d2_seg[xm+t][ymx-t]=true;}}}\nbool checkAndDo(int nx,int ny,int x2,int y2,int x3,int y3,int x4,int y4){\n    if(x2<0||x2>=N||y2<0||y2>=N||x3<0||x3>=N||y3<0||y3>=N||x4<0||x4>=N||y4<0||y4>=N)return false;\n    if(!dots[x2][y2]||!dots[x3][y3]||!dots[x4][y4])return false;\n    if(!edgeNoDots(nx,ny,x2,y2)||!edgeNoDots(x2,y2,x3,y3)||!edgeNoDots(x3,y3,x4,y4)||!edgeNoDots(x4,y4,nx,ny))return false;\n    if(!edgeClear(nx,ny,x2,y2)||!edgeClear(x2,y2,x3,y3)||!edgeClear(x3,y3,x4,y4)||!edgeClear(x4,y4,nx,ny))return false;\n    ops.push_back({nx,ny,x2,y2,x3,y3,x4,y4});addDot(nx,ny);\n    drawEdge(nx,ny,x2,y2);drawEdge(x2,y2,x3,y3);drawEdge(x3,y3,x4,y4);drawEdge(x4,y4,nx,ny);return true;}\nbool findAndPlace(int nx,int ny){\n    if(dots[nx][ny])return false;\n    {vector<tuple<int,int,int>> cands;\n    for(int x2:row_dots[ny]){if(x2==nx)continue;for(int y2:col_dots[nx]){if(y2==ny||!dots[x2][y2])continue;cands.emplace_back(abs(x2-nx)+abs(y2-ny),x2,y2);}}\n    sort(cands.begin(),cands.end());\n    for(auto&[p,x2,y2]:cands)if(checkAndDo(nx,ny,x2,ny,x2,y2,nx,y2))return true;}\n    {vector<tuple<int,int,int>> cands;\n    for(int xa:diag_dots[nx-ny+64]){if(xa==nx)continue;int a=xa-nx;for(int xb:ad_dots[nx+ny]){if(xb==nx)continue;int b=xb-nx,x3=nx+a+b,y3=ny+a-b;if(x3>=0&&x3<N&&y3>=0&&y3<N&&dots[x3][y3])cands.emplace_back(abs(a)+abs(b),xa,xb);}}\n    sort(cands.begin(),cands.end());\n    for(auto&[p,xa,xb]:cands){int a=xa-nx,b=xb-nx,x3=nx+a+b,y3=ny+a-b;if(checkAndDo(nx,ny,xa,ny+a,x3,y3,xb,ny-b))return true;}}\n    return false;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>M;for(int i=0;i<M;i++){int x,y;cin>>x>>y;addDot(x,y);}\n    int c=(N-1)/2;\n    vector<pair<int,pair<int,int>>> pts;\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)if(!dots[x][y])pts.emplace_back((x-c)*(x-c)+(y-c)*(y-c)+1,make_pair(x,y));\n    sort(pts.rbegin(),pts.rend());\n    auto t0=chrono::steady_clock::now();\n    bool changed=true;\n    while(changed){\n        if(chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count()>4000)break;\n        changed=false;\n        for(auto&[w,pos]:pts){auto[x,y]=pos;if(dots[x][y])continue;if(findAndPlace(x,y))changed=true;}}\n    cout<<ops.size()<<\"\\n\";\n    for(auto&op:ops)cout<<op.x1<<' '<<op.y1<<' '<<op.x2<<' '<<op.y2<<' '<<op.x3<<' '<<op.y3<<' '<<op.x4<<' '<<op.y4<<'\\n';\n    return 0;}","ahc015":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef array<array<int,10>,10> Grid;\n\nGrid applyTilt(Grid g, char dir) {\n    if (dir=='L') { for(int i=0;i<10;i++){int p=0;for(int j=0;j<10;j++)if(g[i][j])g[i][p++]=g[i][j];for(;p<10;p++)g[i][p]=0;} }\n    else if(dir=='R'){for(int i=0;i<10;i++){int p=9;for(int j=9;j>=0;j--)if(g[i][j])g[i][p--]=g[i][j];for(;p>=0;p--)g[i][p]=0;}}\n    else if(dir=='F'){for(int j=0;j<10;j++){int p=0;for(int i=0;i<10;i++)if(g[i][j])g[p++][j]=g[i][j];for(;p<10;p++)g[p][j]=0;}}\n    else{for(int j=0;j<10;j++){int p=9;for(int i=9;i>=0;i--)if(g[i][j])g[p--][j]=g[i][j];for(;p>=0;p--)g[p][j]=0;}}\n    return g;\n}\nlong long computeScore(const Grid& g){\n    bool vis[10][10]={};long long sum=0;int stk[100][2];\n    static const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\n    for(int si=0;si<10;si++)for(int sj=0;sj<10;sj++){\n        if(!g[si][sj]||vis[si][sj])continue;\n        int f=g[si][sj],sz=0,top=0;stk[top][0]=si;stk[top][1]=sj;top++;vis[si][sj]=true;\n        while(top>0){--top;int x=stk[top][0],y=stk[top][1];sz++;\n            for(int d=0;d<4;d++){int nx=x+dx[d],ny=y+dy[d];\n                if(nx>=0&&nx<10&&ny>=0&&ny<10&&!vis[nx][ny]&&g[nx][ny]==f){vis[nx][ny]=true;stk[top][0]=nx;stk[top][1]=ny;top++;}}}\n        sum+=(long long)sz*sz;}\n    return sum;\n}\nGrid placeCandy(Grid g,int p,int flav){int cnt=0;for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(!g[i][j]&&++cnt==p){g[i][j]=flav;return g;}return g;}\n\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int fl[100];for(int t=0;t<100;t++)cin>>fl[t];\n    Grid grid={};static const char dirs[]={'F','B','L','R'};\n    for(int t=0;t<100;t++){\n        int p;cin>>p;grid=placeCandy(grid,p,fl[t]);\n        char bestDir='F';\n        if(t<99){\n            long long best=-1;int nc=99-t;\n            for(char d1:dirs){\n                Grid g1=applyTilt(grid,d1);long long tot=0;\n                for(int p2=1;p2<=nc;p2++){\n                    Grid g2=placeCandy(g1,p2,fl[t+1]);long long mx=0;\n                    for(char d2:dirs){long long s=computeScore(applyTilt(g2,d2));if(s>mx)mx=s;}\n                    tot+=mx;}\n                if(tot>best){best=tot;bestDir=d1;}}\n        }\n        cout<<bestDir<<'\\n';cout.flush();grid=applyTilt(grid,bestDir);\n    }\n    return 0;\n}","ahc016":"#include <bits/stdc++.h>\n#include <Eigen/Dense>\nusing namespace std;\nusing namespace Eigen;\nint M, N;\ndouble eps;\nvector<double> getDeg(const string& s, int n) {\n    vector<int> d(n,0); int idx=0;\n    for(int i=0;i<n;i++) for(int j=i+1;j<n;j++,idx++) if(s[idx]=='1'){d[i]++;d[j]++;}\n    sort(d.begin(),d.end()); return {d.begin(),d.end()};\n}\nvector<double> getEig(const string& s, int n) {\n    MatrixXd A(n,n); A.setZero(); int idx=0;\n    for(int i=0;i<n;i++) for(int j=i+1;j<n;j++,idx++) if(s[idx]=='1') A(i,j)=A(j,i)=1.0;\n    SelfAdjointEigenSolver<MatrixXd> sol(A,EigenvaluesOnly);\n    vector<double> ev(n); for(int i=0;i<n;i++) ev[i]=sol.eigenvalues()(i); return ev;\n}\nstring makeG(int n, int m) {\n    int me=n*(n-1)/2; m=max(0,min(m,me)); string s(me,'0');\n    auto pos=[&](int a,int b)->int{if(a>b)swap(a,b);return a*(2*n-a-1)/2+(b-a-1);};\n    int cnt=0;\n    for(int d=1;d<n&&cnt<m;d++) for(int i=0;i<n&&cnt<m;i++){int j=(i+d)%n;if(i<j){s[pos(i,j)]='1';cnt++;}}\n    return s;\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    cin>>M>>eps;\n    N=4; while((long long)N*(N-1)/2<M&&N<100) N++;\n    if(eps>1e-9){\n        double need=9.0*(double)(M-1)*(M-1)*eps*(1.0-eps);\n        int N2=4; while((double)N2*(N2-1)/2<need&&N2<100) N2++; N=max(N,N2);\n    }\n    N=min(N,100); int ME=N*(N-1)/2;\n    vector<string> G(M);\n    for(int k=0;k<M;k++){int m=(int)round((double)k*ME/max(1,M-1)); G[k]=makeG(N,m);}\n    cout<<N<<\"\\n\"; for(auto&g:G) cout<<g<<\"\\n\"; cout<<flush;\n    bool useEig=(N<=40); int FD=N+(useEig?N:0);\n    vector<vector<double>> C(M,vector<double>(FD,0.0));\n    if(eps<1e-9){\n        for(int k=0;k<M;k++){\n            auto ds=getDeg(G[k],N); for(int i=0;i<N;i++) C[k][i]=ds[i];\n            if(useEig){auto es=getEig(G[k],N);for(int i=0;i<N;i++) C[k][N+i]=es[i];}\n        }\n    } else {\n        long long opPS=(long long)N*N+(useEig?(long long)N*N*N:0LL);\n        int NS=(int)(1e9/max(1LL,(long long)M*opPS)); NS=max(30,min(500,NS));\n        mt19937 rng(42); uniform_real_distribution<double> u(0.0,1.0);\n        for(int k=0;k<M;k++){\n            for(int s=0;s<NS;s++){\n                string t=G[k]; for(char&c:t) if(u(rng)<eps) c^=1;\n                auto ds=getDeg(t,N); for(int i=0;i<N;i++) C[k][i]+=ds[i];\n                if(useEig){auto es=getEig(t,N);for(int i=0;i<N;i++) C[k][N+i]+=es[i];}\n            }\n            for(int i=0;i<FD;i++) C[k][i]/=NS;\n        }\n    }\n    for(int q=0;q<100;q++){\n        string h; cin>>h;\n        vector<double> hf(FD); auto dh=getDeg(h,N); for(int i=0;i<N;i++) hf[i]=dh[i];\n        if(useEig){auto eh=getEig(h,N);for(int i=0;i<N;i++) hf[N+i]=eh[i];}\n        int best=0; double bestD=1e18;\n        for(int k=0;k<M;k++){\n            double d=0; for(int i=0;i<FD;i++){double dd=hf[i]-C[k][i];d+=dd*dd;}\n            if(d<bestD){bestD=d;best=k;}\n        }\n        cout<<best<<\"\\n\"<<flush;\n    }\n    return 0;\n}","ahc017":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef pair<ll,int> pli;\nconst ll INF=1e18;\nconst int MXN=1005,MXM=3005,MXD=35;\nint N,M,D,K,EU[MXM],EV[MXM];ll EW[MXM];\nvector<pair<int,int>> G[MXN];\nll gd[MXN][MXN];double imp[MXM];int aday[MXM];\ndouble ADJ[MXM][MXD];vector<int> ladj[MXM],dayE[MXD];int pos[MXM];\nuint64_t rs=0xbad1dea5ULL;\nuint64_t rng(){rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;}\nint ri(int n){return(int)(rng()%(unsigned)n);}\ndouble rd(){return(rng()>>11)*(1.0/(1ull<<53));}\nvoid dijk(int s){fill(gd[s]+1,gd[s]+N+1,INF);gd[s][s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[d,u]=pq.top();pq.pop();if(d>gd[s][u])continue;for(auto&[v,e]:G[u]){ll nd=d+EW[e];if(nd<gd[s][v]){gd[s][v]=nd;pq.push({nd,v});}}}}\nll dijkS(int s,int t,int sk){static ll d[MXN];fill(d+1,d+N+1,INF);d[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;if(u==t)return d[t];for(auto&[v,e]:G[u]){if(e==sk)continue;ll nd=dd+EW[e];if(nd<d[v]){d[v]=nd;pq.push({nd,v});}}}return d[t];}\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);\n    auto tst=chrono::steady_clock::now();\n    cin>>N>>M>>D>>K;\n    for(int i=0;i<M;i++){cin>>EU[i]>>EV[i]>>EW[i];G[EU[i]].push_back({EV[i],i});G[EV[i]].push_back({EU[i],i});}\n    for(int i=1;i<=N;i++){int x,y;cin>>x>>y;}\n    for(int s=1;s<=N;s++)dijk(s);\n    {vector<int>par(N+1,-1),sv(N);vector<ll>sz(N+1,1);iota(sv.begin(),sv.end(),1);\n    for(int s=1;s<=N;s++){fill(par.begin(),par.end(),-1);fill(sz.begin(),sz.end(),1LL);\n    sort(sv.begin(),sv.end(),[s](int a,int b){return gd[s][a]<gd[s][b];});\n    for(int v:sv){if(v==s)continue;for(auto&[u,e]:G[v])if(gd[s][u]+EW[e]==gd[s][v]){par[v]=e;break;}}\n    for(int i=N-1;i>=0;i--){int v=sv[i];if(par[v]<0)continue;int p=(EU[par[v]]==v)?EV[par[v]]:EU[par[v]];sz[p]+=sz[v];}\n    for(int v:sv){if(par[v]<0)continue;imp[par[v]]+=(double)sz[v];}}}\n    for(int e=0;e<M;e++){ll dt=dijkS(EU[e],EV[e],e);imp[e]*=(dt<INF)?(double)(dt-EW[e]):0.0;}\n    for(int u=1;u<=N;u++){int dg=G[u].size();for(int i=0;i<dg;i++)for(int j=i+1;j<dg;j++){int e1=G[u][i].second,e2=G[u][j].second;ladj[e1].push_back(e2);ladj[e2].push_back(e1);}}\n    for(int e=0;e<M;e++){sort(ladj[e].begin(),ladj[e].end());ladj[e].erase(unique(ladj[e].begin(),ladj[e].end()),ladj[e].end());}\n    auto isA=[](int a,int b){return binary_search(ladj[a].begin(),ladj[a].end(),b);};\n    fill(aday,aday+M,-1);int dc[MXD]={};\n    {vector<int>eo(M);iota(eo.begin(),eo.end(),0);sort(eo.begin(),eo.end(),[](int a,int b){return imp[a]>imp[b];});\n    for(int e:eo){int best=-1;double bs=1e18;for(int d=0;d<D;d++){if(dc[d]>=K)continue;double cf=0;for(int e2:ladj[e])if(aday[e2]==d)cf+=imp[e2];double sc=cf+1e-12*dc[d];if(best<0||sc<bs){bs=sc;best=d;}}if(best<0)best=0;aday[e]=best;dc[best]++;}}\n    memset(ADJ,0,sizeof(ADJ));\n    for(int e=0;e<M;e++)for(int e2:ladj[e])ADJ[e][aday[e2]]+=imp[e2];\n    for(int e=0;e<M;e++){pos[e]=dayE[aday[e]].size();dayE[aday[e]].push_back(e);}\n    double T=1.0;\n    {double sm=0;int c=0;for(int tr=0;tr<100000&&c<3000;tr++){int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isA(e1,e2)*imp[e1]*imp[e2];sm+=fabs(dl);c++;}if(c>0)T=sm/c;if(T<1e-9)T=1.0;}\n    double T0=T;\n    for(long long step=0;;step++){\n        if(step%200000==0){double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>5.5)break;T=T0*exp(-10.*el/5.5);}\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isA(e1,e2)*imp[e1]*imp[e2];\n        if(dl<=0||(T>1e-9&&rd()<exp(-dl/T))){\n            for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}\n            for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n            {int p=pos[e1],L=dayE[d1].back();dayE[d1][p]=L;pos[L]=p;dayE[d1].pop_back();}\n            {int p=pos[e2],L=dayE[d2].back();dayE[d2][p]=L;pos[L]=p;dayE[d2].pop_back();}\n            pos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;\n            pos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n        }\n    }\n    for(int i=0;i<M;i++){if(i)cout<<' ';cout<<aday[i]+1;}cout<<'\\n';\n}","ahc019":"#include <bits/stdc++.h>\nusing namespace std;\nint D;\nstring Fs[2][14], Rs[2][14];\nint bid;\nint B[2][2744];\nvoid fill_patch(int a,int x0,int y0,int z0,int xl,int yl,int id){\n    for(int i=0;i<xl;i++)for(int j=0;j<yl;j++)B[a][(x0+i)*D*D+(y0+j)*D+z0]=id;\n}\nvoid fill_line(int a,int x,int y,int z,int len,int ax,int id){\n    for(int k=0;k<len;k++)B[a][(x+(ax==0?k:0))*D*D+(y+(ax==1?k:0))*D+(z+(ax==2?k:0))]=id;\n}\nstruct Patch{int x,y,z,xl,yl;};\nstruct Line{int x,y,z,len,ax;};\nvector<Patch> getPatches(int a){\n    vector<Patch> P;\n    for(int z=0;z<D;z++){\n        vector<pair<int,int>> xr,yr;\n        for(int x=0,s=-1;x<=D;x++){bool v=x<D&&Fs[a][z][x]=='1';if(v&&s<0)s=x;else if(!v&&s>=0){xr.push_back({s,x-s});s=-1;}}\n        for(int y=0,s=-1;y<=D;y++){bool v=y<D&&Rs[a][z][y]=='1';if(v&&s<0)s=y;else if(!v&&s>=0){yr.push_back({s,y-s});s=-1;}}\n        for(auto[x0,xl]:xr)for(auto[y0,yl]:yr)P.push_back({x0,y0,z,xl,yl});\n    }\n    return P;\n}\nvector<Line> makeLines(const vector<Patch>& P,const vector<bool>& u,int ax){\n    vector<Line> L;\n    for(int i=0;i<(int)P.size();i++)if(!u[i]){\n        const auto& p=P[i];\n        if(ax==1){for(int dx=0;dx<p.xl;dx++)L.push_back({p.x+dx,p.y,p.z,p.yl,1});}\n        else{for(int dy=0;dy<p.yl;dy++)L.push_back({p.x,p.y+dy,p.z,p.xl,0});}\n    }\n    return L;\n}\ndouble matchScore(const vector<Line>& L0,const vector<Line>& L1){\n    map<int,int> c0,c1;\n    for(const auto& l:L0)c0[l.len]++;\n    for(const auto& l:L1)c1[l.len]++;\n    double sc=0;int v0=0,v1=0;\n    for(const auto& [l,c]:c0){int cl=c1.count(l)?c1.at(l):0;int mc=min(c,cl);sc+=mc*1.0/l;v0+=(c-mc)*l;}\n    for(const auto& [l,c]:c1){int cl=c0.count(l)?c0.at(l):0;if(c>cl)v1+=(c-cl)*l;}\n    sc+=max(v0,v1);\n    return sc;\n}\nint main(){\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    cin>>D;\n    for(int i=0;i<2;i++){for(int z=0;z<D;z++)cin>>Fs[i][z];for(int z=0;z<D;z++)cin>>Rs[i][z];}\n    memset(B,0,sizeof(B));\n    bid=0;\n    auto P0=getPatches(0),P1=getPatches(1);\n    map<pair<int,int>,vector<int>> g0,g1;\n    for(int i=0;i<(int)P0.size();i++)g0[{min(P0[i].xl,P0[i].yl),max(P0[i].xl,P0[i].yl)}].push_back(i);\n    for(int i=0;i<(int)P1.size();i++)g1[{min(P1[i].xl,P1[i].yl),max(P1[i].xl,P1[i].yl)}].push_back(i);\n    vector<bool> u0(P0.size(),false),u1(P1.size(),false);\n    for(auto& [d,v0]:g0){\n        auto it=g1.find(d);if(it==g1.end())continue;\n        auto& v1=it->second;\n        int mc=min((int)v0.size(),(int)v1.size());\n        for(int j=0;j<mc;j++){\n            bid++;\n            fill_patch(0,P0[v0[j]].x,P0[v0[j]].y,P0[v0[j]].z,P0[v0[j]].xl,P0[v0[j]].yl,bid);\n            fill_patch(1,P1[v1[j]].x,P1[v1[j]].y,P1[v1[j]].z,P1[v1[j]].xl,P1[v1[j]].yl,bid);\n            u0[v0[j]]=u1[v1[j]]=true;\n        }\n    }\n    int best_ax;\n    {\n        double sa=matchScore(makeLines(P0,u0,0),makeLines(P1,u1,0));\n        double sb=matchScore(makeLines(P0,u0,1),makeLines(P1,u1,1));\n        best_ax=(sa<=sb)?0:1;\n    }\n    auto L0=makeLines(P0,u0,best_ax),L1=makeLines(P1,u1,best_ax);\n    map<int,vector<int>> gl0,gl1;\n    for(int i=0;i<(int)L0.size();i++)gl0[L0[i].len].push_back(i);\n    for(int i=0;i<(int)L1.size();i++)gl1[L1[i].len].push_back(i);\n    vector<bool> lu0(L0.size(),false),lu1(L1.size(),false);\n    for(auto& [l,v0]:gl0){\n        auto it=gl1.find(l);if(it==gl1.end())continue;\n        auto& v1=it->second;\n        int mc=min((int)v0.size(),(int)v1.size());\n        for(int j=0;j<mc;j++){\n            bid++;\n            fill_line(0,L0[v0[j]].x,L0[v0[j]].y,L0[v0[j]].z,l,L0[v0[j]].ax,bid);\n            fill_line(1,L1[v1[j]].x,L1[v1[j]].y,L1[v1[j]].z,l,L1[v1[j]].ax,bid);\n            lu0[v0[j]]=lu1[v1[j]]=true;\n        }\n    }\n    vector<pair<int,int>> rv0,rv1;\n    for(int i=0;i<(int)L0.size();i++)if(!lu0[i])rv0.push_back({L0[i].len,i});\n    for(int i=0;i<(int)L1.size();i++)if(!lu1[i])rv1.push_back({L1[i].len,i});\n    sort(rv0.rbegin(),rv0.rend());\n    sort(rv1.begin(),rv1.end());\n    struct SO{int idx,off;};\n    deque<SO> r0,r1;\n    for(auto& [l,i]:rv0)r0.push_back({i,0});\n    for(auto& [l,i]:rv1)r1.push_back({i,0});\n    auto gpos=[&](const Line& s,int off)->tuple<int,int,int>{\n        return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};\n    };\n    while(!r0.empty()&&!r1.empty()){\n        auto& [i0,o0]=r0.front();\n        auto& [i1,o1]=r1.front();\n        int ml=min(L0[i0].len-o0,L1[i1].len-o1);\n        bid++;\n        auto [x0,y0,z0]=gpos(L0[i0],o0);\n        auto [x1,y1,z1]=gpos(L1[i1],o1);\n        fill_line(0,x0,y0,z0,ml,L0[i0].ax,bid);\n        fill_line(1,x1,y1,z1,ml,L1[i1].ax,bid);\n        o0+=ml;o1+=ml;\n        if(o0==L0[i0].len)r0.pop_front();\n        if(o1==L1[i1].len)r1.pop_front();\n    }\n    while(!r0.empty()){\n        auto [i0,o0]=r0.front();r0.pop_front();\n        bid++;\n        auto [x,y,z]=gpos(L0[i0],o0);\n        fill_line(0,x,y,z,L0[i0].len-o0,L0[i0].ax,bid);\n    }\n    while(!r1.empty()){\n        auto [i1,o1]=r1.front();r1.pop_front();\n        bid++;\n        auto [x,y,z]=gpos(L1[i1],o1);\n        fill_line(1,x,y,z,L1[i1].len-o1,L1[i1].ax,bid);\n    }\n    cout<<bid<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[0][i];}cout<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[1][i];}cout<<\"\\n\";\n    return 0;\n}","ahc020":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    int N, M, K;\n    cin >> N >> M >> K;\n    vector<ll> X(N), Y(N);\n    for (int i = 0; i < N; i++) cin >> X[i] >> Y[i];\n    vector<int> EU(M), EV(M); vector<ll> EW(M);\n    for (int j = 0; j < M; j++) { cin >> EU[j] >> EV[j] >> EW[j]; EU[j]--; EV[j]--; }\n    vector<ll> A(K), B(K);\n    for (int k = 0; k < K; k++) cin >> A[k] >> B[k];\n    const ll MAXP = 5000, MAXP2 = MAXP * MAXP, INF = (ll)4e18;\n    vector<vector<ll>> D2(N, vector<ll>(K));\n    for (int i = 0; i < N; i++)\n        for (int k = 0; k < K; k++) {\n            ll dx = A[k]-X[i], dy = B[k]-Y[i]; D2[i][k] = dx*dx+dy*dy;\n        }\n    vector<vector<pair<int,int>>> adj(N);\n    for (int j = 0; j < M; j++) {\n        adj[EU[j]].push_back({EV[j],j}); adj[EV[j]].push_back({EU[j],j});\n    }\n    auto pVal = [&](ll d2) -> ll {\n        if (!d2) return 0;\n        ll p = (ll)sqrt((double)d2);\n        while (p*p < d2) p++;\n        return min(p, MAXP);\n    };\n    // APSP\n    vector<vector<ll>> spD(N, vector<ll>(N, INF));\n    vector<vector<int>> spE(N, vector<int>(N,-1)), spPr(N, vector<int>(N,-1));\n    for (int s = 0; s < N; s++) {\n        spD[s][s] = 0;\n        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> pq;\n        pq.push({0,s});\n        while (!pq.empty()) {\n            auto [d,v] = pq.top(); pq.pop();\n            if (d > spD[s][v]) continue;\n            for (auto& [u,j] : adj[v]) {\n                ll nd = d+EW[j];\n                if (nd < spD[s][u]) { spD[s][u]=nd; spPr[s][u]=v; spE[s][u]=j; pq.push({nd,u}); }\n            }\n        }\n    }\n    auto buildSteiner = [&](vector<bool> term) -> vector<bool> {\n        term[0] = true;\n        vector<int> T;\n        for (int i = 0; i < N; i++) if (term[i]) T.push_back(i);\n        int TN = T.size();\n        vector<bool> inST(TN,false); vector<ll> key(TN,INF); vector<int> par(TN,-1);\n        key[0] = 0;\n        for (int it = 0; it < TN; it++) {\n            int u = -1;\n            for (int i = 0; i < TN; i++) if (!inST[i]&&(u<0||key[i]<key[u])) u=i;\n            if (u<0||key[u]>=INF) break;\n            inST[u] = true;\n            for (int w = 0; w < TN; w++)\n                if (!inST[w]&&spD[T[u]][T[w]]<key[w]) { key[w]=spD[T[u]][T[w]]; par[w]=u; }\n        }\n        vector<bool> eo(M,false);\n        for (int i = 0; i < TN; i++) {\n            if (par[i]<0) continue;\n            int src=T[par[i]], dst=T[i];\n            for (int v=dst; v!=src; v=spPr[src][v]) eo[spE[src][v]]=true;\n        }\n        return eo;\n    };\n    auto evalEO = [&](const vector<bool>& eo) -> tuple<vector<int>,ll,bool> {\n        vector<bool> reach(N,false);\n        queue<int> q; q.push(0); reach[0]=true;\n        while (!q.empty()) {\n            int v=q.front(); q.pop();\n            for (auto& [u,j]:adj[v]) if(eo[j]&&!reach[u]){reach[u]=true;q.push(u);}\n        }\n        ll ec=0; for(int j=0;j<M;j++) if(eo[j]) ec+=EW[j];\n        vector<ll> mxD2(N,0);\n        for (int k=0; k<K; k++) {\n            ll best=INF; int bv=-1;\n            for (int i=0;i<N;i++) if(reach[i]&&D2[i][k]<best){best=D2[i][k];bv=i;}\n            if (bv<0||best>MAXP2) return {{},INF,false};\n            mxD2[bv]=max(mxD2[bv],best);\n        }\n        vector<int> P(N,0); ll pc=0;\n        for (int i=0;i<N;i++) if(reach[i]&&mxD2[i]>0){ll p=pVal(mxD2[i]);P[i]=(int)p;pc+=p*p;}\n        return {P,ec+pc,true};\n    };\n    // MST\n    vector<int> mstPar(N,-1), mstPE(N,-1); vector<vector<int>> mstCh(N);\n    {\n        vector<bool> vis(N,false); vector<ll> key(N,INF); key[0]=0;\n        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> pq; pq.push({0,0});\n        while (!pq.empty()) {\n            auto [d,v]=pq.top(); pq.pop();\n            if (vis[v]) continue; vis[v]=true;\n            for (auto& [u,j]:adj[v]) if(!vis[u]&&EW[j]<key[u]){key[u]=EW[j];mstPar[u]=v;mstPE[u]=j;pq.push({EW[j],u});}\n        }\n        for (int v=1;v<N;v++) mstCh[mstPar[v]].push_back(v);\n    }\n    // MST leaf pruning\n    vector<bool> act(N,true); vector<vector<int>> vRes(N); vector<ll> vmx(N,0), Pv(N,0);\n    for (int k=0;k<K;k++){\n        ll best=INF; int bv=-1;\n        for(int i=0;i<N;i++) if(D2[i][k]<best){best=D2[i][k];bv=i;}\n        vRes[bv].push_back(k); vmx[bv]=max(vmx[bv],best);\n    }\n    for (int i=0;i<N;i++) Pv[i]=pVal(vmx[i]);\n    ll ec0=0,pc0=0;\n    for (int v=1;v<N;v++) ec0+=EW[mstPE[v]];\n    for (int i=0;i<N;i++) pc0+=Pv[i]*Pv[i];\n    auto isLeaf=[&](int v){for(int c:mstCh[v])if(act[c])return false;return true;};\n    for (bool imp=true;imp;) {\n        imp=false; ll bDelta=0; int bV=-1;\n        vector<pair<int,int>> bAs; vector<pair<int,ll>> bAf;\n        for (int v=1;v<N;v++) {\n            if (!act[v]||!isLeaf(v)) continue;\n            ll delta=-(EW[mstPE[v]]+Pv[v]*Pv[v]);\n            map<int,ll> tmp; vector<pair<int,int>> ta; bool ok=true;\n            for (int k:vRes[v]) {\n                ll best=INF; int bu=-1;\n                for (int u=0;u<N;u++){if(u==v||!act[u])continue;if(D2[u][k]<best){best=D2[u][k];bu=u;}}\n                if (bu<0||best>MAXP2){ok=false;break;}\n                ta.push_back({k,bu});\n                if(!tmp.count(bu)) tmp[bu]=vmx[bu];\n                tmp[bu]=max(tmp[bu],best);\n            }\n            if (!ok) continue;\n            for (auto& [u,nd]:tmp){ll np=pVal(nd);delta+=np*np-Pv[u]*Pv[u];}\n            if (delta<bDelta){bDelta=delta;bV=v;bAs=ta;bAf.clear();for(auto&[u,nd]:tmp)bAf.push_back({u,nd});}\n        }\n        if (bV>=0) {\n            act[bV]=false; ec0-=EW[mstPE[bV]]; pc0-=Pv[bV]*Pv[bV];\n            Pv[bV]=0; vmx[bV]=0; vRes[bV].clear();\n            for (auto&[k,u]:bAs) vRes[u].push_back(k);\n            for (auto&[u,nd]:bAf){pc0-=Pv[u]*Pv[u];vmx[u]=nd;Pv[u]=pVal(nd);pc0+=Pv[u]*Pv[u];}\n            imp=true;\n        }\n    }\n    ll bestCost=ec0+pc0;\n    vector<bool> bestEO(M,false);\n    for (int v=1;v<N;v++) if(act[v]) bestEO[mstPE[v]]=true;\n    vector<int> bestP(N,0);\n    for (int i=0;i<N;i++) bestP[i]=(int)Pv[i];\n    auto updateBest=[&](const vector<bool>& eo,const vector<int>& P,ll cost){\n        if(cost<bestCost){bestCost=cost;bestEO=eo;bestP=P;}\n    };\n    auto runSteiner=[&](vector<bool> term){\n        term[0]=true;\n        for (int sit=0;sit<20;sit++){\n            auto eo=buildSteiner(term);\n            auto [sp,sc,sf]=evalEO(eo);\n            if (!sf) break;\n            updateBest(eo,sp,sc);\n            vector<bool> nt(N,false); nt[0]=true;\n            for (int i=0;i<N;i++) if(sp[i]>0) nt[i]=true;\n            if (nt==term) break;\n            term=nt;\n        }\n    };\n    // Steiner from MST-pruned terminals\n    { vector<bool> t(N,false); for(int i=0;i<N;i++) if(Pv[i]>0) t[i]=true; runSteiner(t); }\n    // Steiner from all-vertices terminals\n    { vector<bool> t(N,true); runSteiner(t); }\n    for (int i=0;i<N;i++) cout<<bestP[i]<<\" \\n\"[i==N-1];\n    for (int j=0;j<M;j++) cout<<(int)bestEO[j]<<\" \\n\"[j==M-1];\n    return 0;\n}","ahc021":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int N = 30;\nint board[N][N];\nint pr[N*(N+1)/2], pc[N*(N+1)/2];\nvector<array<int,4>> ops;\n\nvoid swap_it(int x1, int y1, int x2, int y2) {\n    int v1 = board[x1][y1], v2 = board[x2][y2];\n    swap(board[x1][y1], board[x2][y2]);\n    pr[v1] = x2; pc[v1] = y2;\n    pr[v2] = x1; pc[v2] = y1;\n    ops.push_back({x1, y1, x2, y2});\n}\n\nvoid move_to(int v, int tx, int ty) {\n    if (pc[v] < ty) {\n        while (pc[v] < ty) swap_it(pr[v], pc[v], pr[v], pc[v]+1);\n        while (pr[v] > tx) swap_it(pr[v], ty, pr[v]-1, ty);\n    } else {\n        int extra = (pc[v] - ty) - (pr[v] - tx);\n        for (int i = 0; i < extra; i++)\n            swap_it(pr[v], pc[v], pr[v], pc[v]-1);\n        while (pr[v] > tx) {\n            if (pc[v] > ty) swap_it(pr[v], pc[v], pr[v]-1, pc[v]-1);\n            else swap_it(pr[v], pc[v], pr[v]-1, pc[v]);\n        }\n    }\n}\n\nint main() {\n    ios::sync_with_stdio(false);\n    cin.tie(nullptr);\n    \n    for (int x = 0; x < N; x++)\n        for (int y = 0; y <= x; y++) {\n            cin >> board[x][y];\n            pr[board[x][y]] = x;\n            pc[board[x][y]] = y;\n        }\n    \n    for (int x = 0; x < N; x++) {\n        int base = x*(x+1)/2;\n        \n        vector<pair<int,int>> cv;\n        for (int i = 0; i <= x; i++) cv.push_back({pc[base+i], i});\n        sort(cv.begin(), cv.end());\n        \n        vector<int> asgn(x+1);\n        for (int i = 0; i <= x; i++) asgn[i] = cv[i].second;\n        \n        for (int ty = x; ty >= 0; ty--)\n            move_to(base + asgn[ty], x, ty);\n    }\n    \n    cout << ops.size() << \"\\n\";\n    for (auto& op : ops)\n        cout << op[0] << \" \" << op[1] << \" \" << op[2] << \" \" << op[3] << \"\\n\";\n}","toyota2023summer-final":"#include <bits/stdc++.h>\nusing namespace std;\nconst int D9=9;\nint D,N,M;\nbool obs[D9][D9],hasc[D9][D9];\nint cnum[D9][D9],sr[D9*D9],sc[D9*D9],prank[D9][D9];\nint er,ec;\nconst int dr[4]={-1,1,0,0},dc[4]={0,0,-1,1};\nbool in_(int r,int c){return r>=0&&r<D&&c>=0&&c<D;}\nvoid build_sigma(){\n    int dist[D9][D9];memset(dist,-1,sizeof dist);\n    queue<pair<int,int>>q;q.push({er,ec});dist[er][ec]=0;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||dist[nx][ny]>=0||obs[nx][ny])continue;dist[nx][ny]=dist[x][y]+1;q.push({nx,ny});}}\n    vector<pair<int,int>>pos;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(!obs[r][c]&&!(r==er&&c==ec))pos.emplace_back(r,c);\n    sort(pos.begin(),pos.end(),[&](const pair<int,int>&a,const pair<int,int>&b){if(dist[a.first][a.second]!=dist[b.first][b.second])return dist[a.first][a.second]<dist[b.first][b.second];if(a.first!=b.first)return a.first<b.first;return a.second<b.second;});\n    M=(int)pos.size();\n    for(int k=0;k<M;k++){sr[k]=pos[k].first;sc[k]=pos[k].second;prank[pos[k].first][pos[k].second]=k;}\n}\nvoid bfs_emp(bool vis[D9][D9]){\n    memset(vis,0,D9*D9*sizeof(bool));\n    queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny]||hasc[nx][ny])continue;vis[nx][ny]=1;q.push({nx,ny});}}\n}\nbool safe_place(int r,int c,const vector<pair<int,int>>&reach){\n    bool vis[D9][D9];memset(vis,0,sizeof vis);\n    queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny]||hasc[nx][ny])continue;if(nx==r&&ny==c)continue;vis[nx][ny]=1;q.push({nx,ny});}}\n    for(auto[pr,pc]:reach){if(pr==r&&pc==c)continue;if(!vis[pr][pc])return false;}\n    return true;\n}\npair<int,int>pick_place(int t){\n    bool vis[D9][D9];bfs_emp(vis);\n    int ir=sr[t],ic=sc[t];\n    vector<pair<int,int>>reach;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(vis[r][c]&&!(r==er&&c==ec))reach.emplace_back(r,c);\n    if(vis[ir][ic]&&safe_place(ir,ic,reach))return{ir,ic};\n    pair<int,int>best{-1,-1};int bd=INT_MAX,brk=-1;bool gots=false;\n    for(auto[r,c]:reach){\n        if(r==ir&&c==ic)continue;\n        bool s=safe_place(r,c,reach);\n        int d=abs(prank[r][c]-t),rk=prank[r][c];\n        bool better=(!gots&&s)||(gots==s&&(d<bd||(d==bd&&rk>brk)));\n        if(better){best={r,c};bd=d;brk=rk;gots=s;}\n    }\n    return best;\n}\nvector<pair<int,int>>transport(){\n    bool h[D9][D9];memcpy(h,hasc,sizeof h);\n    vector<pair<int,int>>ord;ord.reserve(M);\n    for(int s=0;s<M;s++){\n        bool vis[D9][D9];memset(vis,0,sizeof vis);\n        queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n        int bn=INT_MAX,br=-1,bc=-1;\n        while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny])continue;vis[nx][ny]=1;if(h[nx][ny]){if(cnum[nx][ny]<bn){bn=cnum[nx][ny];br=nx;bc=ny;}}else q.push({nx,ny});}}\n        ord.emplace_back(br,bc);h[br][bc]=0;\n    }\n    return ord;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>D>>N;\n    memset(obs,0,sizeof obs);memset(hasc,0,sizeof hasc);memset(cnum,-1,sizeof cnum);\n    er=0;ec=(D-1)/2;\n    for(int i=0;i<N;i++){int r,c;cin>>r>>c;obs[r][c]=1;}\n    build_sigma();\n    for(int d=0;d<M;d++){\n        int t;cin>>t;\n        auto[r,c]=pick_place(t);\n        hasc[r][c]=1;cnum[r][c]=t;\n        cout<<r<<' '<<c<<'\\n';cout.flush();\n    }\n    auto ord=transport();\n    for(auto[r,c]:ord)cout<<r<<' '<<c<<'\\n';\n    cout.flush();\n}","ahc024":"#include <bits/stdc++.h>\nusing namespace std;\nint n,m,g[50][50];\nbool adj[102][102];\nint acnt[102][102],ccnt[102];\nconst int dr[]={0,0,1,-1},dc[]={1,-1,0,0};\nint gc(int r,int c){return(r<0||r>=n||c<0||c>=n)?0:g[r][c];}\nvoid init(){\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){\n        int col=g[i][j];ccnt[col]++;\n        bool seen[102]={};\n        for(int d=0;d<4;d++){\n            int nc=gc(i+dr[d],j+dc[d]);\n            if(nc!=col&&!seen[nc]){adj[col][nc]=adj[nc][col]=1;acnt[col][nc]++;seen[nc]=1;}\n        }\n    }\n}\nbool conn_ok(int r,int c,int col){\n    if(ccnt[col]<=1)return 0;\n    int sr=-1,sc_=-1;\n    for(int i=0;i<n&&sr<0;i++)for(int j=0;j<n;j++)if(g[i][j]==col&&!(i==r&&j==c)){sr=i;sc_=j;break;}\n    if(sr<0)return 0;\n    bool vis[50][50]={};\n    queue<pair<int,int>>q;q.push({sr,sc_});vis[sr][sc_]=1;int cnt=1;\n    while(!q.empty()){\n        auto[cr,cc]=q.front();q.pop();\n        for(int d=0;d<4;d++){int nr=cr+dr[d],nc=cc+dc[d];\n            if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==col&&!(nr==r&&nc==c)&&!vis[nr][nc]){vis[nr][nc]=1;cnt++;q.push({nr,nc});}\n        }\n    }\n    return cnt==ccnt[col]-1;\n}\nbool can(int r,int c){\n    int col=g[r][c];\n    if(!col||!adj[col][0])return 0;\n    for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&!adj[nc][0])return 0;}\n    bool za=(r==0||r==n-1||c==0||c==n-1);\n    if(!za)for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&!g[nr][nc]){za=1;break;}}\n    if(!za)return 0;\n    if(!conn_ok(r,c,col))return 0;\n    for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&acnt[col][nc]<=1)return 0;}\n    return 1;\n}\nvoid conv(int r,int c){\n    int col=g[r][c];\n    bool seen[102]={};\n    for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!seen[nc]){acnt[col][nc]--;seen[nc]=1;}}\n    g[r][c]=0;ccnt[col]--;ccnt[0]++;\n    for(int d=0;d<4;d++){\n        int nr=r+dr[d],nc=c+dc[d];\n        if(nr<0||nr>=n||nc<0||nc>=n)continue;\n        int ncol=g[nr][nc];if(!ncol)continue;\n        bool hz=0;\n        for(int d2=0;d2<4;d2++){\n            int nr2=nr+dr[d2],nc2=nc+dc[d2];\n            if(nr2==r&&nc2==c)continue;\n            if(nr2<0||nr2>=n||nc2<0||nc2>=n){hz=1;break;}\n            if(!g[nr2][nc2]){hz=1;break;}\n        }\n        if(!hz)acnt[ncol][0]++;\n        if(ncol==col)continue;\n        bool sc2=0;\n        for(int d2=0;d2<4;d2++){\n            int nr2=nr+dr[d2],nc2=nc+dc[d2];\n            if(nr2==r&&nc2==c)continue;\n            if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){sc2=1;break;}\n        }\n        if(!sc2)acnt[ncol][col]--;\n    }\n}\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);\n    cin>>n>>m;\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>g[i][j];\n    init();\n    bool ch=1;\n    while(ch){\n        ch=0;\n        for(int i=0;i<n;i++)for(int j=0;j<n;j++)\n            if(g[i][j]&&can(i,j)){conv(i,j);ch=1;}\n    }\n    for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j)cout<<' ';cout<<g[i][j];}cout<<'\\n';}\n}","ahc025":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N, D, Q, q_used = 0;\n\nchar bq(const vector<int>& L, const vector<int>& R) {\n    cout << L.size() << \" \" << R.size();\n    for (int x : L) cout << \" \" << x;\n    for (int x : R) cout << \" \" << x;\n    cout << \"\\n\";\n    cout.flush();\n    q_used++;\n    char c; cin >> c; return c;\n}\n\nint slm;\nvector<int> ms(vector<int> a) {\n    if ((int)a.size() <= 1 || q_used >= slm) return a;\n    int m = a.size() / 2;\n    auto L = ms(vector<int>(a.begin(), a.begin() + m));\n    auto R = ms(vector<int>(a.begin() + m, a.end()));\n    vector<int> r; int i = 0, j = 0;\n    while (i < (int)L.size() && j < (int)R.size()) {\n        if (q_used >= slm) break;\n        if (bq({L[i]}, {R[j]}) != '>') r.push_back(L[i++]);\n        else r.push_back(R[j++]);\n    }\n    while (i < (int)L.size()) r.push_back(L[i++]);\n    while (j < (int)R.size()) r.push_back(R[j++]);\n    return r;\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n    cin >> N >> D >> Q;\n\n    auto t0 = chrono::high_resolution_clock::now();\n    auto el = [&]() {\n        return chrono::duration<double>(chrono::high_resolution_clock::now() - t0).count();\n    };\n\n    // Phase 1: Sort\n    slm = Q / 2;\n    vector<int> ini(N); iota(ini.begin(), ini.end(), 0);\n    vector<int> ord = ms(ini);\n\n    vector<int> pos(N);\n    for (int i = 0; i < N; i++) pos[ord[i]] = i;\n\n    // Phase 2: Weight estimation via binary search on prefix sums\n    int est_end = Q * 4 / 5;\n    vector<double> w(N, 1.0), ps(N + 1, 0.0);\n    w[ord[0]] = 1.0; ps[1] = 1.0;\n\n    for (int i = 1; i < N; i++) {\n        int lo = 0, hi = i;\n        while (lo < hi && q_used < est_end) {\n            int mid = (lo + hi) / 2;\n            if (bq({ord[i]}, vector<int>(ord.begin(), ord.begin() + mid + 1)) == '>')\n                lo = mid + 1;\n            else hi = mid;\n        }\n        double wlo = ps[lo];\n        double whi = (lo < i) ? ps[lo + 1] : ps[i] * 2.0;\n        w[ord[i]] = max(w[ord[i-1]], (wlo + whi) / 2.0);\n        ps[i+1] = ps[i] + w[ord[i]];\n    }\n\n    // Phase 3: LPT partition\n    vector<int> oi(N); iota(oi.begin(), oi.end(), 0);\n    sort(oi.begin(), oi.end(), [&](int a, int b) {\n        if (fabs(w[a]-w[b]) > 1e-12) return w[a] > w[b];\n        return pos[a] > pos[b];\n    });\n    vector<double> gw(D, 0.0);\n    vector<int> asgn(N, 0);\n    for (int x : oi) {\n        int g = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        asgn[x] = g; gw[g] += w[x];\n    }\n\n    // Phase 4: Local search with estimated weights\n    double total = 0; for (double x : gw) total += x;\n    double mean = total / D;\n\n    for (int p = 0; p < 5000 && el() < 1.5; p++) {\n        bool imp = false;\n        // Single moves\n        for (int x = 0; x < N; x++) {\n            int g0 = asgn[x]; int bg = g0; double bd = 0;\n            double d0 = gw[g0] - mean;\n            for (int g = 0; g < D; g++) {\n                if (g == g0) continue;\n                double d1 = gw[g] - mean;\n                double dc = d0*d0 + d1*d1 - (d0-w[x])*(d0-w[x]) - (d1+w[x])*(d1+w[x]);\n                if (dc > bd) { bd = dc; bg = g; }\n            }\n            if (bg != g0) { gw[g0] -= w[x]; gw[bg] += w[x]; asgn[x] = bg; imp = true; }\n        }\n        // Swaps\n        for (int i = 0; i < N && el() < 1.4; i++) {\n            for (int j = i+1; j < N; j++) {\n                if (asgn[i] == asgn[j]) continue;\n                int gi = asgn[i], gj = asgn[j];\n                double di = gw[gi]-mean, dj = gw[gj]-mean;\n                double di2 = di-w[i]+w[j], dj2 = dj+w[i]-w[j];\n                if (di*di + dj*dj > di2*di2 + dj2*dj2 + 1e-9) {\n                    gw[gi] += w[j]-w[i]; gw[gj] += w[i]-w[j];\n                    asgn[i] = gj; asgn[j] = gi; imp = true;\n                }\n            }\n        }\n        if (!imp) break;\n    }\n\n    // Phase 5: Actual balance improvement using remaining queries\n    vector<vector<int>> gi(D);\n    for (int x = 0; x < N; x++) gi[asgn[x]].push_back(x);\n    for (int g = 0; g < D; g++)\n        sort(gi[g].begin(), gi[g].end(), [&](int a, int b){ return pos[a] < pos[b]; });\n\n    while (q_used + 2 <= Q && el() < 1.9) {\n        int gh = (int)(max_element(gw.begin(), gw.end()) - gw.begin());\n        int gl = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        if (gw[gh] <= gw[gl] + 1e-9 || gi[gh].empty() || gi[gl].empty()) break;\n\n        char cmp = bq(gi[gh], gi[gl]);\n        if (cmp == '=') { gw[gh] = gw[gl] = (gw[gh]+gw[gl])/2; continue; }\n        if (cmp == '<') { swap(gh, gl); swap(gw[gh], gw[gl]); }\n\n        auto& hv = gi[gh]; auto& lt = gi[gl];\n        if ((int)hv.size() <= 1) continue;\n\n        int lo = 0, hi = (int)hv.size() - 1;\n        while (lo < hi && q_used + 1 <= Q && el() < 1.85) {\n            int mid = (lo + hi) / 2;\n            vector<int> L2, R2 = lt;\n            for (int k = 0; k < (int)hv.size(); k++) if (k != mid) L2.push_back(hv[k]);\n            R2.push_back(hv[mid]);\n            char r = bq(L2, R2);\n            if (r == '=') { lo = hi = mid; break; }\n            else if (r == '>') lo = mid + 1;\n            else hi = mid;\n        }\n        lo = min(lo, (int)hv.size() - 1);\n        if (lo > 0) {\n            double da = fabs((gw[gh]-w[hv[lo]]) - (gw[gl]+w[hv[lo]]));\n            double db = fabs((gw[gh]-w[hv[lo-1]]) - (gw[gl]+w[hv[lo-1]]));\n            if (db < da) lo--;\n        }\n\n        int mv = hv[lo];\n        asgn[mv] = gl;\n        gw[gh] -= w[mv]; gw[gl] += w[mv];\n        hv.erase(hv.begin() + lo);\n        lt.insert(lower_bound(lt.begin(), lt.end(), mv,\n            [&](int a, int b){ return pos[a] < pos[b]; }), mv);\n    }\n\n    while (q_used < Q) bq({0}, {1});\n\n    for (int i = 0; i < N; i++) cout << asgn[i] << \" \\n\"[i==N-1];\n    cout.flush();\n    return 0;\n}","ahc026":"#include <bits/stdc++.h>\nusing namespace std;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    \n    int n, m;\n    cin >> n >> m;\n    \n    vector<vector<int>> stacks(m);\n    vector<int> stk(n + 1), pidx(n + 1);\n    \n    int h = n / m;\n    for (int i = 0; i < m; i++) {\n        stacks[i].resize(h);\n        for (int j = 0; j < h; j++) {\n            cin >> stacks[i][j];\n            stk[stacks[i][j]] = i;\n            pidx[stacks[i][j]] = j;\n        }\n    }\n    \n    vector<pair<int,int>> ops;\n    \n    for (int v = 1; v <= n; v++) {\n        int s = stk[v];\n        int j = pidx[v];\n        \n        while ((int)stacks[s].size() > j + 1) {\n            int top_pos = (int)stacks[s].size() - 1;\n            int run_start = top_pos;\n            while (run_start > j + 1 && stacks[s][run_start - 1] > stacks[s][run_start])\n                run_start--;\n            \n            int u1 = stacks[s][run_start];\n            int best_t = -1, best_score = INT_MIN;\n            \n            for (int t = 0; t < m; t++) {\n                if (t == s) continue;\n                int score;\n                if (stacks[t].empty()) score = n;\n                else {\n                    int top_t = stacks[t].back();\n                    score = (top_t > u1) ? 2*n+1-top_t : top_t-n-1;\n                }\n                if (score > best_score) { best_score = score; best_t = t; }\n            }\n            \n            int move_box = stacks[s][run_start];\n            int new_base = (int)stacks[best_t].size();\n            int old_size_s = (int)stacks[s].size();\n            \n            ops.push_back({move_box, best_t + 1});\n            for (int p = run_start; p < old_size_s; p++) {\n                int b = stacks[s][p];\n                stacks[best_t].push_back(b);\n                stk[b] = best_t;\n                pidx[b] = new_base + (p - run_start);\n            }\n            stacks[s].resize(run_start);\n        }\n        \n        ops.push_back({v, 0});\n        stacks[s].pop_back();\n    }\n    \n    for (auto& [v, i] : ops)\n        cout << v << \" \" << i << \"\\n\";\n    \n    return 0;\n}","ahc027":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=41,MAXC=1601,BUD=100000;\nint N,n;\nbool hw[MAXN][MAXN],vw[MAXN][MAXN];\nint dv[MAXN][MAXN];\nconst int DI[]={0,1,0,-1},DJ[]={1,0,-1,0};\nconst char DC[]=\"RDLU\";\nint C(int i,int j){return i*N+j;}\nint RI(int c){return c/N;}\nint RJ(int c){return c%N;}\nbool OK(int i,int j,int d){\n    int ni=i+DI[d],nj=j+DJ[d];\n    if(ni<0||ni>=N||nj<0||nj>=N)return false;\n    if(d==0)return !vw[i][j];\n    if(d==1)return !hw[i][j];\n    if(d==2)return !vw[i][nj];\n    return !hw[ni][j];\n}\nshort AP[MAXC][MAXC];\nint AF[MAXC][MAXC];\nvoid bfs(int s){\n    memset(AP[s],0xFF,n*sizeof(short));\n    int fs[MAXC];AP[s][s]=0;fs[s]=s;\n    static int q[MAXC];int h=0,tail=0;q[tail++]=s;\n    while(h<tail){\n        int u=q[h++];\n        for(int d=0;d<4;d++)if(OK(RI(u),RJ(u),d)){\n            int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);\n            if(AP[s][v]<0){AP[s][v]=AP[s][u]+1;fs[v]=(u==s)?v:fs[u];q[tail++]=v;}\n        }\n    }\n    for(int i=0;i<n;i++)AF[s][i]=(i==s)?s:fs[i];\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N;n=N*N;\n    for(int i=0;i<N-1;i++){string s;cin>>s;for(int j=0;j<N;j++)hw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N-1;j++)vw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>dv[i][j];\n    for(int s=0;s<n;s++)bfs(s);\n    short D_home[MAXC];\n    for(int c=0;c<n;c++)D_home[c]=AP[c][0];\n    string route;route.reserve(BUD+10);\n    vector<int> lv(n,0);int pos=0,t=0;\n    {\n        vector<bool> vis(n,false);vis[0]=true;\n        vector<pair<int,int>> stk;stk.reserve(n);stk.push_back({0,0});\n        while(!stk.empty()){\n            int u=stk.back().first;int& nd=stk.back().second;bool found=false;\n            while(nd<4){\n                int d=nd++;\n                if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);\n                    if(!vis[v]){route+=DC[d];t++;pos=v;lv[v]=t;vis[v]=true;stk.push_back({v,0});found=true;break;}}\n            }\n            if(!found){stk.pop_back();\n                if(!stk.empty()){int par=stk.back().first;\n                    for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==par){route+=DC[d];t++;pos=par;lv[par]=t;break;}}}\n        }\n    }\n    for(int c=0;c<n;c++)lv[c]=t;\n    float sqd[MAXC];\n    for(int c=0;c<n;c++)sqd[c]=sqrtf((float)dv[RI(c)][RJ(c)]);\n    while(t+(int)D_home[pos]+2<=BUD){\n        int best=-1;float bu=0.0f;\n        const short* Ap=AP[pos];\n        for(int c=0;c<n;c++){\n            if(c==pos)continue;\n            if(t+(int)Ap[c]+(int)D_home[c]+2>BUD)continue;\n            float u=sqd[c]*(float)(t-lv[c]+1);\n            if(u>bu){bu=u;best=c;}\n        }\n        if(best<0)break;\n        int nx=AF[pos][best];\n        for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;lv[pos]=t;break;}\n    }\n    while(pos!=0){\n        int nx=AF[pos][0];\n        for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;break;}\n    }\n    cout<<route<<\"\\n\";\n}","ahc028":"#include <bits/stdc++.h>\nusing namespace std;\nint N, M, si, sj;\nvector<string> targets;\nvector<pair<int,int>> charPos[26];\nint ovM[200][200];\nvoid computeOvMatrix() {\n    for(int i=0;i<M;i++) for(int j=0;j<M;j++) {\n        if(i==j){ovM[i][j]=0;continue;}\n        ovM[i][j]=0;\n        for(int k=4;k>=1;k--){bool ok=true;for(int l=0;l<k&&ok;l++)if(targets[i][5-k+l]!=targets[j][l])ok=false;if(ok){ovM[i][j]=k;break;}}\n    }\n}\nvector<int> greedyPerm(int start){\n    vector<bool> used(M,false);vector<int> perm;perm.reserve(M);perm.push_back(start);used[start]=true;\n    while((int)perm.size()<M){int last=perm.back(),best=-1,bov=-1;for(int j=0;j<M;j++)if(!used[j]&&ovM[last][j]>bov){bov=ovM[last][j];best=j;}perm.push_back(best);used[best]=true;}\n    return perm;\n}\nint permOv(const vector<int>&p){int s=0;for(int i=1;i<(int)p.size();i++)s+=ovM[p[i-1]][p[i]];return s;}\nint swapGain(const vector<int>&perm,int i,int j){\n    int m=perm.size(),a=perm[i],b=perm[j],og=0,ng=0;\n    if(i>0){og+=ovM[perm[i-1]][a];ng+=ovM[perm[i-1]][b];}\n    if(j<m-1){og+=ovM[b][perm[j+1]];ng+=ovM[a][perm[j+1]];}\n    if(j==i+1){og+=ovM[a][b];ng+=ovM[b][a];}\n    else{if(i<m-1){og+=ovM[a][perm[i+1]];ng+=ovM[b][perm[i+1]];}if(j>0){og+=ovM[perm[j-1]][b];ng+=ovM[perm[j-1]][a];}}\n    return ng-og;\n}\nbool swapOpt(vector<int>&perm){int m=perm.size(),bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=swapGain(perm,i,j);if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;swap(perm[bi],perm[bj]);return true;}\nbool orOpt(vector<int>&perm){\n    int m=perm.size(),bg=0,bk=-1,bp=-1;\n    for(int k=0;k<m;k++){int e=perm[k];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=k)rest.push_back(perm[i]);\n        int lo=(k>0)?ovM[perm[k-1]][e]:0,ro=(k<m-1)?ovM[e][perm[k+1]]:0,bov=(k>0&&k<m-1)?ovM[perm[k-1]][perm[k+1]]:0,rc=lo+ro-bov;\n        for(int p=0;p<=(int)rest.size();p++){int nl=(p>0)?ovM[rest[p-1]][e]:0,nr=(p<(int)rest.size())?ovM[e][rest[p]]:0,nb=(p>0&&p<(int)rest.size())?ovM[rest[p-1]][rest[p]]:0,g=nl+nr-nb-rc;if(g>bg){bg=g;bk=k;bp=p;}}}\n    if(bk==-1)return false;\n    int e=perm[bk];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=bk)rest.push_back(perm[i]);rest.insert(rest.begin()+bp,e);perm=rest;return true;\n}\nbool reverseOpt(vector<int>&perm){\n    int m=perm.size();if(m<2)return false;\n    vector<int> diff(m-1),pref(m,0);\n    for(int k=0;k<m-1;k++)diff[k]=ovM[perm[k+1]][perm[k]]-ovM[perm[k]][perm[k+1]];\n    for(int k=0;k<m-1;k++)pref[k+1]=pref[k]+diff[k];\n    int bg=0,bi=-1,bj=-1;\n    for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=pref[j]-pref[i];if(i>0)g+=ovM[perm[i-1]][perm[j]]-ovM[perm[i-1]][perm[i]];if(j<m-1)g+=ovM[perm[i]][perm[j+1]]-ovM[perm[j]][perm[j+1]];if(g>bg){bg=g;bi=i;bj=j;}}\n    if(bi==-1)return false;reverse(perm.begin()+bi,perm.begin()+bj+1);return true;\n}\nvoid localSearch(vector<int>&perm){bool imp=true;while(imp){imp=false;if(swapOpt(perm))imp=true;if(orOpt(perm))imp=true;if(reverseOpt(perm))imp=true;}}\nstring buildString(const vector<int>&perm){string s=targets[perm[0]];for(int i=1;i<(int)perm.size();i++)s+=targets[perm[i]].substr(ovM[perm[i-1]][perm[i]]);return s;}\nvector<pair<int,int>> findPath(const string&s){\n    int L=s.size(),G=N*N;const int INF=1e9;\n    vector<int> dp((L+1)*G,INF),prv((L+1)*G,-1);\n    dp[si*N+sj]=0;\n    for(int i=0;i<L;i++){int c=s[i]-'A',base=i*G,nb=(i+1)*G;\n        for(int p=0;p<G;p++){int val=dp[base+p];if(val==INF)continue;int r=p/N,cc=p%N;\n            for(auto&[nr,nc]:charPos[c]){int np=nr*N+nc,cost=val+abs(r-nr)+abs(cc-nc)+1;if(cost<dp[nb+np]){dp[nb+np]=cost;prv[nb+np]=p;}}}}\n    int bc=INF,bp=-1,lb=L*G;for(int p=0;p<G;p++)if(dp[lb+p]<bc){bc=dp[lb+p];bp=p;}\n    vector<pair<int,int>> path(L);int pos=bp;\n    for(int i=L;i>=1;i--){path[i-1]={pos/N,pos%N};pos=prv[i*G+pos];}\n    return path;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    auto t0=chrono::steady_clock::now();\n    auto ms_el=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    cin>>N>>M>>si>>sj;\n    for(int i=0;i<N;i++){string row;cin>>row;for(int j=0;j<N;j++)charPos[row[j]-'A'].push_back({i,j});}\n    targets.resize(M);for(int i=0;i<M;i++)cin>>targets[i];\n    computeOvMatrix();\n    vector<int> best;int bestOv=-1;\n    for(int s=0;s<M;s++){auto p=greedyPerm(s);int o=permOv(p);if(o>bestOv){bestOv=o;best=p;}}\n    localSearch(best);bestOv=permOv(best);\n    {\n        mt19937 rng(42);uniform_real_distribution<double> ud(0.0,1.0);\n        vector<int> cur=best;int curOv=bestOv;double T=2.0;\n        for(long long it=0;;it++){\n            if(it%50000==0&&ms_el()>=1700)break;\n            T=max(0.05,T*0.9999998);\n            int i=rng()%M,j=rng()%M;if(i==j)continue;if(i>j)swap(i,j);\n            int gain=swapGain(cur,i,j);\n            if(gain>0||ud(rng)<exp((double)gain/T)){swap(cur[i],cur[j]);curOv+=gain;if(curOv>bestOv){bestOv=curOv;best=cur;}}\n        }\n    }\n    if(ms_el()<1850)localSearch(best);\n    string ss=buildString(best);\n    auto path=findPath(ss);\n    for(auto&[r,c]:path)cout<<r<<\" \"<<c<<\"\\n\";\n    return 0;\n}","ahc030":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,MAX_OPS;double eps,coef;int ops=0;\nstruct Field{int d,hi,hj;vector<pair<int,int>>cells;vector<int>rp,cp;vector<pair<int,int>>pos;};\nvector<Field>F;vector<vector<int>>drld;vector<vector<double>>prob,ell;\nvector<double>robs,cobs;int nrr=0,nrc=0;\ndouble qdiv(const vector<pair<int,int>>&c){ops++;cout<<\"q \"<<c.size();for(auto[i,j]:c)cout<<' '<<i<<' '<<j;cout<<'\\n';cout.flush();int v;cin>>v;return v;}\nint qdrl(int i,int j){ops++;cout<<\"q 1 \"<<i<<' '<<j<<'\\n';cout.flush();int v;cin>>v;drld[i][j]=v;return v;}\nbool qans(const vector<pair<int,int>>&o){ops++;cout<<\"a \"<<o.size();for(auto[i,j]:o)cout<<' '<<i<<' '<<j;cout<<'\\n';cout.flush();int r;cin>>r;return r==1;}\nvoid do_row_col(int reps){for(int rep=0;rep<reps;rep++){for(int i=0;i<N;i++){vector<pair<int,int>>c;for(int j=0;j<N;j++)c.push_back({i,j});robs[i]+=qdiv(c);}nrr++;for(int j=0;j<N;j++){vector<pair<int,int>>c;for(int i=0;i<N;i++)c.push_back({i,j});cobs[j]+=qdiv(c);}nrc++;}}\nvoid run_mf(int nit){\n  if(!nrr&&!nrc)return;\n  double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n  vector<double>tmr(N,0),tmc(N,0);\n  for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)tmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)tmc[dj+c]+=pp*F[k].cp[c];}}\n  for(int it=0;it<nit;it++)for(int k=0;k<M;k++){\n    int np=(int)F[k].pos.size();\n    vector<double>kmr(N,0),kmc(N,0);\n    for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)kmc[dj+c]+=pp*F[k].cp[c];}\n    for(int i=0;i<N;i++)tmr[i]-=kmr[i];for(int j=0;j<N;j++)tmc[j]-=kmc[j];\n    vector<vector<double>>drow(N,vector<double>(F[k].hi+1)),dcol(N,vector<double>(F[k].hj+1));\n    for(int i=0;i<N;i++){double be=nrr*(N*eps+tmr[i]*coef),bd=robs[i]-be;for(int r=0;r<=F[k].hi;r++){double e=nrr*(N*eps+(F[k].rp[r]+tmr[i])*coef),d=robs[i]-e;drow[i][r]=(-d*d+bd*bd)/(2*vr);}}\n    for(int j=0;j<N;j++){double be=nrc*(N*eps+tmc[j]*coef),bd=cobs[j]-be;for(int c=0;c<=F[k].hj;c++){double e=nrc*(N*eps+(F[k].cp[c]+tmc[j])*coef),d=cobs[j]-e;dcol[j][c]=(-d*d+bd*bd)/(2*vc);}}\n    vector<double>ll(np,-1e300);double mx=-1e300;\n    for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];double lp=ell[k][p];for(int r=0;r<=F[k].hi;r++)lp+=drow[di+r][r];for(int c=0;c<=F[k].hj;c++)lp+=dcol[dj+c][c];ll[p]=lp;mx=max(mx,lp);}\n    double s=0;for(int p=0;p<np;p++){prob[k][p]=(ll[p]>-1e250)?exp(ll[p]-mx):0.0;s+=prob[k][p];}\n    if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;\n    fill(kmr.begin(),kmr.end(),0);fill(kmc.begin(),kmc.end(),0);\n    for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)kmc[dj+c]+=pp*F[k].cp[c];}\n    for(int i=0;i<N;i++)tmr[i]+=kmr[i];for(int j=0;j<N;j++)tmc[j]+=kmc[j];\n  }\n}\nvoid apply_constraints(){\n  for(int k=0;k<M;k++){int np=(int)F[k].pos.size();bool ch=false;\n    for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells){if(drld[di+ci][dj+cj]==0){ell[k][p]=-1e30;prob[k][p]=0;ch=true;break;}}}\n    if(ch){double s=0;for(double pp:prob[k])s+=pp;\n      if(s>1e-15){for(auto&pp:prob[k])pp/=s;}\n      else{int cnt=0;for(int p=0;p<np;p++)if(ell[k][p]>-1e29)cnt++;\n        for(int p=0;p<np;p++)prob[k][p]=(ell[k][p]>-1e29&&cnt>0)?1.0/cnt:0;\n        if(cnt==0){fill(ell[k].begin(),ell[k].end(),0);fill(prob[k].begin(),prob[k].end(),1.0/np);}}}\n  }\n}\ndouble field_entropy(int k){double H=0;for(double p:prob[k])if(p>1e-12)H-=p*log(p);return H;}\nvoid do_shape_query(int k){\n  if(ops>=MAX_OPS-5)return;int np=(int)F[k].pos.size();\n  int p1=-1,p2=-1;for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;if(p1<0||prob[k][p]>prob[k][p1]){p2=p1;p1=p;}else if(p2<0||prob[k][p]>prob[k][p2])p2=p;}\n  if(p1<0||prob[k][p1]>0.98)return;\n  auto[di1,dj1]=F[k].pos[p1];\n  vector<pair<int,int>>S;\n  if(p2>=0){auto[di2,dj2]=F[k].pos[p2];set<pair<int,int>>c2;for(auto[ci,cj]:F[k].cells)c2.insert({di2+ci,dj2+cj});for(auto[ci,cj]:F[k].cells){pair<int,int>c={di1+ci,dj1+cj};if(!c2.count(c))S.push_back(c);}if((int)S.size()<2){S.clear();for(auto[ci,cj]:F[k].cells)S.push_back({di1+ci,dj1+cj});}}\n  else{for(auto[ci,cj]:F[k].cells)S.push_back({di1+ci,dj1+cj});}\n  if((int)S.size()<2)return;\n  vector<bool>Smap(N*N,false);for(auto[i,j]:S)Smap[i*N+j]=true;\n  vector<int>ovl(np,0);for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells)if(Smap[(di+ci)*N+(dj+cj)])ovl[p]++;}\n  double omega=0;for(int m=0;m<M;m++){if(m==k)continue;for(int p=0;p<(int)F[m].pos.size();p++){double pp=prob[m][p];if(pp<1e-12)continue;auto[di,dj]=F[m].pos[p];for(auto[ci,cj]:F[m].cells)if(Smap[(di+ci)*N+(dj+cj)])omega+=pp;}}\n  double y=qdiv(S),sz=(double)S.size(),varq=max(1e-9,sz*eps*(1-eps));\n  double newmax=-1e300;\n  for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;double mu=sz*eps+((double)ovl[p]+omega)*coef,d=y-mu;ell[k][p]-=d*d/(2*varq);newmax=max(newmax,ell[k][p]);}\n  if(newmax>-1e29)for(int p=0;p<np;p++)if(ell[k][p]>-1e29)ell[k][p]-=newmax;\n}\nvector<vector<double>>get_oil_prob(){\n  vector<vector<double>>noc(N,vector<double>(N,1.0));\n  for(int k=0;k<M;k++){vector<vector<double>>cvk(N,vector<double>(N,0));for(int p=0;p<(int)F[k].pos.size();p++){double pp=prob[k][p];if(pp<1e-12)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells)cvk[di+ci][dj+cj]+=pp;}for(int i=0;i<N;i++)for(int j=0;j<N;j++)noc[i][j]*=max(0.0,1.0-cvk[i][j]);}\n  vector<vector<double>>op(N,vector<double>(N));for(int i=0;i<N;i++)for(int j=0;j<N;j++)op[i][j]=1.0-noc[i][j];return op;\n}\nvector<pair<int,int>>make_guess(const vector<vector<double>>&op,double thr=0.5){\n  vector<pair<int,int>>res;for(int i=0;i<N;i++)for(int j=0;j<N;j++){bool oil=(drld[i][j]>0)||(drld[i][j]<0&&op[i][j]>thr);if(oil)res.push_back({i,j});}return res;\n}\nint main(){\n  ios_base::sync_with_stdio(false);cin.tie(NULL);\n  cin>>N>>M>>eps;MAX_OPS=2*N*N;coef=1.0-2.0*eps;\n  drld.assign(N,vector<int>(N,-1));robs.assign(N,0.0);cobs.assign(N,0.0);\n  F.resize(M);\n  for(int k=0;k<M;k++){cin>>F[k].d;F[k].cells.resize(F[k].d);F[k].hi=F[k].hj=0;\n    for(int t=0;t<F[k].d;t++){cin>>F[k].cells[t].first>>F[k].cells[t].second;F[k].hi=max(F[k].hi,F[k].cells[t].first);F[k].hj=max(F[k].hj,F[k].cells[t].second);}\n    F[k].rp.assign(F[k].hi+1,0);F[k].cp.assign(F[k].hj+1,0);for(auto[ci,cj]:F[k].cells){F[k].rp[ci]++;F[k].cp[cj]++;}\n    for(int di=0;di+F[k].hi<N;di++)for(int dj=0;dj+F[k].hj<N;dj++)F[k].pos.push_back({di,dj});}\n  prob.resize(M);ell.resize(M);\n  for(int k=0;k<M;k++){int sz=(int)F[k].pos.size();prob[k].assign(sz,1.0/sz);ell[k].assign(sz,0.0);}\n  int n_reps=(eps>=0.15)?3:(eps>=0.08)?2:1;\n  do_row_col(n_reps);\n  run_mf(200);\n  {int qb=min(60,MAX_OPS-ops-20);\n   for(int q=0;q<qb&&ops<MAX_OPS-15;q++){\n     int bk=0;double be=field_entropy(0);for(int k=1;k<M;k++){double h=field_entropy(k);if(h>be){be=h;bk=k;}}\n     if(be<0.1)break;do_shape_query(bk);run_mf(15);}}\n  apply_constraints();run_mf(100);\n  while(ops<MAX_OPS-1){\n    auto op=get_oil_prob();auto g=make_guess(op);if(qans(g))return 0;\n    int bi=-1,bj=-1;double bunc=0;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(drld[i][j]>=0)continue;double pu=min(op[i][j],1.0-op[i][j]);if(pu>bunc){bunc=pu;bi=i;bj=j;}}\n    if(bunc<0.05||bi<0){for(int i=0;i<N&&ops<MAX_OPS-2;i++)for(int j=0;j<N&&ops<MAX_OPS-2;j++)if(drld[i][j]<0&&op[i][j]>0.05&&op[i][j]<0.95)qdrl(i,j);break;}\n    qdrl(bi,bj);apply_constraints();run_mf(20);}\n  {auto op=get_oil_prob();auto g=make_guess(op);if(ops<MAX_OPS)qans(g);}\n  return 0;\n}","ahc031":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef tuple<ll,int,int> T3;\nint W,D,N;\nvector<vector<int>> a;\nvector<int> compute_heights(const vector<int>& days){\n    vector<int> h(N,1);\n    auto ben=[&](int k,int cur)->ll{ll b=0;for(int d:days){int def=a[d][k]-cur*W;if(def>0)b+=min(W,def);}return b;};\n    priority_queue<T3> pq;\n    for(int k=0;k<N;k++){ll b=ben(k,1);if(b>0)pq.push({b,k,1});}\n    for(int rem=W-N;rem>0&&!pq.empty();){auto[b,k,c]=pq.top();pq.pop();if(b<=0)break;h[k]++;rem--;ll nb=ben(k,h[k]);if(nb>0)pq.push({nb,k,h[k]});}\n    sort(h.begin(),h.end());return h;}\nll area_cost(int d,const vector<int>& h){ll c=0;for(int k=0;k<N;k++){int def=a[d][k]-h[k]*W;if(def>0)c+=(ll)def*100;}return c;}\nset<int> get_bd(const vector<int>& arr){set<int> S;int y=0;for(int i=0;i<(int)arr.size()-1;i++){y+=arr[i];S.insert(y);}return S;}\nll bdist(const set<int>& A,const set<int>& B){ll c=0;for(int x:A)if(!B.count(x))c++;for(int x:B)if(!A.count(x))c++;return c*W;}\nvector<int> arrange_greedy(const vector<int>& h,const set<int>& targets){\n    vector<int> tgt(targets.begin(),targets.end());\n    multiset<int> av(h.begin(),h.end());\n    vector<int> arr;int S=0,j=0,nt=(int)tgt.size();\n    while(!av.empty()){while(j<nt&&S>=tgt[j])j++;if(j>=nt){for(int x:av)arr.push_back(x);break;}\n        int need=tgt[j]-S;auto it=av.find(need);\n        if(it!=av.end()){arr.push_back(need);S+=need;av.erase(it);j++;}\n        else{auto ub=av.upper_bound(need);if(ub!=av.begin()){--ub;arr.push_back(*ub);S+=*ub;av.erase(ub);while(j<nt&&S>=tgt[j])j++;}\n            else{it=av.begin();arr.push_back(*it);S+=*it;av.erase(it);while(j<nt&&S>=tgt[j])j++;}}}\n    return arr;}\nvoid out(const vector<vector<int>>& arrs){\n    for(int d=0;d<D;d++){const auto& arr=arrs[d];vector<int> y(N+1);y[0]=0;for(int i=0;i<N;i++)y[i+1]=y[i]+arr[i];\n        vector<pair<int,int>> s(N);for(int i=0;i<N;i++)s[i]={arr[i],y[i]};sort(s.begin(),s.end());\n        for(int k=0;k<N;k++)cout<<s[k].second<<\" 0 \"<<s[k].second+s[k].first<<\" \"<<W<<\"\\n\";}}\npair<ll,vector<vector<int>>> eval_seq(const vector<int>& seq,const vector<vector<int>>& C){\n    vector<vector<int>> arrs(D);ll cost=0;arrs[0]=C[seq[0]];cost+=area_cost(0,arrs[0]);set<int> cur=get_bd(arrs[0]);\n    for(int d=1;d<D;d++){if(seq[d]==seq[d-1]){arrs[d]=arrs[d-1];cost+=area_cost(d,C[seq[d]]);}\n        else{arrs[d]=arrange_greedy(C[seq[d]],cur);set<int> ns=get_bd(arrs[d]);cost+=area_cost(d,C[seq[d]])+bdist(cur,ns);cur=ns;}}\n    return{cost,arrs};}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>W>>D>>N;a.resize(D,vector<int>(N));\n    for(int d=0;d<D;d++)for(int k=0;k<N;k++)cin>>a[d][k];\n    vector<vector<int>> day_h(D);for(int d=0;d<D;d++)day_h[d]=compute_heights({d});\n    vector<int> aidx(D);iota(aidx.begin(),aidx.end(),0);vector<int> fh=compute_heights(aidx);\n    int NC=D+1;vector<vector<int>> C(NC);C[0]=fh;for(int d=0;d<D;d++)C[d+1]=day_h[d];\n    vector<set<int>> SS(NC);for(int L=0;L<NC;L++)SS[L]=get_bd(C[L]);\n    vector<vector<ll>> ar(D,vector<ll>(NC));for(int d=0;d<D;d++)for(int L=0;L<NC;L++)ar[d][L]=area_cost(d,C[L]);\n    vector<vector<ll>> pcg(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++){if(L1==L2)continue;auto ag=arrange_greedy(C[L2],SS[L1]);pcg[L1][L2]=bdist(SS[L1],get_bd(ag));}\n    const ll INF=2e18;\n    vector<vector<ll>> dp(D,vector<ll>(NC,INF));vector<vector<int>> from(D,vector<int>(NC,-1));\n    for(int L=0;L<NC;L++)dp[0][L]=ar[0][L];\n    for(int d=1;d<D;d++)for(int L=0;L<NC;L++)for(int pL=0;pL<NC;pL++){if(dp[d-1][pL]==INF)continue;ll c=dp[d-1][pL]+pcg[pL][L]+ar[d][L];if(c<dp[d][L]){dp[d][L]=c;from[d][L]=pL;}}\n    int bL=(int)(min_element(dp[D-1].begin(),dp[D-1].end())-dp[D-1].begin());\n    vector<int> seq(D);seq[D-1]=bL;for(int d=D-2;d>=0;d--)seq[d]=from[d+1][seq[d+1]];\n    auto[dp_cost,dp_arrs]=eval_seq(seq,C);\n    ll g_cost=INF;vector<vector<int>> g_arrs;\n    {vector<vector<int>> arrs(D);ll cost=0;int cL=1;arrs[0]=C[cL];cost+=ar[0][cL];set<int> cs=get_bd(arrs[0]);\n        for(int d=1;d<D;d++){ll bc=INF;int bL2=cL;vector<int> barr=arrs[d-1];set<int> bS=cs;\n            for(int L=0;L<NC;L++){ll c;vector<int> ag;set<int> Sg;\n                if(L==cL){c=ar[d][L];ag=arrs[d-1];Sg=cs;}\n                else{ag=arrange_greedy(C[L],cs);Sg=get_bd(ag);c=ar[d][L]+bdist(cs,Sg);}\n                if(c<bc){bc=c;bL2=L;barr=ag;bS=Sg;}}\n            arrs[d]=barr;cost+=bc;cL=bL2;cs=bS;}\n        g_cost=cost;g_arrs=arrs;}\n    if(g_cost<dp_cost)out(g_arrs);else out(dp_arrs);\n    return 0;}","ahc032":"#include <bits/stdc++.h>\nusing namespace std;\nusing namespace chrono;\nconstexpr long long MOD = 998244353;\nlong long sv[20][3][3];\nlong long b[9][9];\nlong long cur_score;\nint N, M, K;\nvoid apply_stamp(int m, int p, int q) {\n    for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {\n        long long ov = b[p+i][q+j];\n        long long nv = (ov + sv[m][i][j]) % MOD;\n        cur_score += nv - ov; b[p+i][q+j] = nv;\n    }\n}\nvoid undo_stamp(int m, int p, int q) {\n    for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {\n        long long ov = b[p+i][q+j];\n        long long nv = (ov - sv[m][i][j] + MOD) % MOD;\n        cur_score += nv - ov; b[p+i][q+j] = nv;\n    }\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    cin >> N >> M >> K;\n    cur_score = 0;\n    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) { cin >> b[i][j]; b[i][j] %= MOD; cur_score += b[i][j]; }\n    for (int m = 0; m < M; m++) for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) cin >> sv[m][i][j];\n    struct Op { int m, p, q; };\n    vector<Op> ops; ops.reserve(K);\n    for (int iter = 0; iter < K; iter++) {\n        long long best_gain = 0; int bm=-1,bp=-1,bq=-1;\n        for (int m = 0; m < M; m++) for (int p = 0; p <= N-3; p++) for (int q = 0; q <= N-3; q++) {\n            long long gain = 0;\n            for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) gain += (b[p+i][q+j]+sv[m][i][j])%MOD - b[p+i][q+j];\n            if (gain > best_gain) { best_gain=gain; bm=m; bp=p; bq=q; }\n        }\n        if (bm == -1) break;\n        apply_stamp(bm,bp,bq); ops.push_back({bm,bp,bq});\n    }\n    long long best_score = cur_score; vector<Op> best_ops = ops;\n    mt19937 rng(42); auto t_start = steady_clock::now();\n    const long long TL = 1850000; double T = 1e7;\n    for (long long si = 0; ; si++) {\n        if (si % 10000 == 0) {\n            long long el = duration_cast<microseconds>(steady_clock::now()-t_start).count();\n            if (el >= TL) break;\n            T = 1e7 * pow(1e-7, (double)el/TL);\n        }\n        int L = (int)ops.size();\n        int mtype = (L==0)?0:(L==K)?(1+(int)(rng()&1)):(int)(rng()%3);\n        Op old_op{0,0,0}, new_op{0,0,0}; int old_idx=-1;\n        if (mtype==0) new_op={( int)(rng()%M),(int)(rng()%(N-2)),(int)(rng()%(N-2))};\n        else if (mtype==1) { old_idx=(int)(rng()%L); old_op=ops[old_idx]; }\n        else { old_idx=(int)(rng()%L); old_op=ops[old_idx]; new_op={(int)(rng()%M),(int)(rng()%(N-2)),(int)(rng()%(N-2))}; }\n        long long s0 = cur_score;\n        if (mtype==0) apply_stamp(new_op.m,new_op.p,new_op.q);\n        else if (mtype==1) undo_stamp(old_op.m,old_op.p,old_op.q);\n        else { undo_stamp(old_op.m,old_op.p,old_op.q); apply_stamp(new_op.m,new_op.p,new_op.q); }\n        long long delta = cur_score - s0;\n        bool accept = (delta>=0) || (((double)(rng()%1000000)) < exp((double)delta/T)*1000000.0);\n        if (accept) {\n            if (mtype==0) ops.push_back(new_op);\n            else if (mtype==1) { ops[old_idx]=ops.back(); ops.pop_back(); }\n            else ops[old_idx]=new_op;\n            if (cur_score > best_score) { best_score=cur_score; best_ops=ops; }\n        } else {\n            if (mtype==0) undo_stamp(new_op.m,new_op.p,new_op.q);\n            else if (mtype==1) apply_stamp(old_op.m,old_op.p,old_op.q);\n            else { undo_stamp(new_op.m,new_op.p,new_op.q); apply_stamp(old_op.m,old_op.p,old_op.q); }\n        }\n    }\n    cout << best_ops.size() << \"\\n\";\n    for (auto& op : best_ops) cout << op.m << \" \" << op.p << \" \" << op.q << \"\\n\";\n    return 0;\n}","ahc033":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int N = 5;\nint A[N][N];\nint posR[N*N], posP[N*N];\nint grid[N][N];\nint craneR, craneC;\nbool craneHolding;\nint craneContainer;\nint recvSent[N];\nint recvPickedUp[N];\nint dispatchCount[N];\nmap<int,pair<int,int>> bufPos;\nset<pair<int,int>> usedBufs;\nbool done_[N*N];\nstring result;\n\nvoid sRecv(){\n    for(int r=0;r<N;r++){\n        bool blocked=craneHolding&&craneR==r&&craneC==0;\n        if(!blocked&&grid[r][0]==-1&&recvSent[r]<N)\n            grid[r][0]=A[r][recvSent[r]++];\n    }\n}\nvoid sDisp(){\n    for(int r=0;r<N;r++){\n        if(grid[r][N-1]!=-1){\n            dispatchCount[r]++;\n            grid[r][N-1]=-1;\n        }\n    }\n}\nvoid act(char c){\n    result+=c;\n    switch(c){\n        case 'P': craneContainer=grid[craneR][craneC]; grid[craneR][craneC]=-1; craneHolding=true; break;\n        case 'Q': grid[craneR][craneC]=craneContainer; craneHolding=false; craneContainer=-1; break;\n        case 'U': craneR--; break;\n        case 'D': craneR++; break;\n        case 'L': craneC--; break;\n        case 'R': craneC++; break;\n        default: break;\n    }\n}\nvoid turn_(char c){sRecv();act(c);sDisp();}\nvoid goto_(int tr,int tc){\n    while(craneR!=tr||craneC!=tc){\n        if(craneR<tr) turn_('D');\n        else if(craneR>tr) turn_('U');\n        else if(craneC<tc) turn_('R');\n        else turn_('L');\n    }\n}\nvoid pickup_(int r,int c,bool isGate){\n    while(grid[r][c]==-1){\n        if(isGate&&recvSent[r]<N){turn_('P');return;}\n        turn_('.');\n    }\n    turn_('P');\n}\npair<int,int> freeBuf(){\n    for(int c=1;c<N-1;c++)\n        for(int r=0;r<N;r++){\n            auto p=make_pair(r,c);\n            if(!usedBufs.count(p)&&grid[r][c]==-1) return p;\n        }\n    for(int r=0;r<N;r++)\n        if(recvSent[r]==N){\n            auto p=make_pair(r,0);\n            if(!usedBufs.count(p)&&grid[r][0]==-1) return p;\n        }\n    return {-1,-1};\n}\nint nNext(int gate){\n    return dispatchCount[gate]<N ? N*gate+dispatchCount[gate] : -1;\n}\nvoid deliver_(int srcR,int srcC,bool isBuf,bool isGate,int d){\n    goto_(srcR,srcC);\n    pickup_(srcR,srcC,isGate);\n    int cont=craneContainer;\n    if(isBuf){usedBufs.erase({srcR,srcC});bufPos.erase(cont);}\n    else if(isGate) recvPickedUp[srcR]++;\n    done_[cont]=true;\n    goto_(d,N-1);\n    turn_('Q');\n}\nvoid bufferGate_(int r,int dstR,int dstC){\n    goto_(r,0);\n    pickup_(r,0,true);\n    int cont=craneContainer;\n    recvPickedUp[r]++;\n    usedBufs.insert({dstR,dstC});\n    bufPos[cont]={dstR,dstC};\n    goto_(dstR,dstC);\n    turn_('Q');\n}\nvoid clearBlocker_(int r){\n    int bl=A[r][recvPickedUp[r]];\n    int gbl=bl/N;\n    if(nNext(gbl)==bl){\n        deliver_(r,0,false,true,gbl);\n    } else {\n        auto [br,bc]=freeBuf();\n        if(br!=-1) bufferGate_(r,br,bc);\n        else deliver_(r,0,false,true,gbl);\n    }\n}\nvoid solve(){\n    for(int r=0;r<N;r++) for(int c=0;c<N;c++) grid[r][c]=-1;\n    craneR=craneC=0; craneHolding=false; craneContainer=-1;\n    fill(recvSent,recvSent+N,0);\n    fill(recvPickedUp,recvPickedUp+N,0);\n    fill(dispatchCount,dispatchCount+N,0);\n    fill(done_,done_+N*N,false);\n    bufPos.clear(); usedBufs.clear(); result.clear();\n    for(int r=0;r<N;r++) for(int p=0;p<N;p++){posR[A[r][p]]=r;posP[A[r][p]]=p;}\n\n    for(int iter=0;iter<5000;iter++){\n        bool allDone=true;\n        for(int i=0;i<N;i++) if(dispatchCount[i]<N){allDone=false;break;}\n        if(allDone) break;\n\n        int bestK=-1,bestDist=INT_MAX;\n        int bestSrcR=-1,bestSrcC=-1; bool bestIsBuf=false;\n\n        for(int gate=0;gate<N;gate++){\n            int k=nNext(gate);\n            if(k<0||done_[k]) continue;\n            int srcR,srcC; bool isBuf;\n            if(bufPos.count(k)){\n                auto& bp=bufPos[k];\n                srcR=bp.first; srcC=bp.second; isBuf=true;\n            } else {\n                int r=posR[k],p=posP[k];\n                if(recvPickedUp[r]!=p) continue;\n                srcR=r; srcC=0; isBuf=false;\n            }\n            int d=abs(craneR-srcR)+abs(craneC-srcC);\n            if(d<bestDist){bestDist=d;bestK=k;bestSrcR=srcR;bestSrcC=srcC;bestIsBuf=isBuf;}\n        }\n\n        if(bestK>=0){\n            bool isGate=!bestIsBuf;\n            deliver_(bestSrcR,bestSrcC,bestIsBuf,isGate,bestK/N);\n        } else {\n            bool cleared=false;\n            for(int gate=0;gate<N&&!cleared;gate++){\n                int k=nNext(gate);\n                if(k<0||done_[k]) continue;\n                if(bufPos.count(k)) continue;\n                int r=posR[k],p=posP[k];\n                if(recvPickedUp[r]==p) continue;\n                clearBlocker_(r);\n                cleared=true;\n            }\n        }\n    }\n}\n\nint main(){\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n    int n; cin>>n;\n    for(int r=0;r<N;r++) for(int p=0;p<N;p++) cin>>A[r][p];\n    solve();\n    cout<<result<<\"\\n\";\n    for(int i=1;i<N;i++) cout<<\"B\\n\";\n    return 0;\n}","ahc034":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N;\nint h[20][20];\nint curR, curC, curLoad;\nvector<string> ops;\n\nvoid doLoad(int d) {\n    if (d <= 0) return;\n    ops.push_back(\"+\" + to_string(d));\n    h[curR][curC] -= d; curLoad += d;\n}\n\nvoid doUnload(int d) {\n    d = min(d, curLoad);\n    if (d <= 0) return;\n    ops.push_back(\"-\" + to_string(d));\n    h[curR][curC] += d; curLoad -= d;\n}\n\nvoid doStep(char dir, int dr, int dc) {\n    curR += dr; curC += dc;\n    ops.push_back(string(1, dir));\n    if (h[curR][curC] > 0) doLoad(h[curR][curC]);\n    else if (h[curR][curC] < 0 && curLoad > 0) doUnload(min(curLoad, -h[curR][curC]));\n}\n\nvoid moveRowFirst(int tr, int tc) {\n    while (curR < tr) doStep('D', 1, 0); while (curR > tr) doStep('U', -1, 0);\n    while (curC < tc) doStep('R', 0, 1); while (curC > tc) doStep('L', 0, -1);\n}\n\nvoid moveColFirst(int tr, int tc) {\n    while (curC < tc) doStep('R', 0, 1); while (curC > tc) doStep('L', 0, -1);\n    while (curR < tr) doStep('D', 1, 0); while (curR > tr) doStep('U', -1, 0);\n}\n\nvoid moveTo(int tr, int tc) {\n    if (curR == tr || curC == tc) { moveRowFirst(tr, tc); return; }\n    int drSign = (curR < tr) ? 1 : -1, dcSign = (curC < tc) ? 1 : -1;\n    int bA = 0, bB = 0;\n    for (int r = curR + drSign; r != tr + drSign; r += drSign) bA += abs(h[r][curC]);\n    for (int c = curC + dcSign; c != tc + dcSign; c += dcSign) bA += abs(h[tr][c]);\n    for (int c = curC + dcSign; c != tc + dcSign; c += dcSign) bB += abs(h[curR][c]);\n    for (int r = curR + drSign; r != tr + drSign; r += drSign) bB += abs(h[r][tc]);\n    if (bB > bA) moveColFirst(tr, tc); else moveRowFirst(tr, tc);\n}\n\nbool allZero() {\n    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) if (h[i][j] != 0) return false;\n    return true;\n}\n\nint main() {\n    ios::sync_with_stdio(false); cin.tie(0);\n    cin >> N;\n    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) cin >> h[i][j];\n    curR = curC = curLoad = 0;\n    if (h[0][0] > 0) doLoad(h[0][0]);\n    while (!allZero() && (int)ops.size() < 95000) {\n        auto dist = [&](int i, int j) { return abs(i-curR)+abs(j-curC); };\n        if (curLoad > 0) {\n            int best = INT_MAX, bi = -1, bj = -1;\n            for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)\n                if (h[i][j] < 0) { int d = dist(i,j); if (d < best) { best=d; bi=i; bj=j; } }\n            if (bi < 0) break;\n            moveTo(bi, bj);\n            if (h[bi][bj] < 0 && curLoad > 0) doUnload(min(curLoad, -h[bi][bj]));\n        } else {\n            int best = INT_MAX, bi = -1, bj = -1;\n            for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)\n                if (h[i][j] > 0) { int d = dist(i,j); if (d < best) { best=d; bi=i; bj=j; } }\n            if (bi < 0) break;\n            moveTo(bi, bj);\n            if (h[bi][bj] > 0) doLoad(h[bi][bj]);\n        }\n    }\n    for (const auto& op : ops) cout << op << \"\\n\";\n    return 0;\n}","ahc035":"#include <bits/stdc++.h>\nusing namespace std;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    int N, M, T;\n    cin >> N >> M >> T;\n    const int SC = 2*N*(N-1), nn = N*N;\n    vector<vector<int>> X(SC, vector<int>(M));\n    for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    mt19937 rng(42);\n    for(int t=0;t<T;t++){\n        auto ts = chrono::steady_clock::now();\n        vector<int> vals(SC,0);\n        for(int k=0;k<SC;k++) for(int l=0;l<M;l++) vals[k]+=X[k][l];\n        vector<bool> in_sel(SC,false);\n        vector<int> sel;\n        for(int l=0;l<M;l++){\n            int bk=0;\n            for(int k=1;k<SC;k++) if(X[k][l]>X[bk][l]) bk=k;\n            if(!in_sel[bk]){in_sel[bk]=true;sel.push_back(bk);}\n        }\n        vector<int> ord(SC); iota(ord.begin(),ord.end(),0);\n        sort(ord.begin(),ord.end(),[&](int a,int b){return vals[a]>vals[b];});\n        for(int k:ord){\n            if((int)sel.size()>=nn) break;\n            if(!in_sel[k]){in_sel[k]=true;sel.push_back(k);}\n        }\n        vector<vector<int>> pst(nn,vector<int>(nn));\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++){\n            int s=0; for(int l=0;l<M;l++) s+=max(X[sel[i]][l],X[sel[j]][l]);\n            pst[i][j]=s;\n        }\n        vector<int> grid(nn); iota(grid.begin(),grid.end(),0);\n        shuffle(grid.begin(),grid.end(),rng);\n        auto contrib=[&](int p)->int{\n            int r=p/N,c=p%N,v=0;\n            if(r>0) v+=pst[grid[p]][grid[(r-1)*N+c]];\n            if(r<N-1) v+=pst[grid[p]][grid[(r+1)*N+c]];\n            if(c>0) v+=pst[grid[p]][grid[r*N+c-1]];\n            if(c<N-1) v+=pst[grid[p]][grid[r*N+c+1]];\n            return v;\n        };\n        int cur=0;\n        for(int p=0;p<nn;p++){int r=p/N,c=p%N;\n            if(c<N-1) cur+=pst[grid[p]][grid[r*N+c+1]];\n            if(r<N-1) cur+=pst[grid[p]][grid[(r+1)*N+c]];\n        }\n        int best=cur; vector<int> bg=grid;\n        double temp=1000.0; const double TL=0.18;\n        for(int it=0;;it++){\n            if((it&0x7FF)==0){\n                double e=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n                if(e>=TL) break;\n                temp=1000.0*pow(1e-4,e/TL);\n            }\n            int p1=rng()%nn,p2=rng()%nn;\n            if(p1==p2) continue;\n            int bef=contrib(p1)+contrib(p2);\n            swap(grid[p1],grid[p2]);\n            int aft=contrib(p1)+contrib(p2);\n            int d=aft-bef;\n            if(d>=0||(rng()%1000000)<(int)(1e6*exp((double)d/temp))){\n                cur+=d; if(cur>best){best=cur;bg=grid;}\n            } else swap(grid[p1],grid[p2]);\n        }\n        for(int i=0;i<N;i++){\n            for(int j=0;j<N;j++){if(j) cout<<' '; cout<<sel[bg[i*N+j]];}\n            cout<<'\\n';\n        }\n        cout.flush();\n        for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    }\n    return 0;\n}","ahc038":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,V;\nconst int DR[]={0,1,0,-1},DC[]={1,0,-1,0};\nint rx,ry,fd;\nvector<string> ops;\nbool nav(int tr,int tc,int td){\n    while(rx!=tr||ry!=tc||fd!=td){\n        if((int)ops.size()>=99990)return false;\n        char mv='.',rot='.';\n        if(rx!=tr||ry!=tc){if(rx<tr){rx++;mv='D';}else if(rx>tr){rx--;mv='U';}else if(ry<tc){ry++;mv='R';}else{ry--;mv='L';}}\n        if(fd!=td){int cw=(td-fd+4)%4;if(cw<=2){fd=(fd+1)%4;rot='R';}else{fd=(fd+3)%4;rot='L';}}\n        ops.push_back(string{mv,rot,'.','.'});\n    }return true;\n}\nbool do_act(int r,int c,vector<vector<int>>&g,int val){\n    int br=-1,bc=-1,bdir=-1,bv=INT_MAX;\n    for(int d=0;d<4;d++){int ar=r-DR[d],ac=c-DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;int v=abs(rx-ar)+abs(ry-ac);if(v<bv){bv=v;br=ar;bc=ac;bdir=d;}}\n    if(br<0)return false;if(!nav(br,bc,bdir))return false;\n    if((int)ops.size()>=99990)return false;ops.push_back(\"...P\");g[r][c]=val;return true;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>V;\n    vector<string>sg(N),tg(N);for(auto&s:sg)cin>>s;for(auto&s:tg)cin>>s;\n    vector<pair<int,int>>S,T;vector<vector<int>>g(N,vector<int>(N,0));\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(sg[i][j]=='1'){S.push_back({i,j});g[i][j]=1;}if(tg[i][j]=='1')T.push_back({i,j});}\n    int m=M;cout<<\"2\\n0 1\\n0 0\\n\";rx=ry=fd=0;\n    vector<int>mt(m,-1);\n    {vector<bool>su(m,false),tu(m,false);\n    for(int i=0;i<m;i++)if(!su[i])for(int j=0;j<m;j++)if(!tu[j]&&S[i]==T[j]){mt[i]=j;su[i]=tu[j]=true;break;}\n    for(int i=0;i<m;i++){if(su[i])continue;int bj=-1,bd=INT_MAX;for(int j=0;j<m;j++){if(tu[j])continue;int d=abs(S[i].first-T[j].first)+abs(S[i].second-T[j].second);if(d<bd){bd=d;bj=j;}}mt[i]=bj;su[i]=tu[bj]=true;}\n    bool imp=true;while(imp){imp=false;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int si0=S[i].first,si1=S[i].second,sj0=S[j].first,sj1=S[j].second,ti0=T[mt[i]].first,ti1=T[mt[i]].second,tj0=T[mt[j]].first,tj1=T[mt[j]].second;int c0=abs(si0-ti0)+abs(si1-ti1)+abs(sj0-tj0)+abs(sj1-tj1),c1=abs(si0-tj0)+abs(si1-tj1)+abs(sj0-ti0)+abs(sj1-ti1);if(c1<c0){swap(mt[i],mt[j]);imp=true;}}}}\n    struct D{int sr,sc,tr,tc;bool done;};vector<D>P;\n    for(int i=0;i<m;i++)if(S[i]!=T[mt[i]])P.push_back({S[i].first,S[i].second,T[mt[i]].first,T[mt[i]].second,false});\n    int np=(int)P.size(),rem=np;\n    while(rem>0&&(int)ops.size()<97000){\n        int fi=-1,bd=INT_MAX;\n        for(int i=0;i<np;i++){if(P[i].done||g[P[i].tr][P[i].tc])continue;int d=abs(rx-P[i].sr)+abs(ry-P[i].sc);if(d<bd){bd=d;fi=i;}}\n        if(fi>=0){if(!do_act(P[fi].sr,P[fi].sc,g,0))break;if(!do_act(P[fi].tr,P[fi].tc,g,1))break;P[fi].done=true;rem--;}\n        else{fi=-1;bd=INT_MAX;for(int i=0;i<np;i++){if(P[i].done)continue;int d=abs(rx-P[i].sr)+abs(ry-P[i].sc);if(d<bd){bd=d;fi=i;}}if(fi<0)break;\n            if(!do_act(P[fi].sr,P[fi].sc,g,0))break;\n            pair<int,int>tmp={-1,-1};\n            {set<pair<int,int>>ts;for(auto&d:P)if(!d.done)ts.insert({d.tr,d.tc});\n            for(int i=0;i<N&&tmp.first<0;i++)for(int j=0;j<N&&tmp.first<0;j++)if(!g[i][j]&&!ts.count({i,j}))tmp={i,j};\n            if(tmp.first<0)for(int i=0;i<N&&tmp.first<0;i++)for(int j=0;j<N&&tmp.first<0;j++)if(!g[i][j])tmp={i,j};}\n            if(tmp.first<0){P[fi].done=true;rem--;continue;}\n            if(!do_act(tmp.first,tmp.second,g,1))break;P[fi].sr=tmp.first;P[fi].sc=tmp.second;}\n    }\n    for(auto&op:ops)cout<<op<<\"\\n\";\n}","ahc039":"#include <bits/stdc++.h>\nusing namespace std;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    using Clock = chrono::steady_clock;\n    auto t0 = Clock::now();\n    auto elapsedMs = [&]() -> long long {\n        return chrono::duration_cast<chrono::milliseconds>(Clock::now()-t0).count();\n    };\n    int N; cin >> N;\n    int M = 2*N;\n    vector<int> X(M), Y(M), W(M);\n    for (int i = 0; i < M; i++) {\n        cin >> X[i] >> Y[i];\n        W[i] = (i < N) ? 1 : -1;\n    }\n    const int CMAX = 100000;\n    // Trivial initial output\n    {\n        int tx1=X[0], ty1=Y[0];\n        int tx2=(tx1<CMAX)?tx1+1:tx1-1;\n        int ty2=(ty1<CMAX)?ty1+1:ty1-1;\n        if(tx1>tx2) swap(tx1,tx2);\n        if(ty1>ty2) swap(ty1,ty2);\n        cout<<4<<\"\\n\"<<tx1<<\" \"<<ty1<<\"\\n\"<<tx2<<\" \"<<ty1<<\"\\n\"<<tx2<<\" \"<<ty2<<\"\\n\"<<tx1<<\" \"<<ty2<<\"\\n\";\n    }\n    struct FE { int key, other, w; };\n    vector<FE> bx(M), by(M);\n    {\n        vector<int> idx(M);\n        iota(idx.begin(),idx.end(),0);\n        sort(idx.begin(),idx.end(),[&](int a,int b){return X[a]<X[b];});\n        for(int i=0;i<M;i++) bx[i]={X[idx[i]],Y[idx[i]],W[idx[i]]};\n        iota(idx.begin(),idx.end(),0);\n        sort(idx.begin(),idx.end(),[&](int a,int b){return Y[a]<Y[b];});\n        for(int i=0;i<M;i++) by[i]={Y[idx[i]],X[idx[i]],W[idx[i]]};\n    }\n    // Group-based Kadane's: handles multiple fish at same coordinate correctly\n    auto kadane=[](const vector<FE>& fish,int lo,int hi)->pair<int,int>{\n        int cur=0,cs=-1,mx=0,blo=-1,bhi=-1; bool in_run=false;\n        for(int i=0,n=(int)fish.size();i<n;){\n            int xval=fish[i].key,gsum=0;\n            while(i<n&&fish[i].key==xval){\n                if(fish[i].other>=lo&&fish[i].other<=hi) gsum+=fish[i].w;\n                i++;\n            }\n            if(!in_run){\n                if(gsum>0){cs=xval;cur=gsum;in_run=true;if(cur>mx){mx=cur;blo=cs;bhi=xval;}}\n            } else {\n                cur+=gsum;\n                if(cur>mx){mx=cur;blo=cs;bhi=xval;}\n                if(cur<0){cur=0;in_run=false;}\n            }\n        }\n        return {blo,bhi};\n    };\n    auto evalRect=[&](int x1,int x2,int y1,int y2){\n        int s=0;\n        for(int i=0;i<M;i++)\n            if(X[i]>=x1&&X[i]<=x2&&Y[i]>=y1&&Y[i]<=y2) s+=W[i];\n        return s;\n    };\n    auto coordDescent=[&](int x1,int x2,int y1,int y2)->tuple<int,int,int,int,int>{\n        x1=max(0,min(CMAX,x1));x2=max(0,min(CMAX,x2));\n        y1=max(0,min(CMAX,y1));y2=max(0,min(CMAX,y2));\n        if(x1>x2) swap(x1,x2); if(y1>y2) swap(y1,y2);\n        int px1=-1,px2=-1,py1=-1,py2=-1;\n        for(int it=0;it<20;it++){\n            if(x1==px1&&x2==px2&&y1==py1&&y2==py2) break;\n            px1=x1;px2=x2;py1=y1;py2=y2;\n            auto [nx1,nx2]=kadane(bx,y1,y2); if(nx1>=0){x1=nx1;x2=nx2;}\n            auto [ny1,ny2]=kadane(by,x1,x2); if(ny1>=0){y1=ny1;y2=ny2;}\n        }\n        return make_tuple(evalRect(x1,x2,y1,y2),x1,x2,y1,y2);\n    };\n    // Grid Kadane's\n    const int G=200, step=CMAX/G;\n    vector<vector<int>> grid(G,vector<int>(G,0));\n    for(int i=0;i<M;i++) grid[min(X[i]/step,G-1)][min(Y[i]/step,G-1)]+=W[i];\n    int bgx1=0,bgx2=0,bgy1=0,bgy2=0,bgs=0;\n    for(int gx1=0;gx1<G;gx1++){\n        vector<int> cs(G,0);\n        for(int gx2=gx1;gx2<G;gx2++){\n            for(int gy=0;gy<G;gy++) cs[gy]+=grid[gx2][gy];\n            int cur=0,cst=0,mx=0,ms=0,me=-1;\n            for(int gy=0;gy<G;gy++){\n                cur+=cs[gy];\n                if(cur>mx){mx=cur;ms=cst;me=gy;}\n                if(cur<0){cur=0;cst=gy+1;}\n            }\n            if(me>=0&&mx>bgs){bgs=mx;bgx1=gx1;bgx2=gx2;bgy1=ms;bgy2=me;}\n        }\n    }\n    int ix1=bgx1*step, ix2=min((bgx2+1)*step,CMAX);\n    int iy1=bgy1*step, iy2=min((bgy2+1)*step,CMAX);\n    int gscore=-1,rx1=0,rx2=1,ry1=0,ry2=1;\n    auto tryRun=[&](int x1,int x2,int y1,int y2){\n        auto [s,a,b,c,d]=coordDescent(x1,x2,y1,y2);\n        if(s>gscore){gscore=s;rx1=a;rx2=b;ry1=c;ry2=d;}\n    };\n    tryRun(ix1,ix2,iy1,iy2);\n    tryRun(0,CMAX,0,CMAX);\n    // Centroid start\n    {\n        long long cx=0,cy=0;\n        for(int i=0;i<N;i++){cx+=X[i];cy+=Y[i];}\n        cx/=N;cy/=N;\n        tryRun((int)cx-30000,(int)cx+30000,(int)cy-30000,(int)cy+30000);\n        tryRun((int)cx-10000,(int)cx+10000,(int)cy-10000,(int)cy+10000);\n    }\n    mt19937 rng(42);\n    for(int trial=0;;trial++){\n        if(trial%100==0&&elapsedMs()>1700) break;\n        int seed=rng()%N;\n        int cx=X[seed],cy=Y[seed];\n        int half;\n        switch(rng()%4){\n            case 0: half=200+rng()%800; break;\n            case 1: half=1000+rng()%9000; break;\n            case 2: half=10000+rng()%20000; break;\n            default: half=30000+rng()%20000; break;\n        }\n        tryRun(cx-half,cx+half,cy-half,cy+half);\n    }\n    if(gscore>=1){\n        rx1=max(0,rx1);rx2=min(CMAX,rx2);\n        ry1=max(0,ry1);ry2=min(CMAX,ry2);\n        if(rx1>=rx2){if(rx2<CMAX)rx2++;else rx1--;}\n        if(ry1>=ry2){if(ry2<CMAX)ry2++;else ry1--;}\n        cout<<4<<\"\\n\"<<rx1<<\" \"<<ry1<<\"\\n\"<<rx2<<\" \"<<ry1<<\"\\n\"<<rx2<<\" \"<<ry2<<\"\\n\"<<rx1<<\" \"<<ry2<<\"\\n\";\n    }\n    return 0;\n}","ahc040":"#pragma GCC optimize(\"O3,unroll-loops\")\n#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint N, T;\nvector<double> W, H;\ndouble sW, sH, mxW, mxH, totA;\n\nstruct Op { int p, r; char d; int b; };\n\npair<ll,ll> simulate(const vector<Op>& ops) {\n    vector<ll> x0(N,0),y0(N,0),x1(N,0),y1(N,0);\n    vector<bool> pl(N,false);\n    for (const auto& o : ops) {\n        int p = o.p;\n        ll w = max(1LL, llround(o.r ? H[p] : W[p]));\n        ll h = max(1LL, llround(o.r ? W[p] : H[p]));\n        if (o.d == 'U') {\n            ll xl = o.b >= 0 ? x1[o.b] : 0LL;\n            ll yt = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && x0[i] < xl+w && x1[i] > xl)\n                    yt = max(yt, y1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        } else {\n            ll yt = o.b >= 0 ? y1[o.b] : 0LL;\n            ll xl = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && y0[i] < yt+h && y1[i] > yt)\n                    xl = max(xl, x1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        }\n        pl[p] = true;\n    }\n    ll rW=0, rH=0;\n    for (int i = 0; i < N; i++)\n        if (pl[i]) { rW=max(rW,x1[i]); rH=max(rH,y1[i]); }\n    return {rW, rH};\n}\n\n// col=false: shelf packing (rows); col=true: column packing\n// For col=false, line0 uses U, rest use L\n// For col=true,  line0 uses L, rest use U\nvector<Op> make_pack(const vector<int>& rot, double tgt, bool col) {\n    vector<Op> ops; ops.reserve(N);\n    int cl = -1; double cm = 0;\n    vector<int> lr; vector<double> lc;\n    int p0 = -1;\n    for (int i = 0; i < N; i++) {\n        double m = col ? (rot[i] ? W[i] : H[i]) : (rot[i] ? H[i] : W[i]);\n        double c = col ? (rot[i] ? H[i] : W[i]) : (rot[i] ? W[i] : H[i]);\n        if (cl < 0 || cm + m > tgt) {\n            cl++; cm = m;\n            lr.push_back(i); lc.push_back(c);\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', -1});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        } else {\n            cm += m;\n            if (c > lc[cl]) { lc[cl]=c; lr[cl]=i; }\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', p0});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        }\n    }\n    return ops;\n}\n\ndouble calc_score(const vector<int>& rot, double tgt, bool col) {\n    auto [a,b] = simulate(make_pack(rot, tgt, col));\n    return (double)(a+b);\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    double sigma;\n    cin >> N >> T >> sigma;\n    W.resize(N); H.resize(N);\n    for (int i = 0; i < N; i++) cin >> W[i] >> H[i];\n\n    sW=sH=mxW=mxH=totA=0;\n    for (int i = 0; i < N; i++) {\n        sW+=W[i]; sH+=H[i];\n        mxW=max(mxW,W[i]); mxH=max(mxH,H[i]);\n        totA+=W[i]*H[i];\n    }\n\n    const double BUDGET = 2600.0;\n    auto t0 = chrono::steady_clock::now();\n    auto now = [&]() {\n        return chrono::duration<double,milli>(chrono::steady_clock::now()-t0).count();\n    };\n\n    vector<int> g_rot;\n    double g_tgt=0, g_score=1e18;\n    bool g_col=false;\n\n    for (int t = 0; t < T; t++) {\n        double ts = now();\n        double per = max(1.0, (BUDGET - ts) / (T - t));\n        double dl = ts + per * 0.95;\n\n        mt19937 rng(t * 1234567891u ^ 987654321u);\n        uniform_real_distribution<double> uni(0,1);\n\n        bool col;\n        double lo, hi, tgt;\n        vector<int> rot(N);\n\n        if (t < (T+1)/2) {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            // Init rotation: minimize cross-dim\n            for (int i = 0; i < N; i++)\n                rot[i] = col ? (H[i]<W[i] ? 1:0) : (W[i]<H[i] ? 1:0);\n            int nf = max(1, (int)sqrt((double)t+0.1));\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.4)));\n        } else if (g_score < 1e17) {\n            rot=g_rot; col=g_col; tgt=g_tgt;\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            int nf = max(1, N/8);\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.12)));\n        } else {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            for (int i = 0; i < N; i++) rot[i] = rng()%2;\n        }\n\n        // Greedy rotation improvement\n        double cur = calc_score(rot, tgt, col);\n        for (int i = 0; i < N; i++) {\n            rot[i] ^= 1;\n            double ns = calc_score(rot, tgt, col);\n            if (ns < cur) cur = ns;\n            else rot[i] ^= 1;\n        }\n\n        vector<int> br=rot;\n        double bt=tgt;\n        bool bc=col;\n        double bs=cur;\n\n        double Th = cur*0.05+1.0;\n        double Tl = max(1.0, cur*1e-5);\n\n        // Simulated Annealing\n        for (int it=0; ; it++) {\n            if ((it&63)==0 && now()>=dl) break;\n            double frac = max(0.0, min(1.0, (now()-ts)/per));\n            double Tc = max(Tl, Th * pow(Tl/Th, frac));\n\n            int mv = rng()%10, fi=-1;\n            double ot=tgt;\n            bool oc=col;\n            double olo=lo, ohi=hi;\n\n            if (mv < 7) {\n                fi = rng()%N;\n                rot[fi] ^= 1;\n            } else if (mv < 9) {\n                tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.35)));\n            } else {\n                col ^= 1;\n                lo = col ? mxH : mxW;\n                hi = col ? sH  : sW;\n                tgt = max(lo, min(hi, ot));\n            }\n\n            double ns = calc_score(rot, tgt, col);\n            double d = ns - cur;\n            if (d <= 0 || uni(rng) < exp(-d/Tc)) {\n                cur = ns;\n                if (ns < bs) { bs=ns; br=rot; bt=tgt; bc=col; }\n            } else {\n                if (fi >= 0) rot[fi] ^= 1;\n                else if (mv < 9) tgt = ot;\n                else { col=oc; lo=olo; hi=ohi; tgt=ot; }\n            }\n        }\n\n        // Final greedy passes\n        for (int pass=0; pass<3; pass++) {\n            bool imp=false;\n            for (int i=0; i<N; i++) {\n                br[i] ^= 1;\n                double ns = calc_score(br, bt, bc);\n                if (ns < bs) { bs=ns; imp=true; }\n                else br[i] ^= 1;\n            }\n            if (!imp) break;\n        }\n\n        if (bs < g_score) { g_score=bs; g_rot=br; g_tgt=bt; g_col=bc; }\n\n        auto ops = make_pack(br, bt, bc);\n        cout << (int)ops.size() << \"\\n\";\n        for (const auto& op : ops)\n            cout << op.p << \" \" << op.r << \" \" << op.d << \" \" << op.b << \"\\n\";\n        cout.flush();\n\n        ll Wf, Hf;\n        cin >> Wf >> Hf;\n    }\n\n    return 0;\n}","ahc041":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\nint N, M, H, A[1000];\nvector<int> G[1000];\nint par[1000], dep[1000], ssm[1000], mdn[1000];\nvector<int> ch[1000];\nvoid dfs_init(int v){ssm[v]=A[v];mdn[v]=0;for(int c:ch[v]){dfs_init(c);ssm[v]+=ssm[c];mdn[v]=max(mdn[v],mdn[c]+1);}}\nvoid push_dep(int v,int d){dep[v]=d;for(int c:ch[v])push_dep(c,d+1);}\nbool in_sub(int w,int v){for(;w!=-1;w=par[w])if(w==v)return true;return false;}\nvoid pull_ssm(int v){for(;v!=-1;v=par[v]){int s=A[v];for(int c:ch[v])s+=ssm[c];ssm[v]=s;}}\nvoid pull_mdn(int v){for(;v!=-1;v=par[v]){int m=0;for(int c:ch[v])m=max(m,mdn[c]+1);mdn[v]=m;}}\nvoid do_move(int v,int np){\n    int op=par[v];\n    if(op!=-1){auto&c=ch[op];c.erase(find(c.begin(),c.end(),v));}\n    par[v]=np;\n    if(np!=-1){ch[np].push_back(v);push_dep(v,dep[np]+1);}else push_dep(v,0);\n    if(op!=-1){pull_ssm(op);pull_mdn(op);}\n    if(np!=-1){pull_ssm(np);pull_mdn(np);}\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>H;\n    for(int i=0;i<N;i++)cin>>A[i];\n    for(int i=0;i<M;i++){int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}\n    for(int i=0;i<N;i++){int x,y;cin>>x>>y;}\n    fill(par,par+N,-1);fill(dep,dep+N,0);\n    for(int i=0;i<N;i++)ch[i].clear();\n    vector<bool>vis(N,false);\n    vector<int>ord(N);iota(ord.begin(),ord.end(),0);\n    sort(ord.begin(),ord.end(),[](int a,int b){return A[a]<A[b];});\n    for(int s:ord){\n        if(vis[s])continue;\n        queue<int>q;q.push(s);vis[s]=true;\n        while(!q.empty()){\n            int v=q.front();q.pop();\n            if(dep[v]>=H)continue;\n            for(int u:G[v])if(!vis[u]){vis[u]=true;par[u]=v;dep[u]=dep[v]+1;ch[v].push_back(u);q.push(u);}\n        }\n    }\n    for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);\n    mt19937 rng(42);\n    auto t0=chrono::steady_clock::now();\n    for(;;){\n        if(chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count()>1800)break;\n        bool impr=false;\n        vector<int>perm(N);iota(perm.begin(),perm.end(),0);\n        shuffle(perm.begin(),perm.end(),rng);\n        for(int v:perm){\n            int lim=H-1-mdn[v];\n            if(lim<0)continue;\n            int bp=par[v];ll bg=0;\n            for(int w:G[v]){\n                if(dep[w]>lim)continue;\n                if(in_sub(w,v))continue;\n                ll g=(ll)(dep[w]+1-dep[v])*ssm[v];\n                if(g>bg){bg=g;bp=w;}\n            }\n            if(bg>0){do_move(v,bp);impr=true;}\n        }\n        if(!impr)break;\n    }\n    for(int v=0;v<N;v++){if(v)cout<<' ';cout<<par[v];}\n    cout<<'\\n';\n}","ahc042":"#include <bits/stdc++.h>\nusing namespace std;\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N; cin >> N;\n    vector<string> board(N);\n    for (int i = 0; i < N; i++) cin >> board[i];\n    vector<pair<int,int>> oni;\n    for (int i = 0; i < N; i++)\n        for (int j = 0; j < N; j++)\n            if (board[i][j] == 'x') oni.push_back({i, j});\n    int M = (int)oni.size();\n    if (M == 0) return 0;\n    vector<int> ctop(N,N),cbot(N,-1),rleft(N,N),rright(N,-1);\n    for (int i=0;i<N;i++) for (int j=0;j<N;j++) if (board[i][j]=='o') {\n        ctop[j]=min(ctop[j],i); cbot[j]=max(cbot[j],i);\n        rleft[i]=min(rleft[i],j); rright[i]=max(rright[i],j);\n    }\n    auto get_mask=[&](char dir,int idx,int depth)->long long {\n        long long mask=0;\n        for (int k=0;k<M;k++) { int r=oni[k].first,c=oni[k].second;\n            if(dir=='U'&&c==idx&&r<=depth) mask|=1LL<<k;\n            else if(dir=='D'&&c==idx&&r>=depth) mask|=1LL<<k;\n            else if(dir=='L'&&r==idx&&c<=depth) mask|=1LL<<k;\n            else if(dir=='R'&&r==idx&&c>=depth) mask|=1LL<<k; } return mask; };\n    auto get_cost=[&](char dir,int depth)->int { return (dir=='U'||dir=='L')?2*(depth+1):2*(N-depth); };\n    struct Cand{char dir;int idx,depth,cost;long long mask;};\n    vector<Cand> cands;\n    for (int k=0;k<M;k++) { int r=oni[k].first,c=oni[k].second;\n        if(r<ctop[c]) cands.push_back({'U',c,r,get_cost('U',r),get_mask('U',c,r)});\n        if(r>cbot[c]) cands.push_back({'D',c,r,get_cost('D',r),get_mask('D',c,r)});\n        if(c<rleft[r]) cands.push_back({'L',r,c,get_cost('L',c),get_mask('L',r,c)});\n        if(c>rright[r]) cands.push_back({'R',r,c,get_cost('R',c),get_mask('R',r,c)}); }\n    long long remaining=(1LL<<M)-1;\n    map<pair<char,int>,int> sel;\n    while (remaining) {\n        double best=1e18; int bi=-1;\n        for (int i=0;i<(int)cands.size();i++) {\n            long long nm=cands[i].mask&remaining; if(!nm) continue;\n            auto key=make_pair(cands[i].dir,cands[i].idx);\n            int ac=cands[i].cost; auto it=sel.find(key);\n            if (it!=sel.end()) { char d=cands[i].dir; int cur=it->second;\n                bool up=(d=='U'||d=='L')?cands[i].depth>cur:cands[i].depth<cur;\n                if(!up) continue; ac-=get_cost(d,cur); }\n            if(ac<=0) continue;\n            double rv=(double)ac/__builtin_popcountll(nm);\n            if(rv<best){best=rv;bi=i;} }\n        if(bi<0) break;\n        sel[{cands[bi].dir,cands[bi].idx}]=cands[bi].depth;\n        remaining&=~cands[bi].mask; }\n    map<pair<char,int>,long long> smask;\n    for (auto&[key,d]:sel) smask[key]=get_mask(key.first,key.second,d);\n    bool changed=true;\n    while (changed) { changed=false;\n        for (auto it=sel.begin();it!=sel.end();) {\n            auto&[key,d]=*it; char dir=key.first; int idx=key.second;\n            long long others=0;\n            for (auto&[k2,m]:smask) if(k2!=key) others|=m;\n            long long uniq=smask[key]&~others;\n            if(!uniq){smask.erase(key);it=sel.erase(it);changed=true;break;}\n            int nd;\n            if(dir=='U'){nd=0;for(int k=0;k<M;k++) if((uniq>>k)&1)nd=max(nd,oni[k].first);}\n            else if(dir=='D'){nd=N-1;for(int k=0;k<M;k++) if((uniq>>k)&1)nd=min(nd,oni[k].first);}\n            else if(dir=='L'){nd=0;for(int k=0;k<M;k++) if((uniq>>k)&1)nd=max(nd,oni[k].second);}\n            else{nd=N-1;for(int k=0;k<M;k++) if((uniq>>k)&1)nd=min(nd,oni[k].second);}\n            if(nd!=d){d=nd;smask[key]=get_mask(dir,idx,nd);changed=true;break;}\n            else ++it; } }\n    for (auto&[key,d]:sel) {\n        char dir=key.first,rev; int idx=key.second;\n        int s=(dir=='U'||dir=='L')?d+1:N-d;\n        if(dir=='U')rev='D';else if(dir=='D')rev='U';else if(dir=='L')rev='R';else rev='L';\n        for(int k=0;k<s;k++) cout<<dir<<\" \"<<idx<<\"\\n\";\n        for(int k=0;k<s;k++) cout<<rev<<\" \"<<idx<<\"\\n\"; }\n    return 0;\n}","ahc044":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN = 100;\nint N, L, T[MAXN], a[MAXN], b[MAXN], cv[MAXN], fv[MAXN], flow[MAXN];\nvoid computeFlow(){fill(flow,flow+N,0);for(int i=0;i<N;i++){flow[a[i]]+=cv[i];flow[b[i]]+=fv[i];}flow[0]++;}\nlong long flowErr(){long long e=0;for(int j=0;j<N;j++)e+=abs(flow[j]-T[j]);return e;}\nbool checkConn(){bool vis[MAXN]={};queue<int>q;vis[0]=true;q.push(0);while(!q.empty()){int x=q.front();q.pop();if(!vis[a[x]]){vis[a[x]]=true;q.push(a[x]);}if(!vis[b[x]]){vis[b[x]]=true;q.push(b[x]);}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nvoid fixConn(){for(int pass=0;pass<N;pass++){bool vis[MAXN]={};queue<int>q;vis[0]=true;q.push(0);while(!q.empty()){int x=q.front();q.pop();if(!vis[a[x]]){vis[a[x]]=true;q.push(a[x]);}if(!vis[b[x]]){vis[b[x]]=true;q.push(b[x]);}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bestD=(long long)4e18;int besti=-1;bool bestA=false;for(int i=0;i<N;i++){if(!vis[i])continue;if(a[i]!=u){int old=a[i],w=cv[i];long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bestD){bestD=d;besti=i;bestA=true;}}if(b[i]!=u){int old=b[i],w=fv[i];long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bestD){bestD=d;besti=i;bestA=false;}}}if(besti<0)break;if(bestA){if(cv[besti]>0){flow[a[besti]]-=cv[besti];flow[u]+=cv[besti];}a[besti]=u;}else{if(fv[besti]>0){flow[b[besti]]-=fv[besti];flow[u]+=fv[besti];}b[besti]=u;}}}\nvoid flowSearch(){long long curErr=flowErr();bool improved=true;while(improved){improved=false;for(int i=0;i<N;i++){for(int t2=0;t2<2;t2++){int old=(t2?b[i]:a[i]),w=(t2?fv[i]:cv[i]);int bestJ=-1;long long bestD=0;for(int j=0;j<N;j++){if(j==old)continue;long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[j]+w-T[j])-abs(flow[j]-T[j]))):0LL;if(d<bestD){if(t2)b[i]=j;else a[i]=j;bool ok=checkConn();if(t2)b[i]=old;else a[i]=old;if(ok){bestD=d;bestJ=j;}}}if(bestJ>=0){if(w>0){flow[old]-=w;flow[bestJ]+=w;}curErr+=bestD;if(t2)b[i]=bestJ;else a[i]=bestJ;improved=true;}}}}}\nlong long simulate(){int cnt[MAXN]={},vc[MAXN]={};int cur=0;cnt[0]++;vc[0]++;for(int w=2;w<=L;w++){int nxt=(vc[cur]&1)?a[cur]:b[cur];cur=nxt;cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++)e+=abs(cnt[j]-T[j]);return e;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>L;for(int i=0;i<N;i++)cin>>T[i];\n    for(int i=0;i<N;i++){cv[i]=(T[i]+1)/2;fv[i]=T[i]/2;}\n    for(int i=0;i<N;i++)a[i]=b[i]=0;\n    vector<tuple<int,int,int>>items;\n    for(int i=0;i<N;i++){items.emplace_back(cv[i],0,i);items.emplace_back(fv[i],1,i);}\n    sort(items.rbegin(),items.rend());\n    int rem[MAXN];for(int j=0;j<N;j++)rem[j]=T[j];if(rem[0]>0)rem[0]--;\n    priority_queue<pair<int,int>>pq;for(int j=0;j<N;j++)pq.push({rem[j],j});\n    for(auto&[w,type,emp]:items){auto[cap,bin]=pq.top();pq.pop();if(type==0)a[emp]=bin;else b[emp]=bin;rem[bin]-=w;pq.push({rem[bin],bin});}\n    computeFlow();fixConn();flowSearch();\n    long long bestErr=simulate();\n    int bestA[MAXN],bestB[MAXN];copy(a,a+N,bestA);copy(b,b+N,bestB);long long curErr=bestErr;\n    mt19937 rng(42);\n    auto t0=chrono::steady_clock::now();\n    while(true){\n        long long el=chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now()-t0).count();\n        if(el>1800000LL)break;\n        int i=rng()%N,type=rng()%2,jNew=(int)(rng()%N);\n        int&ptr=type?b[i]:a[i];int old=ptr;\n        if(jNew==old)continue;\n        ptr=jNew;\n        if(!checkConn()){ptr=old;continue;}\n        long long err=simulate();\n        if(err<=curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,bestA);copy(b,b+N,bestB);}}\n        else ptr=old;\n    }\n    copy(bestA,bestA+N,a);copy(bestB,bestB+N,b);\n    for(int i=0;i<N;i++)cout<<a[i]<<\" \"<<b[i]<<\"\\n\";\n    return 0;\n}","ahc045":"#include <bits/stdc++.h>\nusing namespace std;\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    int N, M, Q, L, W;\n    cin >> N >> M >> Q >> L >> W;\n    vector<int> G(M);\n    for (int& g : G) cin >> g;\n    vector<int> lx(N),rx(N),ly(N),ry(N);\n    vector<double> cx(N),cy(N);\n    for (int i=0;i<N;i++){cin>>lx[i]>>rx[i]>>ly[i]>>ry[i];cx[i]=(lx[i]+rx[i])/2.0;cy[i]=(ly[i]+ry[i])/2.0;}\n    auto edist2=[&](int a,int b)->double{double dx=cx[a]-cx[b],dy=cy[a]-cy[b];return dx*dx+dy*dy;};\n    auto expand_bits=[](uint32_t x)->uint64_t{uint64_t r=0;for(int i=0;i<16;i++)r|=((uint64_t)((x>>i)&1))<<(2*i);return r;};\n    vector<int> city_order(N);iota(city_order.begin(),city_order.end(),0);\n    sort(city_order.begin(),city_order.end(),[&](int a,int b)->bool{uint64_t ma=expand_bits((uint32_t)cx[a])|(expand_bits((uint32_t)cy[a])<<1);uint64_t mb=expand_bits((uint32_t)cx[b])|(expand_bits((uint32_t)cy[b])<<1);return ma<mb;});\n    vector<vector<int>> groups(M);{int pos=0;for(int i=0;i<M;i++){groups[i].assign(city_order.begin()+pos,city_order.begin()+pos+G[i]);pos+=G[i];}}\n    vector<vector<int>> sc(M);\n    for(int i=0;i<M;i++){int g=G[i];auto& v=groups[i];if(g<=1){sc[i]=v;continue;}\n    vector<bool> used(g,false);int start=0;for(int k=1;k<g;k++)if(cx[v[k]]<cx[v[start]])start=k;\n    sc[i].reserve(g);sc[i].push_back(v[start]);used[start]=true;\n    for(int k=1;k<g;k++){int cur=sc[i].back();double best=1e18;int bj=-1;for(int j=0;j<g;j++)if(!used[j]){double d=edist2(cur,v[j]);if(d<best){best=d;bj=j;}}sc[i].push_back(v[bj]);used[bj]=true;}\n    for(int iter=0;iter<3;iter++){bool improved=false;for(int a=0;a<g-1;a++)for(int b=a+2;b<g;b++){double d_old=edist2(sc[i][a],sc[i][a+1]);if(b+1<g)d_old+=edist2(sc[i][b],sc[i][b+1]);double d_new=edist2(sc[i][a],sc[i][b]);if(b+1<g)d_new+=edist2(sc[i][a+1],sc[i][b+1]);if(d_new<d_old-1e-9){reverse(sc[i].begin()+a+1,sc[i].begin()+b+1);improved=true;}}if(!improved)break;}}\n    int qrem=Q;vector<vector<pair<double,pair<int,int>>>> all_edges(M);\n    auto do_query=[&](const vector<int>& qc,int gi){if((int)qc.size()<2||qrem<=0)return;qrem--;cout<<\"? \"<<qc.size();for(int c:qc)cout<<\" \"<<c;cout<<\"\\n\"<<flush;for(int k=0;k+1<(int)qc.size();k++){int a,b;cin>>a>>b;all_edges[gi].push_back({edist2(a,b),{a,b}});}};\n    auto nwindows=[&](int g)->int{if(g<=1)return 0;if(g<=L)return 1;return(g-2)/(L-1)+1;};\n    int total_mandatory=0;for(int i=0;i<M;i++)total_mandatory+=nwindows(G[i]);\n    int extra_budget=Q-total_mandatory;\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;if(g<=L){do_query(sc[i],i);}else{int start=0;while(true){int end=min(start+L,g);bool is_last=(end>=g);if(is_last&&end-start<L){start=g-L;end=g;}do_query(vector<int>(sc[i].begin()+start,sc[i].begin()+end),i);if(is_last)break;start+=L-1;}}}\n    {vector<int> large;for(int i=0;i<M;i++)if(G[i]>L)large.push_back(i);\n    if(!large.empty()&&extra_budget>0)for(int qi=0;qi<extra_budget&&qrem>0;qi++){int gi=large[qi%(int)large.size()];int g=G[gi];int stride=max(1,g/L);int offset=(qi/(int)large.size())%stride;vector<int> window;for(int k=offset;k<g&&(int)window.size()<L;k+=stride)window.push_back(sc[gi][k]);if((int)window.size()>=2)do_query(window,gi);}}\n    vector<int> par(N);auto find_uf=[&](int x)->int{while(par[x]!=x){par[x]=par[par[x]];x=par[x];}return x;};\n    vector<vector<pair<int,int>>> ans(M);\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;for(int k:sc[i])par[k]=k;sort(all_edges[i].begin(),all_edges[i].end());for(auto& [d,e]:all_edges[i]){int ra=find_uf(e.first),rb=find_uf(e.second);if(ra!=rb){par[ra]=rb;ans[i].push_back(e);}}for(int k=1;k<g;k++){int ra=find_uf(sc[i][k]),rb=find_uf(sc[i][k-1]);if(ra!=rb){par[ra]=rb;ans[i].push_back({sc[i][k],sc[i][k-1]});}}}\n    cout<<\"!\\n\";\n    for(int i=0;i<M;i++){for(int j=0;j<G[i];j++){if(j>0)cout<<\" \";cout<<groups[i][j];}cout<<\"\\n\";for(auto& [a,b]:ans[i])cout<<a<<\" \"<<b<<\"\\n\";}\n    return 0;\n}","ahc046":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20;\nbool grid[N][N];\nconst int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\nconst int NS=N*N*21*21;\nstatic int bdist[NS],bprev[NS],bq[NS];\nstatic uint8_t bact[NS];\nvector<pair<char,char>> findPath(int r0,int c0,int tr,int tc){\n    memset(bdist,-1,sizeof(bdist));\n    int start=(r0*N+c0)*441,goal=(tr*N+tc)*441;\n    bdist[start]=0;int qh=0,qt=0;bq[qt++]=start;\n    while(qh<qt&&bdist[goal]==-1){\n        int s=bq[qh++];\n        int tmp=s,ebc=tmp%21-1;tmp/=21;int ebr=tmp%21-1;tmp/=21;int c=tmp%N,r=tmp/N;int d1=bdist[s]+1;\n        for(int d=0;d<4;d++){\n            int nr=r+DR[d],nc=c+DC[d];\n            auto isB=[&](int br,int bc)->bool{return(unsigned)br>=(unsigned)N||(unsigned)bc>=(unsigned)N||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){int ns=(nr*N+nc)*441+(ebr+1)*21+(ebc+1);if(bdist[ns]==-1){bdist[ns]=d1;bprev[ns]=s;bact[ns]=(0<<2)|d;bq[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}if(sr!=r||sc!=c){int ns=(sr*N+sc)*441+(ebr+1)*21+(ebc+1);if(bdist[ns]==-1){bdist[ns]=d1;bprev[ns]=s;bact[ns]=(1<<2)|d;bq[qt++]=ns;}}}\n            if((unsigned)nr<(unsigned)N&&(unsigned)nc<(unsigned)N){if(nr==ebr&&nc==ebc){int ns=(r*N+c)*441;if(bdist[ns]==-1){bdist[ns]=d1;bprev[ns]=s;bact[ns]=(2<<2)|d;bq[qt++]=ns;}}else if(ebr==-1&&!grid[nr][nc]){int ns=(r*N+c)*441+(nr+1)*21+(nc+1);if(bdist[ns]==-1){bdist[ns]=d1;bprev[ns]=s;bact[ns]=(2<<2)|d;bq[qt++]=ns;}}}\n        }\n    }\n    if(bdist[goal]==-1){vector<pair<char,char>> res;int r=r0,c=c0;while(r!=tr){res.push_back({'M',r<tr?'D':'U'});r+=(r<tr?1:-1);}while(c!=tc){res.push_back({'M',c<tc?'R':'L'});c+=(c<tc?1:-1);}return res;}\n    vector<pair<char,char>> path;\n    for(int cur=goal;cur!=start;cur=bprev[cur])path.push_back({\"MSA\"[bact[cur]>>2],\"UDLR\"[bact[cur]&3]});\n    reverse(path.begin(),path.end());return path;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int Nin,M;cin>>Nin>>M;\n    vector<pair<int,int>> pts(M);for(int i=0;i<M;i++)cin>>pts[i].first>>pts[i].second;\n    memset(grid,0,sizeof(grid));int cr=pts[0].first,cc=pts[0].second;\n    for(int i=1;i<M;i++){\n        int tr=pts[i].first,tc=pts[i].second;\n        auto path=findPath(cr,cc,tr,tc);\n        for(auto[a,d]:path){\n            cout<<a<<' '<<d<<'\\n';\n            int di=d=='U'?0:d=='D'?1:d=='L'?2:3;\n            if(a=='M'){cr+=DR[di];cc+=DC[di];}\n            else if(a=='S'){while((unsigned)(cr+DR[di])<(unsigned)N&&(unsigned)(cc+DC[di])<(unsigned)N&&!grid[cr+DR[di]][cc+DC[di]])cr+=DR[di],cc+=DC[di];}\n            else{grid[cr+DR[di]][cc+DC[di]]^=1;}\n        }\n        cr=tr;cc=tc;memset(grid,0,sizeof(grid));\n    }\n    return 0;\n}"},"2":{"ahc001":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=205;\nint n,px[MAXN],py[MAXN];\nlong long pr[MAXN];\ndouble score_pi(double si,long long ri){\n    if(si<=0)return 0.0;\n    double ratio=(si<=(double)ri)?si/ri:(double)ri/si;\n    return 1.0-(1.0-ratio)*(1.0-ratio);\n}\nstruct Split{int x1,y1,x2,y2,dir,sp,lo,hi;vector<int>L,R;};\nvector<Split>splits;\nint rx1[MAXN],ry1[MAXN],rx2[MAXN],ry2[MAXN];\nvoid recompute(){\n    for(int i=0;i<n;i++){rx1[i]=0;ry1[i]=0;rx2[i]=10000;ry2[i]=10000;}\n    for(auto&s:splits){\n        for(int i:s.L){if(s.dir==0)rx2[i]=min(rx2[i],s.sp);else ry2[i]=min(ry2[i],s.sp);}\n        for(int j:s.R){if(s.dir==0)rx1[j]=max(rx1[j],s.sp);else ry1[j]=max(ry1[j],s.sp);}\n    }\n}\ndouble evalAt(const Split&s,int sp){\n    double tot=0;\n    for(int i:s.L){\n        int nx2=(s.dir==0&&rx2[i]==s.sp)?sp:rx2[i];\n        int ny2=(s.dir==1&&ry2[i]==s.sp)?sp:ry2[i];\n        tot+=score_pi((double)max(0,nx2-rx1[i])*max(0,ny2-ry1[i]),pr[i]);\n    }\n    for(int j:s.R){\n        int nx1=(s.dir==0&&rx1[j]==s.sp)?sp:rx1[j];\n        int ny1=(s.dir==1&&ry1[j]==s.sp)?sp:ry1[j];\n        tot+=score_pi((double)max(0,rx2[j]-nx1)*max(0,ry2[j]-ny1),pr[j]);\n    }\n    return tot;\n}\nvoid build(vector<int>comp,int x1,int y1,int x2,int y2){\n    int nc=comp.size();\n    if(nc==1)return;\n    long long tr=0;for(int i:comp)tr+=pr[i];\n    vector<int>bx(comp),by(comp);\n    sort(bx.begin(),bx.end(),[](int a,int b){return px[a]<px[b];});\n    sort(by.begin(),by.end(),[](int a,int b){return py[a]<py[b];});\n    int bkx=-1,bsx=-1;double bex=1e18;\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[bx[k-1]];if(px[bx[k-1]]>=px[bx[k]])continue;int lo=max(px[bx[k-1]]+1,x1+1),hi=min(px[bx[k]],x2-1);if(lo>hi)continue;int sx=(int)round(x1+(double)(x2-x1)*pf/tr);sx=max(lo,min(hi,sx));double e=fabs((double)pf/tr-(double)(sx-x1)/(x2-x1));if(e<bex){bex=e;bsx=sx;bkx=k;}}}\n    int bky=-1,bsy=-1;double bey=1e18;\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[by[k-1]];if(py[by[k-1]]>=py[by[k]])continue;int lo=max(py[by[k-1]]+1,y1+1),hi=min(py[by[k]],y2-1);if(lo>hi)continue;int sy=(int)round(y1+(double)(y2-y1)*pf/tr);sy=max(lo,min(hi,sy));double e=fabs((double)pf/tr-(double)(sy-y1)/(y2-y1));if(e<bey){bey=e;bsy=sy;bky=k;}}}\n    if(bkx==-1&&bky==-1)return;\n    bool ux=(bkx!=-1)&&(bky==-1||bex<=bey);\n    Split s;s.x1=x1;s.y1=y1;s.x2=x2;s.y2=y2;\n    if(ux){\n        s.dir=0;s.sp=bsx;\n        s.lo=max(px[bx[bkx-1]]+1,x1+1);s.hi=min(px[bx[bkx]],x2-1);\n        for(int k=0;k<bkx;k++)s.L.push_back(bx[k]);\n        for(int k=bkx;k<nc;k++)s.R.push_back(bx[k]);\n        splits.push_back(s);\n        build(s.L,x1,y1,bsx,y2);build(s.R,bsx,y1,x2,y2);\n    }else{\n        s.dir=1;s.sp=bsy;\n        s.lo=max(py[by[bky-1]]+1,y1+1);s.hi=min(py[by[bky]],y2-1);\n        for(int k=0;k<bky;k++)s.L.push_back(by[k]);\n        for(int k=bky;k<nc;k++)s.R.push_back(by[k]);\n        splits.push_back(s);\n        build(s.L,x1,y1,x2,bsy);build(s.R,x1,bsy,x2,y2);\n    }\n}\nbool lsPass(){\n    bool imp=false;\n    for(auto&s:splits){\n        if(s.lo>=s.hi)continue;\n        int bsp=s.sp;double bs=evalAt(s,s.sp);\n        int lo=s.lo,hi=s.hi;\n        while(hi-lo>=3){\n            int m1=lo+(hi-lo)/3,m2=hi-(hi-lo)/3;\n            double s1=evalAt(s,m1),s2=evalAt(s,m2);\n            if(s1<s2-1e-9)lo=m1+1;\n            else if(s2<s1-1e-9)hi=m2-1;\n            else{lo=m1;hi=m2;}\n        }\n        for(int sp=lo;sp<=hi;sp++){double sc=evalAt(s,sp);if(sc>bs){bs=sc;bsp=sp;}}\n        if(bsp!=s.sp){s.sp=bsp;recompute();imp=true;}\n    }\n    return imp;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>n;for(int i=0;i<n;i++)cin>>px[i]>>py[i]>>pr[i];\n    vector<int>all(n);iota(all.begin(),all.end(),0);\n    build(all,0,0,10000,10000);\n    recompute();\n    auto t0=chrono::steady_clock::now();\n    for(;;){\n        if(chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count()>4000)break;\n        if(!lsPass())break;\n    }\n    for(int i=0;i<n;i++){\n        int x1=rx1[i],y1=ry1[i],x2=rx2[i],y2=ry2[i];\n        int W=x2-x1,H=y2-y1;\n        long long A=(long long)W*H,ri=pr[i];\n        int xi=px[i],yi=py[i];\n        if(A<=(long long)ri){cout<<x1<<\" \"<<y1<<\" \"<<x2<<\" \"<<y2<<\"\\n\";continue;}\n        double br=0;int bw=W,bh=H;bool done=false;\n        for(int w=1;w<=W&&!done;w++){\n            long long h0=ri/w;\n            for(int dh=0;dh<=1;dh++){\n                long long hh=h0+dh;if(hh<1||hh>(long long)H)continue;\n                long long area=(long long)w*hh;\n                double ratio=area<=(long long)ri?(double)area/ri:(double)ri/area;\n                if(ratio>br){br=ratio;bw=w;bh=(int)hh;if(br>=1-1e-9){done=true;break;}}\n            }\n        }\n        int a=max(x1,xi+1-bw),b=max(y1,yi+1-bh);\n        cout<<a<<\" \"<<b<<\" \"<<(a+bw)<<\" \"<<(b+bh)<<\"\\n\";\n    }\n    return 0;\n}","ahc002":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef chrono::steady_clock Clock;\nconst int N=50, MAXM=N*N+1;\nint si,sj,M,tid[N][N],pval[N][N];\nconst int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\nconst char dc[]={'U','D','L','R'};\nmt19937 rng;\nbool tu[MAXM],btu[MAXM];\nint pi_[MAXM],pj_[MAXM],pt_[MAXM],bpi[MAXM],bpj[MAXM],bpt[MAXM];\nchar pmv[MAXM],bpmv[MAXM];\nint plen,blen;long long cscore,bscore;int ci,cj;\nvoid save_best(){if(cscore<=bscore)return;bscore=cscore;blen=plen;memcpy(btu,tu,M);memcpy(bpi,pi_,plen*4);memcpy(bpj,pj_,plen*4);memcpy(bpt,pt_,plen*4);if(plen>1)memcpy(bpmv,pmv,plen-1);}\nvoid restore_best(){cscore=bscore;plen=blen;memcpy(tu,btu,M);memcpy(pi_,bpi,plen*4);memcpy(pj_,bpj,plen*4);memcpy(pt_,bpt,plen*4);if(plen>1)memcpy(pmv,bpmv,plen-1);ci=pi_[plen-1];cj=pj_[plen-1];}\nvoid walk_init(){fill(tu,tu+M,false);plen=1;ci=si;cj=sj;pi_[0]=si;pj_[0]=sj;pt_[0]=tid[si][sj];tu[tid[si][sj]]=true;cscore=pval[si][sj];}\nbool walk_step(double a,double b,double g){int bd=-1;double bh=-1e18;for(int d=0;d<4;d++){int ni=ci+dx[d],nj=cj+dy[d];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;int t=tid[ni][nj];if(tu[t])continue;tu[t]=true;int deg=0;double nv=0;for(int d2=0;d2<4;d2++){int nni=ni+dx[d2],nnj=nj+dy[d2];if((unsigned)nni>=(unsigned)N||(unsigned)nnj>=(unsigned)N)continue;if(!tu[tid[nni][nnj]]){deg++;nv+=pval[nni][nnj];}}tu[t]=false;double h=a*pval[ni][nj]+g*nv-b*deg+uniform_real_distribution<double>(-0.5,0.5)(rng);if(h>bh){bh=h;bd=d;}}if(bd==-1)return false;int ni=ci+dx[bd],nj=cj+dy[bd];tu[tid[ni][nj]]=true;cscore+=pval[ni][nj];pmv[plen-1]=dc[bd];pi_[plen]=ni;pj_[plen]=nj;pt_[plen]=tid[ni][nj];plen++;ci=ni;cj=nj;return true;}\nvoid walk_extend(double a,double b,double g){while(walk_step(a,b,g));}\nvoid walk_undo(int steps){steps=min(steps,plen-1);while(steps-->0){plen--;tu[pt_[plen]]=false;cscore-=pval[pi_[plen]][pj_[plen]];}ci=pi_[plen-1];cj=pj_[plen-1];}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    rng.seed(chrono::steady_clock::now().time_since_epoch().count());\n    cin>>si>>sj;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>tid[i][j];\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>pval[i][j];\n    M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)M=max(M,tid[i][j]+1);\n    bscore=pval[si][sj];blen=1;bpi[0]=si;bpj[0]=sj;bpt[0]=tid[si][sj];\n    fill(btu,btu+M,false);btu[tid[si][sj]]=true;\n    auto deadline=Clock::now()+chrono::milliseconds(1850);\n    int iter=0;\n    while(Clock::now()<deadline){\n        double a=uniform_real_distribution<double>(0.5,2.0)(rng);\n        double b=uniform_real_distribution<double>(0,25)(rng);\n        double g=uniform_real_distribution<double>(0,0.5)(rng);\n        if(iter%4==0||blen<=1){walk_init();}\n        else{restore_best();walk_undo(uniform_int_distribution<int>(1,blen-1)(rng));}\n        walk_extend(a,b,g);save_best();iter++;\n    }\n    cout<<string(bpmv,bpmv+blen-1)<<\"\\n\";\n}","ahc003":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30;\nconst double DELTA_VAR=1e6,INIT_SIG2_R=1e8,INIT_SIG2_E=1e7,MIN_SIG2=1e4;\ndouble mu_row[N],sig2_row[N],mu_col[N],sig2_col[N];\ndouble mu_h[N][N-1],sig2_h[N][N-1],mu_v[N-1][N],sig2_v[N-1][N];\nbool obs_h[N][N-1],obs_v[N-1][N];\ndouble wh(int i,int j){return obs_h[i][j]?mu_h[i][j]:mu_row[i];}\ndouble wv(int i,int j){return obs_v[i][j]?mu_v[i][j]:mu_col[j];}\nstring dijkstra(int sr,int sc,int tr,int tc){\n    static double dist[N*N];static int par[N*N];static char pdir[N*N];\n    fill(dist,dist+N*N,1e18);\n    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>> pq;\n    int src=sr*N+sc,dst=tr*N+tc;dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){\n        auto[d,u]=pq.top();pq.pop();\n        if(d>dist[u]+1e-9)continue;if(u==dst)break;\n        int r=u/N,c=u%N;\n        if(r>0){int nv=(r-1)*N+c;double nd=d+wv(r-1,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='U';pq.push({nd,nv});}}\n        if(r<N-1){int nv=(r+1)*N+c;double nd=d+wv(r,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='D';pq.push({nd,nv});}}\n        if(c>0){int nv=r*N+(c-1);double nd=d+wh(r,c-1);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='L';pq.push({nd,nv});}}\n        if(c<N-1){int nv=r*N+(c+1);double nd=d+wh(r,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='R';pq.push({nd,nv});}}\n    }\n    string path;for(int cur=dst;cur!=src;cur=par[cur])path+=pdir[cur];\n    reverse(path.begin(),path.end());return path;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    for(int i=0;i<N;i++){mu_row[i]=5000;sig2_row[i]=INIT_SIG2_R;}\n    for(int j=0;j<N;j++){mu_col[j]=5000;sig2_col[j]=INIT_SIG2_R;}\n    for(int q=0;q<1000;q++){\n        int sr,sc,tr,tc;cin>>sr>>sc>>tr>>tc;\n        string path=dijkstra(sr,sc,tr,tc);cout<<path<<\"\\n\";cout.flush();\n        int obs;cin>>obs;\n        double noise_var=(double)obs*obs/300.0;\n        int kh[N]={},lv[N]={};\n        struct E{bool is_h;int i,j;};vector<E> edges;\n        int r=sr,c=sc;\n        for(char ch:path){\n            if(ch=='U'){edges.push_back({false,r-1,c});lv[c]++;r--;}\n            else if(ch=='D'){edges.push_back({false,r,c});lv[c]++;r++;}\n            else if(ch=='L'){edges.push_back({true,r,c-1});kh[r]++;c--;}\n            else{edges.push_back({true,r,c});kh[r]++;c++;}\n        }\n        double pred_r=0,pvar_r=0;\n        for(int i=0;i<N;i++)if(kh[i]>0){pred_r+=kh[i]*mu_row[i];pvar_r+=(double)kh[i]*kh[i]*sig2_row[i]+kh[i]*DELTA_VAR;}\n        for(int j=0;j<N;j++)if(lv[j]>0){pred_r+=lv[j]*mu_col[j];pvar_r+=(double)lv[j]*lv[j]*sig2_col[j]+lv[j]*DELTA_VAR;}\n        double tvr=pvar_r+noise_var,resr=(double)obs-pred_r;\n        for(int i=0;i<N;i++)if(kh[i]>0){double K=sig2_row[i]*kh[i]/tvr;mu_row[i]=clamp(mu_row[i]+K*resr,1000.0,9000.0);sig2_row[i]=max(sig2_row[i]*(1.0-K*kh[i]),MIN_SIG2);}\n        for(int j=0;j<N;j++)if(lv[j]>0){double K=sig2_col[j]*lv[j]/tvr;mu_col[j]=clamp(mu_col[j]+K*resr,1000.0,9000.0);sig2_col[j]=max(sig2_col[j]*(1.0-K*lv[j]),MIN_SIG2);}\n        for(auto& e:edges){\n            if(e.is_h&&!obs_h[e.i][e.j]){obs_h[e.i][e.j]=true;mu_h[e.i][e.j]=mu_row[e.i];sig2_h[e.i][e.j]=INIT_SIG2_E;}\n            else if(!e.is_h&&!obs_v[e.i][e.j]){obs_v[e.i][e.j]=true;mu_v[e.i][e.j]=mu_col[e.j];sig2_v[e.i][e.j]=INIT_SIG2_E;}\n        }\n        double pred_e=0,pvar_e=0;\n        for(auto& e:edges){pred_e+=(e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j]);pvar_e+=(e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j]);}\n        double tve=pvar_e+noise_var,rese=(double)obs-pred_e;\n        for(auto& e:edges){\n            double& mu=e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j];\n            double& s2=e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j];\n            double K=s2/tve;mu=clamp(mu+K*rese,1000.0,9000.0);s2=max(s2*(1.0-K),MIN_SIG2);\n        }\n    }\n    return 0;\n}","ahc004":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20,MAXM=800,MAXL=12;\nint M;int8_t grid[N][N],h_mm[N][MAXM][N],v_mm[N][MAXM][N];\nint match_count[MAXM];int8_t S[MAXM][MAXL];int slen[MAXM];\nint8_t char_pos[MAXM][8][MAXL],char_pos_cnt[MAXM][8];uint8_t char_appears[MAXM];int score;\nint unsat_arr[MAXM],unsat_cnt,unsat_pos[MAXM];\nvoid unsat_remove(int k){int pos=unsat_pos[k];if(pos<0)return;int last=unsat_arr[--unsat_cnt];unsat_arr[pos]=last;unsat_pos[last]=pos;unsat_pos[k]=-1;}\nvoid unsat_add(int k){if(unsat_pos[k]>=0)return;unsat_pos[k]=unsat_cnt;unsat_arr[unsat_cnt++]=k;}\nvoid apply_cell(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int om=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;match_count[k]-=(h_mm[r][k][j]==0);h_mm[r][k][j]++;match_count[k]-=(v_mm[c][k][i2]==0);v_mm[c][k][i2]++;}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;h_mm[r][k][j]--;match_count[k]+=(h_mm[r][k][j]==0);v_mm[c][k][i2]--;match_count[k]+=(v_mm[c][k][i2]==0);}\n        int nm=match_count[k];if(om>0&&nm==0){unsat_add(k);score--;}else if(om==0&&nm>0){unsat_remove(k);score++;}}grid[r][c]=nc;}\nint compute_delta(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);int d=0;\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int mc=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi];mc-=(h_mm[r][k][(c-p+N)%N]==0);mc-=(v_mm[c][k][(r-p+N)%N]==0);}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi];mc+=(h_mm[r][k][(c-p+N)%N]==1);mc+=(v_mm[c][k][(r-p+N)%N]==1);}\n        d+=(mc>0)-(match_count[k]>0);}return d;}\nvoid recompute(){score=0;unsat_cnt=0;fill(unsat_pos,unsat_pos+M,-1);\n    for(int r=0;r<N;r++)for(int k=0;k<M;k++)for(int j=0;j<N;j++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[r][(j+p)%N]!=S[k][p]);h_mm[r][k][j]=mm;}\n    for(int c=0;c<N;c++)for(int k=0;k<M;k++)for(int i=0;i<N;i++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[(i+p)%N][c]!=S[k][p]);v_mm[c][k][i]=mm;}\n    for(int k=0;k<M;k++){match_count[k]=0;for(int r=0;r<N;r++)for(int j=0;j<N;j++)match_count[k]+=(h_mm[r][k][j]==0);for(int c=0;c<N;c++)for(int i=0;i<N;i++)match_count[k]+=(v_mm[c][k][i]==0);if(match_count[k]>0)score++;else unsat_add(k);}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int n;cin>>n>>M;\n    for(int k=0;k<M;k++){string s;cin>>s;slen[k]=s.size();char_appears[k]=0;memset(char_pos_cnt[k],0,8);\n        for(int p=0;p<slen[k];p++){int ch=s[p]-'A';S[k][p]=ch;char_pos[k][ch][char_pos_cnt[k][ch]++]=p;char_appears[k]|=(1u<<ch);}}\n    mt19937 rng(42);\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)grid[i][j]=rng()%8;\n    recompute();\n    int bs=score;int8_t bg[N][N];memcpy(bg,grid,sizeof(grid));\n    auto t0=chrono::steady_clock::now();const double TL=2.85;\n    if(score<M*5/100){\n        while(unsat_cnt>0){\n            double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=0.15||score>=M*2/5)break;\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];\n            int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n            for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n            for(int p=0;p<slen[k];p++){int rr=bd?((br+p)%N):br,cc=bd?bj:((bj+p)%N);int nc=S[k][p],oc=grid[rr][cc];if(nc!=oc)apply_cell(rr,cc,oc,nc);}\n            if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}\n        if(score!=bs){memcpy(grid,bg,sizeof(grid));recompute();}}\n    double sa0=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n    double sad=max(0.1,TL-sa0);double T=5.0;\n    for(int iter=0;;iter++){\n        if((iter&0xFFF)==0){double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();if(el>=TL)break;T=5.0*pow(0.001/5.0,min(1.0,max(0.0,(el-sa0)/sad)));}\n        bool guided=false;int r,c,nc,oc;\n        if(unsat_cnt>0&&rng()%(uint32_t)M<(uint32_t)unsat_cnt){\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];\n            int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int rr=0;rr<N;rr++)for(int jj=0;jj<N;jj++)if(h_mm[rr][k][jj]<bm){bm=h_mm[rr][k][jj];br=rr;bj=jj;bd=0;}\n            for(int cc=0;cc<N;cc++)for(int ii=0;ii<N;ii++)if(v_mm[cc][k][ii]<bm){bm=v_mm[cc][k][ii];br=ii;bj=cc;bd=1;}\n            int thr=max(0,min(3,slen[k]-5));\n            if(bm>=1&&bm<=thr){for(int p=0;p<slen[k]&&!guided;p++){int rr=bd?((br+p)%N):br,cc2=bd?bj:((bj+p)%N);if(grid[rr][cc2]!=S[k][p]){r=rr;c=cc2;nc=S[k][p];oc=grid[rr][cc2];guided=true;}}}}\n        if(!guided){r=rng()%N;c=rng()%N;nc=rng()%8;oc=grid[r][c];if(nc==oc)continue;}\n        int d=compute_delta(r,c,oc,nc);\n        if(d>=0||(double)rng()<exp((double)d/T)*4294967295.0){apply_cell(r,c,oc,nc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}\n    }\n    for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<(char)('A'+bg[i][j]);cout<<'\\n';}\n}","ahc005":"#include <bits/stdc++.h>\nusing namespace std;\nint N, si, sj;\nvector<string> grid;\nbool isRoad(int r, int c) { return r>=0&&r<N&&c>=0&&c<N&&grid[r][c]!='#'; }\nconst int INF=1e9;\npair<vector<int>,vector<int>> dijkstra(int src) {\n    vector<int> dist(N*N,INF),par(N*N,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;\n    dist[src]=0; pq.push({0,src});\n    const int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\n    while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>dist[u])continue;int r=u/N,c=u%N;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!isRoad(nr,nc))continue;int v=nr*N+nc,nd=dd+(grid[nr][nc]-'0');if(nd<dist[v]){dist[v]=nd;par[v]=u;pq.push({nd,v});}}}\n    return{dist,par};\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>si>>sj;grid.resize(N);for(int i=0;i<N;i++)cin>>grid[i];\n    vector<int> roads;vector<int> rIdx(N*N,-1);\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)if(isRoad(r,c)){rIdx[r*N+c]=roads.size();roads.push_back(r*N+c);}\n    int R=roads.size();\n    vector<vector<int>> vis(R);\n    for(int i=0;i<R;i++){int r=roads[i]/N,c=roads[i]%N;vis[i].push_back(i);for(int dd=1;c+dd<N&&isRoad(r,c+dd);dd++)vis[i].push_back(rIdx[r*N+(c+dd)]);for(int dd=1;c-dd>=0&&isRoad(r,c-dd);dd++)vis[i].push_back(rIdx[r*N+(c-dd)]);for(int dd=1;r+dd<N&&isRoad(r+dd,c);dd++)vis[i].push_back(rIdx[(r+dd)*N+c]);for(int dd=1;r-dd>=0&&isRoad(r-dd,c);dd++)vis[i].push_back(rIdx[(r-dd)*N+c]);}\n    vector<bool> covered(R,false);int uncov=R;vector<int> cnt(R);for(int i=0;i<R;i++)cnt[i]=vis[i].size();\n    priority_queue<pair<int,int>> pqsc;for(int i=0;i<R;i++)pqsc.push({cnt[i],i});\n    vector<int> sents;\n    while(uncov>0){int best=-1;while(!pqsc.empty()){auto[cv,id]=pqsc.top();pqsc.pop();if(cv==cnt[id]){best=id;break;}}if(best<0)break;sents.push_back(roads[best]);for(int j:vis[best])if(!covered[j]){covered[j]=true;uncov--;for(int k:vis[j]){cnt[k]--;pqsc.push({cnt[k],k});}}}\n    int stSq=si*N+sj;{auto it=find(sents.begin(),sents.end(),stSq);if(it==sents.end())sents.insert(sents.begin(),stSq);else swap(*it,sents[0]);}\n    int S=sents.size();\n    {vector<int> covCnt(R,0);for(int sq:sents)for(int j:vis[rIdx[sq]])covCnt[j]++;bool changed=true;while(changed){changed=false;for(int i=S-1;i>=1;i--){if(sents[i]<0)continue;int ridx=rIdx[sents[i]];bool red=true;for(int j:vis[ridx])if(covCnt[j]<=1){red=false;break;}if(red){for(int j:vis[ridx])covCnt[j]--;sents[i]=-1;changed=true;}}}sents.erase(remove(sents.begin(),sents.end(),-1),sents.end());S=sents.size();}\n    vector<vector<int>> allDist(S),allPar(S);\n    for(int i=0;i<S;i++){auto[d,p]=dijkstra(sents[i]);allDist[i]=move(d);allPar[i]=move(p);}\n    vector<vector<int>> dm(S,vector<int>(S,INF));for(int i=0;i<S;i++)for(int j=0;j<S;j++)dm[i][j]=allDist[i][sents[j]];\n    vector<bool> tvis(S,false);vector<int> tour={0};tvis[0]=true;\n    for(int s=1;s<S;s++){int cur=tour.back(),best=-1,bd=INF;for(int j=0;j<S;j++)if(!tvis[j]&&dm[cur][j]<bd){bd=dm[cur][j];best=j;}tour.push_back(best);tvis[best]=true;}\n    for(bool imp=true;imp;){imp=false;for(int i=0;i<S-1;i++)for(int j=i+2;j<S;j++){if(i==0&&j==S-1)continue;int ta=tour[i],tb=tour[i+1],tc=tour[j],td=tour[(j+1)%S];if(dm[ta][tc]+dm[tb][td]<dm[ta][tb]+dm[tc][td]){reverse(tour.begin()+i+1,tour.begin()+j+1);imp=true;}}}\n    string res;\n    for(int i=0;i<S;i++){int fi=tour[i],toSq=sents[tour[(i+1)%S]],srcSq=sents[fi];vector<int> path;for(int cur=toSq;cur!=srcSq;cur=allPar[fi][cur])path.push_back(cur);reverse(path.begin(),path.end());int pp=srcSq;for(int nx:path){int pr=pp/N,pc=pp%N,nr=nx/N,nc=nx%N;if(nr<pr)res+='U';else if(nr>pr)res+='D';else if(nc<pc)res+='L';else res+='R';pp=nx;}}\n    cout<<res<<\"\\n\";return 0;\n}","future-contest-2022-qual":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N, M, K, R;\nvector<vector<int>> d, succs;\nvector<int> task_st, task_pre, task_w, worker_t, task_sd;\nvector<vector<double>> sk;\nvector<vector<int>> lb;\nvector<vector<pair<int,int>>> obs;\nvector<double> cp;\nvector<vector<double>> et;\nint cur_day;\ndouble prior_sk;\n\nvoid upd_et(int w) {\n    for (int i = 0; i < N; i++) {\n        double ww = 0;\n        for (int k = 0; k < K; k++) { double df = d[i][k] - sk[w][k]; if (df > 0) ww += df; }\n        et[i][w] = ww < 0.5 ? 1.0 : ww;\n    }\n}\n\nvoid calc_cp() {\n    cp.assign(N, 0.0);\n    for (int i = N-1; i >= 0; i--) {\n        if (task_st[i] == 2) continue;\n        double mn;\n        if (task_st[i] == 1) { double rem = task_sd[i] + et[i][task_w[i]] - cur_day; mn = max(1.0, rem); }\n        else { mn = et[i][0]; for (int j = 1; j < M; j++) mn = min(mn, et[i][j]); }\n        double mx = 0;\n        for (int v : succs[i]) mx = max(mx, cp[v]);\n        cp[i] = mn + mx;\n    }\n}\n\nvoid refit(int w) {\n    int n = (int)obs[w].size();\n    double decay = exp(-0.1 * n);\n    for (int k = 0; k < K; k++) sk[w][k] = max((double)lb[w][k], prior_sk * decay);\n    double lr = 1.0;\n    for (int it = 0; it < 200; it++) {\n        double delta[20] = {}; double loss = 0;\n        for (auto& [ti, to] : obs[w]) {\n            double wh = 0;\n            for (int k = 0; k < K; k++) { double df = d[ti][k] - sk[w][k]; if (df > 0) wh += df; }\n            double tgt = to == 1 ? 0.0 : (double)to, err = wh - tgt;\n            loss += err * err;\n            for (int k = 0; k < K; k++) {\n                if (d[ti][k] > sk[w][k]) delta[k] += err;\n                else if (err < -0.5 && d[ti][k] > 0) delta[k] += 0.3 * err;\n            }\n        }\n        bool ch = false;\n        for (int k = 0; k < K; k++) {\n            double ns = max((double)lb[w][k], max(0.0, sk[w][k] + lr * delta[k] / n));\n            if (ns != sk[w][k]) { sk[w][k] = ns; ch = true; }\n        }\n        if (!ch || loss / n < 0.1) break;\n        lr *= 0.95;\n    }\n    upd_et(w);\n}\n\nint main() {\n    ios::sync_with_stdio(false); cin.tie(nullptr);\n    cin >> N >> M >> K >> R;\n    d.assign(N, vector<int>(K));\n    for (int i = 0; i < N; i++) for (int k = 0; k < K; k++) cin >> d[i][k];\n    succs.assign(N, {}); task_pre.assign(N, 0);\n    for (int r = 0; r < R; r++) { int u, v; cin >> u >> v; u--; v--; succs[u].push_back(v); task_pre[v]++; }\n    task_st.assign(N, 0); task_w.assign(N, -1); worker_t.assign(M, -1); task_sd.assign(N, 0);\n    prior_sk = 40.0 / sqrt((double)K);\n    sk.assign(M, vector<double>(K, prior_sk)); lb.assign(M, vector<int>(K, 0)); obs.resize(M);\n    et.assign(N, vector<double>(M));\n    for (int j = 0; j < M; j++) upd_et(j);\n    set<int> avail, idle;\n    for (int i = 0; i < N; i++) if (!task_pre[i]) avail.insert(i);\n    for (int j = 0; j < M; j++) idle.insert(j);\n    cur_day = 0;\n    while (true) {\n        cur_day++; calc_cp();\n        vector<int> av(avail.begin(), avail.end());\n        sort(av.begin(), av.end(), [](int a, int b){ return cp[a] > cp[b]; });\n        vector<pair<int,int>> asgn; set<int> id = idle;\n        for (int t : av) {\n            if (id.empty()) break;\n            int bw = -1; double bt = 1e18;\n            for (int j : id) if (et[t][j] < bt) { bt = et[t][j]; bw = j; }\n            asgn.push_back({bw, t}); id.erase(bw);\n        }\n        cout << asgn.size();\n        for (auto [w, t] : asgn) {\n            cout << ' ' << w+1 << ' ' << t+1;\n            task_w[t] = w; worker_t[w] = t; task_sd[t] = cur_day;\n            task_st[t] = 1; avail.erase(t); idle.erase(w);\n        }\n        cout << '\\n'; cout.flush();\n        int nc; cin >> nc;\n        if (nc == -1) break;\n        for (int i = 0; i < nc; i++) {\n            int w; cin >> w; w--;\n            int t = worker_t[w], tk = cur_day - task_sd[t] + 1;\n            obs[w].push_back({t, tk});\n            if (tk == 1) for (int k = 0; k < K; k++) lb[w][k] = max(lb[w][k], d[t][k]);\n            refit(w);\n            task_st[t] = 2; task_w[t] = -1; worker_t[w] = -1; idle.insert(w);\n            for (int v : succs[t]) if (!--task_pre[v]) avail.insert(v);\n        }\n    }\n}","ahc006":"#include <bits/stdc++.h>\nusing namespace std;\nconst int OX=400,OY=400,TOT=1000,K=50,NN=2*K+1;\nint A[TOT],B[TOT],C[TOT],D[TOT],sel[K],NX[NN],NY[NN];\nint md(int x1,int y1,int x2,int y2){return abs(x1-x2)+abs(y1-y2);}\nint ec(int u,int v){return md(NX[u],NY[u],NX[v],NY[v]);}\nvoid refresh(){NX[0]=OX;NY[0]=OY;for(int i=0;i<K;i++){NX[i+1]=A[sel[i]];NY[i+1]=B[sel[i]];NX[K+i+1]=C[sel[i]];NY[K+i+1]=D[sel[i]];}}\nint tcost(const vector<int>&r){int s=0;for(int i=0;i+1<(int)r.size();i++)s+=ec(r[i],r[i+1]);return s;}\nbool feasible(const vector<int>&r){bool p[K+1]={};for(int v:r){if(v>=1&&v<=K)p[v]=true;else if(v>K&&!p[v-K])return false;}return true;}\nvector<int> build_nn(){bool vis[NN]={},has[K+1]={};vector<int> r={0};vis[0]=true;for(int s=0;s<2*K;s++){int cur=r.back(),bv=-1,bd=INT_MAX;for(int v=1;v<NN;v++){if(vis[v]||(v>K&&!has[v-K]))continue;int dd=ec(cur,v);if(dd<bd){bd=dd;bv=v;}}r.push_back(bv);vis[bv]=true;if(bv<=K)has[bv]=true;}r.push_back(0);return r;}\nbool two_opt_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++)for(int j=i+1;j<n-1;j++)if(ec(r[i-1],r[j])+ec(r[i],r[j+1])<ec(r[i-1],r[i])+ec(r[j],r[j+1])){reverse(r.begin()+i,r.begin()+j+1);if(feasible(r))any=true;else reverse(r.begin()+i,r.begin()+j+1);}return any;}\nbool or1_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-1;i++){int v=r[i];int rem=ec(r[i-1],v)+ec(v,r[i+1])-ec(r[i-1],r[i+1]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i)continue;int ins=ec(r[j],v)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i)nr.push_back(r[k]);nr.insert(nr.begin()+((bj<i)?bj+1:bj),v);if(feasible(nr)){r=nr;any=true;}}return any;}\nbool or2_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++){int u=r[i],v=r[i+1];int rem=ec(r[i-1],u)+ec(v,r[i+2])-ec(r[i-1],r[i+2]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i||j==i+1)continue;int ins=ec(r[j],u)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i&&k!=i+1)nr.push_back(r[k]);int pos=(bj<i)?bj+1:bj-1;nr.insert(nr.begin()+pos,u);nr.insert(nr.begin()+pos+1,v);if(feasible(nr)){r=nr;any=true;}}return any;}\nvoid full_search(vector<int>&r){for(;;){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvoid quick_search(vector<int>&r,int it=5){for(int i=0;i<it;i++){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvector<int> build_perturbed(const vector<int>&base,int si){int pi=si+1,di=K+si+1;vector<int> r;r.reserve(base.size()-2);for(int v:base)if(v!=pi&&v!=di)r.push_back(v);int n=r.size();int bc=INT_MAX,bp=0,bd2=1;for(int p=0;p<n-1;p++){int cp=md(NX[r[p]],NY[r[p]],NX[pi],NY[pi])+md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]])-md(NX[r[p]],NY[r[p]],NX[r[p+1]],NY[r[p+1]]);{int cd=md(NX[pi],NY[pi],NX[di],NY[di])+md(NX[di],NY[di],NX[r[p+1]],NY[r[p+1]])-md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=p+1;}}for(int d=p+2;d<n;d++){int cd=md(NX[r[d-1]],NY[r[d-1]],NX[di],NY[di])+md(NX[di],NY[di],NX[r[d]],NY[r[d]])-md(NX[r[d-1]],NY[r[d-1]],NX[r[d]],NY[r[d]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=d;}}}vector<int> res=r;res.insert(res.begin()+bp+1,pi);res.insert(res.begin()+bd2+1,di);return res;}\nvector<int> double_bridge(const vector<int>&r,mt19937&rng){int n=r.size();if(n<8)return r;int pos[4];do{for(int i=0;i<4;i++)pos[i]=1+rng()%(n-2);}while(pos[0]==pos[1]||pos[0]==pos[2]||pos[0]==pos[3]||pos[1]==pos[2]||pos[1]==pos[3]||pos[2]==pos[3]);sort(pos,pos+4);int a=pos[0],b=pos[1],c=pos[2],d=pos[3];vector<int> nr;nr.reserve(n);for(int i=0;i<a;i++)nr.push_back(r[i]);for(int i=c;i<d;i++)nr.push_back(r[i]);for(int i=b;i<c;i++)nr.push_back(r[i]);for(int i=a;i<b;i++)nr.push_back(r[i]);for(int i=d;i<n;i++)nr.push_back(r[i]);return nr;}\nvoid emit(const vector<int>&r){cout<<K;for(int i=0;i<K;i++)cout<<\" \"<<(sel[i]+1);cout<<\"\\n\"<<r.size();for(int v:r)cout<<\" \"<<NX[v]<<\" \"<<NY[v];cout<<\"\\n\";cout.flush();}\nusing Clk=chrono::steady_clock;Clk::time_point T0;double esec(){return chrono::duration<double>(Clk::now()-T0).count();}\nint bcost=INT_MAX;vector<int> broute;int bsel[K];bool inS[TOT]={};\nvoid trysel(){refresh();auto r=build_nn();full_search(r);int c=tcost(r);if(c<bcost){bcost=c;broute=r;copy(sel,sel+K,bsel);}}\nbool greedy_step(){int n=broute.size();vector<int> pos(NN,-1);for(int i=0;i<n;i++)pos[broute[i]]=i;vector<int> rem(K);for(int i=0;i<K;i++){int pi=i+1,di=K+i+1,pp=pos[pi],dp=pos[di];rem[i]=ec(broute[pp-1],pi)+ec(pi,broute[pp+1])-ec(broute[pp-1],broute[pp+1])+ec(broute[dp-1],di)+ec(di,broute[dp+1])-ec(broute[dp-1],broute[dp+1]);}\nvector<tuple<int,int,int>> cands;for(int j=0;j<TOT;j++){if(inS[j])continue;int px=A[j],py=B[j],dx=C[j],dy=D[j];int ins=INT_MAX;for(int p=0;p<n-1;p++){int c=md(NX[broute[p]],NY[broute[p]],px,py)+md(px,py,dx,dy)+md(dx,dy,NX[broute[p+1]],NY[broute[p+1]])-ec(broute[p],broute[p+1]);if(c<ins)ins=c;}for(int si=0;si<K;si++){int g=rem[si]-ins;if(g>0)cands.emplace_back(g,si,j);}}\nif(cands.empty())return false;int tk=min(10,(int)cands.size());partial_sort(cands.begin(),cands.begin()+tk,cands.end(),greater<tuple<int,int,int>>());for(int ci=0;ci<tk;ci++){auto&[g,si,j]=cands[ci];if(inS[j])continue;int old=sel[si];sel[si]=j;refresh();auto nr=build_perturbed(broute,si);quick_search(nr,10);int nc=tcost(nr);if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[j]=true;inS[old]=false;return true;}sel[si]=old;refresh();}return false;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);T0=Clk::now();\n    for(int i=0;i<TOT;i++)cin>>A[i]>>B[i]>>C[i]>>D[i];\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(A[i],B[i],C[i],D[i])+md(C[i],D[i],OX,OY),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(OX,OY,C[i],D[i]),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={max(md(OX,OY,A[i],B[i]),md(OX,OY,C[i],D[i])),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    copy(bsel,bsel+K,sel);refresh();memset(inS,false,sizeof(inS));for(int i=0;i<K;i++)inS[sel[i]]=true;\n    emit(broute);\n    while(esec()<0.5)if(!greedy_step())break;\n    mt19937 rng(42);\n    while(esec()<1.80){\n        copy(bsel,bsel+K,sel);refresh();\n        if(rng()%4!=0){\n            auto nr=double_bridge(broute,rng);\n            if(!feasible(nr))continue;\n            full_search(nr);int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;}\n        }else{\n            int si=rng()%K,no;do{no=rng()%TOT;}while(inS[no]);\n            int oo=sel[si];sel[si]=no;refresh();\n            auto nr=build_perturbed(broute,si);quick_search(nr,5);\n            int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[no]=true;inS[oo]=false;}\n        }\n    }\n    copy(bsel,bsel+K,sel);refresh();\n    for(;;){if(esec()>1.95)break;bool a=two_opt_pass(broute),b=or1_pass(broute),c=or2_pass(broute);if(!a&&!b&&!c)break;}\n    emit(broute);\n    return 0;\n}","ahc007":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N = 400, M = 1995;\nint px[N], py[N];\nint eu[M], ev[M];\nlong long ed[M];\nstruct UF {\n    int p[N], r[N];\n    void init() { for(int i=0;i<N;i++) p[i]=i, r[i]=0; }\n    int find(int x) { while(p[x]!=x) x=p[x]=p[p[x]]; return x; }\n    bool same(int x, int y) { return find(x)==find(y); }\n    void unite(int x, int y) {\n        x=find(x); y=find(y); if(x==y) return;\n        if(r[x]<r[y]) swap(x,y); p[y]=x; if(r[x]==r[y]) r[x]++;\n    }\n    int ncomp() { int c=0; for(int i=0;i<N;i++) if(find(i)==i) c++; return c; }\n} uf;\nint main(){\n    ios::sync_with_stdio(false); cin.tie(nullptr);\n    for(int i=0;i<N;i++) cin>>px[i]>>py[i];\n    for(int i=0;i<M;i++){\n        cin>>eu[i]>>ev[i];\n        double dx=px[eu[i]]-px[ev[i]], dy=py[eu[i]]-py[ev[i]];\n        ed[i]=llround(sqrt(dx*dx+dy*dy));\n    }\n    uf.init();\n    for(int i=0;i<M;i++){\n        long long l; cin>>l;\n        if(uf.same(eu[i],ev[i])){ cout<<0<<endl; continue; }\n        { UF tmp=uf; for(int j=i+1;j<M;j++) tmp.unite(eu[j],ev[j]);\n          if(tmp.ncomp()>1){ cout<<1<<endl; uf.unite(eu[i],ev[i]); continue; } }\n        int cu=uf.find(eu[i]), cv=uf.find(ev[i]);\n        int k=0; long long min_d=LLONG_MAX;\n        for(int j=i+1;j<M;j++){\n            int fu=uf.find(eu[j]), fv=uf.find(ev[j]);\n            if((fu==cu&&fv==cv)||(fu==cv&&fv==cu)){ k++; min_d=min(min_d,ed[j]); }\n        }\n        double threshold;\n        if(k>0){ threshold=(double)min_d*(1.0+2.0/(k+1.0)); }\n        else {\n            int comp_id[N]; fill(comp_id,comp_id+N,-1); int nc=0;\n            for(int v=0;v<N;v++){ int rv=uf.find(v); if(comp_id[rv]==-1) comp_id[rv]=nc++; }\n            vector<vector<pair<int,double>>> cadj(nc);\n            for(int j=i+1;j<M;j++){\n                int fu=uf.find(eu[j]), fv=uf.find(ev[j]);\n                if(fu!=fv){ int idu=comp_id[fu],idv=comp_id[fv]; double w=2.0*ed[j];\n                    cadj[idu].push_back({idv,w}); cadj[idv].push_back({idu,w}); }\n            }\n            int src=comp_id[cu], dst=comp_id[cv];\n            vector<double> dist(nc,1e18);\n            priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>> pq;\n            dist[src]=0; pq.push({0.0,src});\n            while(!pq.empty()){\n                auto [dv,u]=pq.top(); pq.pop();\n                if(dv>dist[u]+1e-9) continue; if(u==dst) break;\n                for(auto [v,w]:cadj[u]){ double nd=dist[u]+w; if(nd<dist[v]){ dist[v]=nd; pq.push({nd,v}); } }\n            }\n            threshold=(dist[dst]>1e17)?2.0*ed[i]:dist[dst];\n        }\n        if((double)l<=threshold){ cout<<1<<endl; uf.unite(eu[i],ev[i]); }\n        else { cout<<0<<endl; }\n    }\n    return 0;\n}","ahc008":"#include <bits/stdc++.h>\nusing namespace std;\nconst int G=30;\nint N,M,px[20],py[20],hx[10],hy[10];\nbool wall[G+2][G+2];\nint spx[20],spy[20],shx[10],shy[10];\nconst int ddx[]={-1,1,0,0},ddy[]={0,0,-1,1};\nconst char DIRS[]=\"UDLR\",WDIRS[]=\"udlr\";\nbool inb(int x,int y){return x>=1&&x<=G&&y>=1&&y<=G;}\nint dbuf[G+2][G+2];\nvoid bfs(int tx,int ty){\n    for(int i=0;i<=G+1;i++)fill(dbuf[i],dbuf[i]+G+2,-1);\n    dbuf[tx][ty]=0;queue<pair<int,int>>q;q.push({tx,ty});\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int d=0;d<4;d++){int nx=x+ddx[d],ny=y+ddy[d];if(!inb(nx,ny)||wall[nx][ny]||dbuf[nx][ny]!=-1)continue;dbuf[nx][ny]=dbuf[x][y]+1;q.push({nx,ny});}}\n}\nchar gmv(int sx,int sy,int tx,int ty){\n    if(sx==tx&&sy==ty)return '.';bfs(tx,ty);if(dbuf[sx][sy]==-1)return '.';\n    for(int d=0;d<4;d++){int nx=sx+ddx[d],ny=sy+ddy[d];if(!inb(nx,ny)||wall[nx][ny])continue;if(dbuf[nx][ny]==dbuf[sx][sy]-1)return DIRS[d];}return '.';\n}\nbool cpl(int wx,int wy){\n    if(!inb(wx,wy)||wall[wx][wy])return false;\n    for(int i=0;i<N;i++)if(spx[i]==wx&&spy[i]==wy)return false;\n    for(int i=0;i<M;i++)if(shx[i]==wx&&shy[i]==wy)return false;\n    for(int d=0;d<4;d++){int ax=wx+ddx[d],ay=wy+ddy[d];for(int i=0;i<N;i++)if(spx[i]==ax&&spy[i]==ay)return false;}\n    return true;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);memset(wall,false,sizeof(wall));\n    cin>>N;for(int i=0;i<N;i++){int t;cin>>px[i]>>py[i]>>t;}cin>>M;for(int i=0;i<M;i++)cin>>hx[i]>>hy[i];\n    double bv=-1e18;int wt=0,wp=16;bool hp=true;\n    auto ch_cnt=[&](int wtype,int wpos,bool hpos)->int{int c=0;for(int i=0;i<M;i++){bool ok=wtype==0?(hpos?hy[i]<wpos:hy[i]>=wpos):(hpos?hx[i]<wpos:hx[i]>=wpos);if(ok)c++;}return c;};\n    auto ev=[&](int area,int pets,int wtype,int wpos,bool hpos)->double{return (double)area/900.0*pow(2.0,-(double)pets)*(0.7+0.3*ch_cnt(wtype,wpos,hpos)/M);};\n    for(int c=2;c<=G;c++){int lp=0,rp=0;for(int i=0;i<N;i++){if(py[i]<c)lp++;else rp++;}double vl=ev((c-1)*G,lp,0,c,true),vr=ev((G-c+1)*G,rp,0,c,false);if(vl>bv){bv=vl;wt=0;wp=c;hp=true;}if(vr>bv){bv=vr;wt=0;wp=c;hp=false;}}\n    for(int r=2;r<=G;r++){int tp=0,bp=0;for(int i=0;i<N;i++){if(px[i]<r)tp++;else bp++;}double vt=ev((r-1)*G,tp,1,r,true),vb=ev((G-r+1)*G,bp,1,r,false);if(vt>bv){bv=vt;wt=1;wp=r;hp=true;}if(vb>bv){bv=vb;wt=1;wp=r;hp=false;}}\n    struct Task{int wx,wy,sx,sy,wd;};vector<Task> tasks(G);\n    if(wt==0){if(hp)for(int r=1;r<=G;r++)tasks[r-1]={r,wp,r,wp-1,3};else for(int r=1;r<=G;r++)tasks[r-1]={r,wp-1,r,wp,2};}\n    else{if(hp)for(int c=1;c<=G;c++)tasks[c-1]={wp,c,wp-1,c,1};else for(int c=1;c<=G;c++)tasks[c-1]={wp-1,c,wp,c,0};}\n    vector<int> hord(M);iota(hord.begin(),hord.end(),0);\n    if(wt==0)sort(hord.begin(),hord.end(),[&](int a,int b){return hx[a]<hx[b];});else sort(hord.begin(),hord.end(),[&](int a,int b){return hy[a]<hy[b];});\n    vector<int> te(M),ct(M);for(int i=0;i<M;i++){int h=hord[i];ct[h]=i*G/M;te[h]=(i+1)*G/M;}\n    auto ons=[&](int h)->bool{return wt==0?(hp?hy[h]<wp:hy[h]>=wp):(hp?hx[h]<wp:hx[h]>=wp);};\n    for(int turn=0;turn<300;turn++){\n        for(int i=0;i<N;i++){spx[i]=px[i];spy[i]=py[i];}for(int i=0;i<M;i++){shx[i]=hx[i];shy[i]=hy[i];}\n        bool all_safe=true;for(int h=0;h<M;h++)if(!ons(h)){all_safe=false;break;}\n        string acts(M,'.');set<pair<int,int>> pw;vector<bool> isp(M,false);\n        // PASS 1: Wall placements first\n        for(int h=0;h<M;h++){\n            while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n            if(ct[h]>=te[h])continue;\n            Task&t=tasks[ct[h]];bool ig=(ct[h]==G-1)&&!all_safe;\n            if(hx[h]==t.sx&&hy[h]==t.sy&&!ig&&cpl(t.wx,t.wy)&&!pw.count({t.wx,t.wy})){\n                acts[h]=WDIRS[t.wd];pw.insert({t.wx,t.wy});wall[t.wx][t.wy]=true;ct[h]++;isp[h]=true;\n            }\n        }\n        // PASS 2: Movements using updated wall state\n        for(int h=0;h<M;h++){\n            if(isp[h])continue;\n            while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n            if(ct[h]>=te[h]){acts[h]='.';continue;}\n            Task&t=tasks[ct[h]];\n            if(hx[h]==t.sx&&hy[h]==t.sy){acts[h]='.';continue;}\n            char mv=gmv(hx[h],hy[h],t.sx,t.sy);\n            acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}\n        }\n        cout<<acts<<\"\\n\";cout.flush();\n        for(int i=0;i<N;i++){string s;cin>>s;for(char c:s){if(c=='U')px[i]--;else if(c=='D')px[i]++;else if(c=='L')py[i]--;else if(c=='R')py[i]++;}}\n    }\n}","ahc009":"#include <bits/stdc++.h>\nusing namespace std;\nint si,sj,ti,tj; double pf;\nbool H[20][19],V[19][20];\nint nb[400][4],G;\nvoid initNb(){for(int i=0;i<20;i++)for(int j=0;j<20;j++){int c=i*20+j;nb[c][0]=(i>0&&!V[i-1][j])?(i-1)*20+j:c;nb[c][1]=(i<19&&!V[i][j])?(i+1)*20+j:c;nb[c][2]=(j>0&&!H[i][j-1])?i*20+(j-1):c;nb[c][3]=(j<19&&!H[i][j])?i*20+(j+1):c;}}\nint dc(char c){return c=='U'?0:c=='D'?1:c=='L'?2:3;}\ndouble PP[201][400],PE[201];\nvoid buildP(const string&s,int fr){for(int t=fr;t<200;t++){int d=dc(s[t]);double*a=PP[t],*b=PP[t+1];memset(b,0,3200);for(int k=0;k<400;k++){double v=a[k];if(v<1e-15)continue;b[k]+=v*pf;b[nb[k][d]]+=v*(1-pf);}double e=b[G]*(401.-(t+1));b[G]=0;PE[t+1]=PE[t]+e;}}\ndouble evalF(const string&s,int fr){double p[400],q[400];memcpy(p,PP[fr],3200);double E=PE[fr];for(int t=fr;t<200;t++){int d=dc(s[t]);memset(q,0,3200);for(int k=0;k<400;k++){double v=p[k];if(v<1e-15)continue;q[k]+=v*pf;q[nb[k][d]]+=v*(1-pf);}E+=q[G]*(401.-(t+1));q[G]=0;memcpy(p,q,3200);}return E;}\nvoid setP(const string&s){memset(PP[0],0,3200);PP[0][si*20+sj]=1;PE[0]=0;buildP(s,0);}\nchrono::time_point<chrono::steady_clock>T0;\ndouble el(){return chrono::duration<double>(chrono::steady_clock::now()-T0).count();}\ndouble hc(string&s,double E0,double tl){double be=E0;for(;;){if(el()>tl)break;bool imp=false;for(int t=0;t<200;t++){int od=dc(s[t]);for(int d=0;d<4;d++){if(d==od)continue;s[t]=\"UDLR\"[d];double e=evalF(s,t);if(e>be+1e-12){be=e;od=d;buildP(s,t);imp=true;}else s[t]=\"UDLR\"[od];}}if(!imp)break;}return be;}\nstring bfsPath(){int ds[400];fill(ds,ds+400,-1);int pr[400],pd[400];int src=si*20+sj;queue<int>q;q.push(src);ds[src]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||ds[nk]!=-1)continue;ds[nk]=ds[k]+1;pr[nk]=k;pd[nk]=d;q.push(nk);}}string r;for(int c=G;c!=src;c=pr[c])r+=\"UDLR\"[pd[c]];reverse(r.begin(),r.end());return r;}\nstring greedyPath(){int bd[400];fill(bd,bd+400,-1);queue<int>q;q.push(G);bd[G]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||bd[nk]!=-1)continue;bd[nk]=bd[k]+1;q.push(nk);}}double p[400]={},np[400];p[si*20+sj]=1;string s(200,'D');for(int t=0;t<200;t++){double bst=-1e18;int bd2=0;for(int d=0;d<4;d++){double g=0;for(int k=0;k<400;k++){if(p[k]<1e-15)continue;g+=p[k]*(1-pf)*(bd[k]-bd[nb[k][d]]);}if(g>bst){bst=g;bd2=d;}}s[t]=\"UDLR\"[bd2];memset(np,0,3200);for(int k=0;k<400;k++){if(p[k]<1e-15)continue;np[k]+=p[k]*pf;np[nb[k][bd2]]+=p[k]*(1-pf);}np[G]=0;memcpy(p,np,3200);}return s;}\nint main(){\n    ios::sync_with_stdio(0);cin.tie(0);\n    cin>>si>>sj>>ti>>tj>>pf;\n    for(int i=0;i<20;i++){string r;cin>>r;for(int j=0;j<19;j++)H[i][j]=(r[j]=='1');}\n    for(int i=0;i<19;i++){string r;cin>>r;for(int j=0;j<20;j++)V[i][j]=(r[j]=='1');}\n    initNb();G=ti*20+tj;T0=chrono::steady_clock::now();\n    string path=bfsPath();int K=(int)path.size();\n    string s1(200,'D');for(int i=0;i<200;i++)s1[i]=path[i%K];\n    string s2=greedyPath();\n    setP(s1);double e1=hc(s1,PE[200],0.2);\n    setP(s2);double e2=hc(s2,PE[200],0.4);\n    string gb=(e1>=e2)?s1:s2;double gbE=max(e1,e2);\n    setP(gb);\n    mt19937 rng(42);uniform_real_distribution<double>ud(0,1);\n    {\n        string sc=gb;double scE=gbE;double T=2.0;int stp=0;double sa0=el();\n        while(el()<1.2){\n            int t=rng()%200,od=dc(sc[t]),nd=(od+1+(int)(rng()%3))%4;\n            sc[t]=\"UDLR\"[nd];double e=evalF(sc,t),dlt=e-scE;\n            if(dlt>0||ud(rng)<exp(dlt/T)){scE=e;buildP(sc,t);if(e>gbE){gbE=e;gb=sc;}}\n            else sc[t]=\"UDLR\"[od];\n            if(++stp%500==0){double f=min(1.,max(0.,(el()-sa0)/(1.2-sa0)));T=2.*exp(-7.*f);if(scE<gbE-20.){sc=gb;scE=gbE;setP(sc);}}\n        }\n    }\n    setP(gb);\n    while(el()<1.85){\n        string p2=gb;int st=rng()%3;\n        if(st==0){int M=5+(int)(rng()%21);for(int i=0;i<M;i++){int t=rng()%200;p2[t]=\"UDLR\"[(dc(p2[t])+1+(int)(rng()%3))%4];}}\n        else if(st==1){int ts=(int)(rng()%200),sl=10+(int)(rng()%41);for(int i=ts;i<min(200,ts+sl);i++)p2[i]=\"UDLR\"[rng()%4];}\n        else{int ts=(int)(rng()%200),sl=10+(int)(rng()%41),po=rng()%K;for(int i=ts;i<min(200,ts+sl);i++)p2[i]=path[(po+(i-ts))%K];}\n        setP(p2);double e=hc(p2,PE[200],1.85);\n        if(e>gbE+1e-12){gbE=e;gb=p2;}\n    }\n    cout<<gb<<\"\\n\";\n}","ahc010":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N = 30, TOTAL = N * N * 4;\nconst int to_t[8][4] = {\n    {1,0,-1,-1},{3,-1,-1,0},{-1,-1,3,2},{-1,2,1,-1},\n    {1,0,3,2},{3,2,1,0},{2,-1,0,-1},{-1,3,-1,1}};\nconst int di[4]={0,-1,0,1}, dj[4]={-1,0,1,0};\nint tiles[N][N], init_t[N][N], rots[N][N], best_rots[N][N];\ninline int apply_rot(int t,int r){\n    if(t<=3)return(t+r)&3;\n    if(t<=5)return 4+((t-4+r)&1);\n    return 6+((t-6+r)&1);}\nint nxt[TOTAL]; uint8_t col[TOTAL];\ninline void update_nxt(int i,int j){\n    int base=(i*N+j)*4, t=tiles[i][j];\n    for(int d=0;d<4;d++){\n        int d2=to_t[t][d];\n        if(d2<0){nxt[base+d]=-1;continue;}\n        int ni=i+di[d2],nj=j+dj[d2];\n        if((unsigned)ni>=N||(unsigned)nj>=N){nxt[base+d]=-1;continue;}\n        nxt[base+d]=(ni*N+nj)*4+((d2+2)&3);}}\nlong long evaluate(){\n    memset(col,0,TOTAL); int t1=0,t2=0;\n    for(int s=0;s<TOTAL;s++){\n        if(col[s])continue;\n        int c=s;\n        while(c>=0&&!col[c]){col[c]=1;c=nxt[c];}\n        if(c>=0&&col[c]==1){\n            int len=0,cc=c;\n            do{cc=nxt[cc];len++;}while(cc!=c);\n            if(len>t1){t2=t1;t1=len;}else if(len>t2)t2=len;}\n        c=s;\n        while(c>=0&&col[c]==1){col[c]=2;c=nxt[c];}}\n    return(long long)t1*t2;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++){\n        string s;cin>>s;\n        for(int j=0;j<N;j++){\n            init_t[i][j]=s[j]-'0';tiles[i][j]=init_t[i][j];rots[i][j]=0;}}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n    long long cur=evaluate(),best=cur;\n    memcpy(best_rots,rots,sizeof(rots));\n    mt19937 rng(42);\n    const auto ts=chrono::steady_clock::now();\n    const double TL=1.85;\n    double elapsed=0; int cnt=0;\n    const double T0=10000.0,Tf=1.0,lnr=log(Tf/T0);\n    while(elapsed<TL){\n        if((cnt&255)==0)\n            elapsed=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n        cnt++;\n        double T=T0*exp(lnr*elapsed/TL);\n        int i=rng()%N,j=rng()%N;\n        int dr=(rng()%3)+1,nr=(rots[i][j]+dr)&3,ot=tiles[i][j];\n        tiles[i][j]=apply_rot(init_t[i][j],nr);\n        update_nxt(i,j);\n        long long ns=evaluate(),delta=ns-cur;\n        if(delta>=0||rng()/4294967296.0<exp((double)delta/T)){\n            rots[i][j]=nr;cur=ns;\n            if(ns>best){best=ns;memcpy(best_rots,rots,sizeof(rots));}}\n        else{tiles[i][j]=ot;update_nxt(i,j);}}\n    string out(N*N,'0');\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)out[i*N+j]='0'+best_rots[i][j];\n    cout<<out<<\"\\n\";return 0;}","ahc011":"#include <bits/stdc++.h>\nusing namespace std;\nint N,T,board[10][10],board_label[10][10],er,ec,tgt[10][10],avail[16];\nbool fixed_cells[10][10];\nstring out;\nvoid read_input(){cin>>N>>T;for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){char c=s[j];board[i][j]=(c>='0'&&c<='9')?c-'0':c-'a'+10;if(!board[i][j]){er=i;ec=j;}}}}\nbool valid_pos(int v,int i,int j){return!((v&1)&&!j)&&!((v&2)&&!i)&&!((v&4)&&j==N-1)&&!((v&8)&&i==N-1);}\nbool is_tree(){bool vis[10][10]={};int sr=-1,sc=0;for(int i=0;i<N&&sr<0;i++)for(int j=0;j<N;j++)if(tgt[i][j]>0){sr=i;sc=j;break;}if(sr<0)return false;queue<pair<int,int>>q;q.push({sr,sc});vis[sr][sc]=true;int cnt=1,ed=0;int dr[]={0,1,0,-1},dc[]={1,0,-1,0},cb[]={4,8,1,2},nb[]={1,2,4,8};while(!q.empty()){auto[r,c]=q.front();q.pop();for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=N||nc<0||nc>=N||tgt[nr][nc]<=0)continue;if((tgt[r][c]&cb[d])&&(tgt[nr][nc]&nb[d])){ed++;if(!vis[nr][nc]){vis[nr][nc]=true;cnt++;q.push({nr,nc});}}}}return cnt==N*N-1&&ed==2*(N*N-2);}\nbool find_target(int pos){if(pos==N*N)return is_tree();int i=pos/N,j=pos%N;if(i==N-1&&j==N-1){tgt[i][j]=0;return find_target(pos+1);}bool fl=(j>0),nl=fl&&(tgt[i][j-1]&4);bool fu=(i>0),nu=fu&&(tgt[i-1][j]&8);for(int v=1;v<=15;v++){if(!avail[v]||!valid_pos(v,i,j))continue;if(fl&&!!(v&1)!=nl)continue;if(fu&&!!(v&2)!=nu)continue;avail[v]--;tgt[i][j]=v;if(find_target(pos+1))return true;avail[v]++;}tgt[i][j]=-1;return false;}\nvoid init_labels(){vector<pair<int,int>>cp[16],tp[16];for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(board[i][j]>0)cp[board[i][j]].push_back({i,j});if(tgt[i][j]>0)tp[tgt[i][j]].push_back({i,j});}for(int v=1;v<=15;v++){sort(cp[v].begin(),cp[v].end());sort(tp[v].begin(),tp[v].end());for(int k=0;k<(int)cp[v].size();k++){auto[cr,cc]=cp[v][k];auto[tr,tc]=tp[v][k];board_label[cr][cc]=tr*N+tc;}}}\nbool check_solvable(){vector<int>s;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]>=0)s.push_back(board_label[i][j]);int inv=0;for(int a=0;a<(int)s.size();a++)for(int b=a+1;b<(int)s.size();b++)if(s[a]>s[b])inv++;if(N%2)return!(inv%2);return(inv+er)%2==1;}\nvoid fix_parity(){if(check_solvable())return;for(int v=1;v<=15;v++){vector<pair<int,int>>cp;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]==v)cp.push_back({i,j});if(cp.size()>=2){swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);if(check_solvable())return;swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);}}}\nvoid do_move(char m){int tr=er,tc=ec;if(m=='U')tr--;else if(m=='D')tr++;else if(m=='L')tc--;else tc++;board[er][ec]=board[tr][tc];board_label[er][ec]=board_label[tr][tc];board[tr][tc]=0;board_label[tr][tc]=-1;er=tr;ec=tc;out+=m;}\nbool move_empty(int gr,int gc){if(er==gr&&ec==gc)return true;if((int)out.size()>=T||fixed_cells[gr][gc])return false;int NN=N*N;vector<int>prv(NN,-2);int s=er*N+ec,g=gr*N+gc;prv[s]=-1;queue<int>q;q.push(s);int dr[]={-1,1,0,0},dcc[]={0,0,-1,1};while(!q.empty()){int cur=q.front();q.pop();if(cur==g)break;int r=cur/N,c=cur%N;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dcc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int nxt=nr*N+nc;if(prv[nxt]!=-2)continue;prv[nxt]=cur;q.push(nxt);}}if(prv[g]==-2)return false;vector<int>path;int cur=g;while(cur!=s){path.push_back(cur);cur=prv[cur];}reverse(path.begin(),path.end());for(int nxt:path){if((int)out.size()>=T)return false;int nr=nxt/N,nc=nxt%N;char m;if(nr==er-1)m='U';else if(nr==er+1)m='D';else if(nc==ec-1)m='L';else m='R';do_move(m);}return true;}\nbool bfs_tile(int&tr,int&tc,int dr,int dc){if(tr==dr&&tc==dc)return true;if((int)out.size()>=T)return false;int NN=N*N,t0=tr*N+tc,e0=er*N+ec,tg=dr*N+dc,tot=NN*NN;vector<int>prv(tot,-2);vector<char>mv(tot,0);prv[t0*NN+e0]=-1;queue<int>q;q.push(t0*NN+e0);int ddr[]={-1,1,0,0},ddc[]={0,0,-1,1};const char dch[]={'U','D','L','R'};int goal=-1;while(!q.empty()){int cur=q.front();q.pop();int ct=cur/NN,ce=cur%NN;if(ct==tg){goal=cur;break;}int er_=ce/N,ec_=ce%N;for(int d=0;d<4;d++){int nr=er_+ddr[d],nc=ec_+ddc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int np=nr*N+nc,nt=(np==ct)?ce:ct,ne=np;if(nt==ne)continue;int nst=nt*NN+ne;if(nst<0||nst>=tot||prv[nst]!=-2)continue;prv[nst]=cur;mv[nst]=dch[d];q.push(nst);}}if(goal<0){for(int e=0;e<NN&&goal<0;e++){if(e==tg||fixed_cells[e/N][e%N])continue;int s=tg*NN+e;if(s<tot&&prv[s]!=-2)goal=s;}}if(goal<0)return false;vector<char>path;int cur=goal;while(cur!=t0*NN+e0){path.push_back(mv[cur]);cur=prv[cur];}reverse(path.begin(),path.end());for(char m:path){if((int)out.size()>=T)return false;do_move(m);}tr=dr;tc=dc;return true;}\npair<int,int>find_lbl(int lbl){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]==lbl)return{i,j};return{-1,-1};}\nvoid solve_row(int row){if((int)out.size()>=T)return;for(int col=0;col<=N-3&&(int)out.size()<T;col++){auto[cr,cc]=find_lbl(row*N+col);if(cr<0)continue;if(cr==row&&cc==col){fixed_cells[row][col]=true;continue;}bfs_tile(cr,cc,row,col);fixed_cells[row][col]=true;}if((int)out.size()>=T)return;auto[ar,ac]=find_lbl(row*N+(N-2));auto[br,bc]=find_lbl(row*N+(N-1));if(ar<0||br<0)return;if(ar==row&&ac==N-2&&br==row&&bc==N-1){fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;return;}bfs_tile(ar,ac,row,N-1);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl(row*N+(N-1));if(br2<0)return;fixed_cells[row][N-1]=true;bfs_tile(br2,bc2,row+1,N-1);fixed_cells[row][N-1]=false;if((int)out.size()>=T)return;fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=true;move_empty(row,N-2);fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=false;if((int)out.size()<T&&er==row&&ec==N-2){do_move('R');if((int)out.size()<T)do_move('D');}fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;}\nvoid solve_col(int col){if((int)out.size()>=T)return;auto[ar,ac]=find_lbl((N-2)*N+col);auto[br,bc]=find_lbl((N-1)*N+col);if(ar<0||br<0)return;if(ar==N-2&&ac==col&&br==N-1&&bc==col){fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;return;}bfs_tile(ar,ac,N-1,col);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl((N-1)*N+col);if(br2<0)return;fixed_cells[N-1][col]=true;bfs_tile(br2,bc2,N-1,col+1);fixed_cells[N-1][col]=false;if((int)out.size()>=T)return;fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=true;move_empty(N-2,col);fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=false;if((int)out.size()<T&&er==N-2&&ec==col){do_move('D');if((int)out.size()<T)do_move('R');}fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;}\nvoid solve_2x2(){if((int)out.size()>=T)return;int p0=(N-2)*N+(N-2),p1=(N-2)*N+(N-1),p2=(N-1)*N+(N-2);int a=board_label[N-2][N-2],b=board_label[N-2][N-1],c=board_label[N-1][N-2],d=board_label[N-1][N-1];if(a==p0&&b==p1&&c==p2&&d==-1)return;auto el=[&](int l)->int{if(l==p0)return 0;if(l==p1)return 1;if(l==p2)return 2;return 3;};auto enc=[](int v0,int v1,int v2,int v3){return v0*64+v1*16+v2*4+v3;};int gs=enc(0,1,2,3),ss=enc(el(a),el(b),el(c),el(d));if(ss==gs)return;array<int,256>par;par.fill(-2);array<char,256>mfr;mfr.fill(0);queue<int>q;q.push(ss);par[ss]=-1;static const int adj[4][2]={{1,2},{0,3},{0,3},{1,2}};static const char amv[4][2]={{'R','D'},{'L','D'},{'U','R'},{'U','L'}};while(!q.empty()){int cur=q.front();q.pop();if(cur==gs)break;int v[4]={(cur>>6)&3,(cur>>4)&3,(cur>>2)&3,cur&3};int ep=-1;for(int p=0;p<4;p++)if(v[p]==3){ep=p;break;}if(ep<0)continue;for(int k=0;k<2;k++){int np=adj[ep][k];char m=amv[ep][k];int nv[4]={v[0],v[1],v[2],v[3]};nv[ep]=nv[np];nv[np]=3;int nst=enc(nv[0],nv[1],nv[2],nv[3]);if(par[nst]==-2){par[nst]=cur;mfr[nst]=m;q.push(nst);}}}if(par[gs]==-2)return;vector<char>path;int cur=gs;while(cur!=ss){path.push_back(mfr[cur]);cur=par[cur];}reverse(path.begin(),path.end());for(char m:path){if((int)out.size()>=T)break;do_move(m);}}\nvoid solve(){for(int row=0;row<=N-3&&(int)out.size()<T;row++)solve_row(row);for(int col=0;col<=N-3&&(int)out.size()<T;col++)solve_col(col);solve_2x2();}\nint main(){ios::sync_with_stdio(false);cin.tie(nullptr);read_input();memset(avail,0,sizeof(avail));for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]>0)avail[board[i][j]]++;memset(tgt,-1,sizeof(tgt));memset(fixed_cells,0,sizeof(fixed_cells));memset(board_label,-1,sizeof(board_label));if(!find_target(0)){cout<<\"\\n\";return 0;}init_labels();fix_parity();solve();cout<<out<<\"\\n\";return 0;}","ahc012":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef unsigned long long ull;\ntypedef pair<ull,ull> puu;\nstruct PH{size_t operator()(const puu&p)const{size_t h=hash<ull>()(p.first);h^=hash<ull>()(p.second)+0x9e3779b9ULL+(h<<6)+(h>>2);return h;}};\nmt19937 rng(42);\nint N,K,a[11],stx[5501],sty[5501];\nstruct Line{ll px,py,qx,qy;};\nconst int MK=100;\nLine cur_lines[MK],best_lines[MK];\nint8_t sgn_data[5501][MK];\null slo[5501],shi[5501];\nunordered_map<puu,int,PH>grps;\nint b_arr[12],cscore,best_score;\nstruct Change{int idx;puu old_sig,new_sig;int8_t new_sgn;};\nvector<Change>pending;\nvector<pair<puu,int>>dvec;\nll ecross(const Line&l,ll x,ll y){return(l.qx-l.px)*(y-l.py)-(l.qy-l.py)*(x-l.px);}\nvoid upd(int oc,int nc){if(oc>=1&&oc<=10){cscore-=min(a[oc],b_arr[oc]);b_arr[oc]--;cscore+=min(a[oc],b_arr[oc]);}if(nc>=1&&nc<=10){cscore-=min(a[nc],b_arr[nc]);b_arr[nc]++;cscore+=min(a[nc],b_arr[nc]);}}\nvoid build(){grps.clear();grps.reserve(32768);grps.max_load_factor(0.3f);memset(b_arr,0,sizeof(b_arr));cscore=0;for(int i=0;i<N;i++){slo[i]=shi[i]=0;for(int j=0;j<MK;j++){int8_t s=(ecross(cur_lines[j],stx[i],sty[i])>=0)?1:-1;sgn_data[i][j]=s;if(s==1){if(j<64)slo[i]|=(1ULL<<j);else shi[i]|=(1ULL<<(j-64));}}auto[it,ins]=grps.emplace(puu{slo[i],shi[i]},0);upd(it->second,it->second+1);it->second++;}}\nint try_ch(int j,const Line&nl){pending.clear();dvec.clear();for(int i=0;i<N;i++){int8_t ns=(ecross(nl,stx[i],sty[i])>=0)?1:-1;if(ns==sgn_data[i][j])continue;puu os{slo[i],shi[i]};ull nl2=slo[i],nh2=shi[i];if(j<64){if(ns==1)nl2|=(1ULL<<j);else nl2&=~(1ULL<<j);}else{if(ns==1)nh2|=(1ULL<<(j-64));else nh2&=~(1ULL<<(j-64));}puu nsig{nl2,nh2};pending.push_back({i,os,nsig,ns});dvec.push_back({os,-1});dvec.push_back({nsig,+1});}sort(dvec.begin(),dvec.end());int nb[12];memcpy(nb,b_arr,sizeof(nb));int nsc=cscore;for(int i=0;i<(int)dvec.size();){int j2=i,d=0;while(j2<(int)dvec.size()&&dvec[j2].first==dvec[i].first){d+=dvec[j2].second;j2++;}if(d){auto it=grps.find(dvec[i].first);int c=it!=grps.end()?it->second:0,nc=c+d;if(c>=1&&c<=10){nsc-=min(a[c],nb[c]);nb[c]--;nsc+=min(a[c],nb[c]);}if(nc>=1&&nc<=10){nsc-=min(a[nc],nb[nc]);nb[nc]++;nsc+=min(a[nc],nb[nc]);}}i=j2;}return nsc;}\nvoid do_ch(int j,const Line&nl){for(auto&ch:pending){{auto it=grps.find(ch.old_sig);upd(it->second,it->second-1);if(!--it->second)grps.erase(it);}slo[ch.idx]=ch.new_sig.first;shi[ch.idx]=ch.new_sig.second;sgn_data[ch.idx][j]=ch.new_sgn;{auto[it2,ins]=grps.emplace(ch.new_sig,0);upd(it2->second,it2->second+1);it2->second++;}}cur_lines[j]=nl;}\nLine rline(){double th=(rng()%314159)*(M_PI/314159.0);double r=(int)(rng()%18001)-9000;double cx=r*cos(th),cy=r*sin(th),sdx=-sin(th)*9000,sdy=cos(th)*9000;return{llround(cx+sdx),llround(cy+sdy),llround(cx-sdx),llround(cy-sdy)};}\nLine pline(const Line&l,int s){ll dx=(ll)(rng()%(2*s+1))-s,dy=(ll)(rng()%(2*s+1))-s;int t=rng()%3;if(t==0)return{l.px+dx,l.py+dy,l.qx,l.qy};if(t==1)return{l.px,l.py,l.qx+dx,l.qy+dy};return{l.px+dx,l.py+dy,l.qx-dx,l.qy-dy};}\nint main(){ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N>>K;for(int d=1;d<=10;d++)cin>>a[d];for(int i=0;i<N;i++)cin>>stx[i]>>sty[i];\nfor(int i=0;i<50;i++){ll y=llround(-9000.0+18000.0*i/49.0);cur_lines[i]={-10000,y,10000,y};}\nfor(int i=0;i<50;i++){ll x=llround(-9000.0+18000.0*i/49.0);cur_lines[50+i]={x,-10000,x,10000};}\nbuild();best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));pending.reserve(N+10);dvec.reserve(2*N+10);\nauto t0=chrono::steady_clock::now();double T=15.0;int iter=0;\nwhile(true){if(!(++iter&511)){double e=chrono::duration<double>(chrono::steady_clock::now()-t0).count();if(e>2.75)break;T=max(0.05,15.0*pow(0.05/15.0,e/2.75));}\nint j=rng()%MK;Line nl;int sel=rng()%100;\nif(sel<35)nl=pline(cur_lines[j],30);else if(sel<60)nl=pline(cur_lines[j],300);else if(sel<80)nl=pline(cur_lines[j],2000);else nl=rline();\nif(nl.px==nl.qx&&nl.py==nl.qy)continue;\nint ns=try_ch(j,nl);int ds=ns-cscore;bool acc=(ds>=0);\nif(!acc&&T>0.01)acc=((double)(rng()>>8)/(double)(1u<<24))<exp((double)ds/T);\nif(acc){do_ch(j,nl);if(cscore>best_score){best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));}}}\ncout<<MK<<\"\\n\";for(int j=0;j<MK;j++)cout<<best_lines[j].px<<\" \"<<best_lines[j].py<<\" \"<<best_lines[j].qx<<\" \"<<best_lines[j].qy<<\"\\n\";return 0;}","ahc014":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int MAXN = 65;\nint N, M;\nbool dots[MAXN][MAXN];\nbool h_seg[MAXN][MAXN], v_seg[MAXN][MAXN], d1_seg[MAXN][MAXN], d2_seg[MAXN][MAXN];\nbool inPQ[MAXN][MAXN];\n\nvector<int> row_dots[MAXN], col_dots[MAXN];\nvector<int> diag_dots[130], ad_dots[130];\n\nstruct Op { int x1,y1,x2,y2,x3,y3,x4,y4; };\nvector<Op> ops;\n\nint cc;\n\nvoid insertSorted(vector<int>& v, int x) {\n    v.insert(lower_bound(v.begin(),v.end(),x),x);\n}\nvoid addDot(int x, int y) {\n    dots[x][y]=true;\n    insertSorted(row_dots[y],x);\n    insertSorted(col_dots[x],y);\n    insertSorted(diag_dots[x-y+64],x);\n    insertSorted(ad_dots[x+y],x);\n}\n\nbool edgeClear(int x1,int y1,int x2,int y2) {\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)if(v_seg[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)if(h_seg[x][y1])return false;}\n    else{\n        int n=abs(x2-x1);\n        if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)if(d1_seg[xm+t][ym+t])return false;}\n        else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)if(d2_seg[xm+t][ymx-t])return false;}\n    }\n    return true;\n}\nbool edgeNoDots(int x1,int y1,int x2,int y2) {\n    if(x1==x2){for(int y=min(y1,y2)+1;y<max(y1,y2);y++)if(dots[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2)+1;x<max(x1,x2);x++)if(dots[x][y1])return false;}\n    else{int n=abs(x2-x1),dx=(x2>x1)?1:-1,dy=(y2>y1)?1:-1;for(int t=1;t<n;t++)if(dots[x1+t*dx][y1+t*dy])return false;}\n    return true;\n}\nvoid drawEdge(int x1,int y1,int x2,int y2) {\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)v_seg[x1][y]=true;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)h_seg[x][y1]=true;}\n    else{\n        int n=abs(x2-x1);\n        if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)d1_seg[xm+t][ym+t]=true;}\n        else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)d2_seg[xm+t][ymx-t]=true;}\n    }\n}\n\nbool checkAndDo(int nx,int ny,int x2,int y2,int x3,int y3,int x4,int y4) {\n    if(x2<0||x2>=N||y2<0||y2>=N||x3<0||x3>=N||y3<0||y3>=N||x4<0||x4>=N||y4<0||y4>=N)return false;\n    if(!dots[x2][y2]||!dots[x3][y3]||!dots[x4][y4])return false;\n    if(!edgeNoDots(nx,ny,x2,y2)||!edgeNoDots(x2,y2,x3,y3)||!edgeNoDots(x3,y3,x4,y4)||!edgeNoDots(x4,y4,nx,ny))return false;\n    if(!edgeClear(nx,ny,x2,y2)||!edgeClear(x2,y2,x3,y3)||!edgeClear(x3,y3,x4,y4)||!edgeClear(x4,y4,nx,ny))return false;\n    ops.push_back({nx,ny,x2,y2,x3,y3,x4,y4});\n    addDot(nx,ny);\n    drawEdge(nx,ny,x2,y2);drawEdge(x2,y2,x3,y3);drawEdge(x3,y3,x4,y4);drawEdge(x4,y4,nx,ny);\n    return true;\n}\n\nbool findAndPlace(int nx, int ny) {\n    if(dots[nx][ny])return false;\n    \n    // Gather all candidates (axis-parallel + 45-degree), sorted by perimeter\n    vector<tuple<int,int,int,int,int,int,int>> cands;\n    \n    // Axis-parallel\n    for(int x2:row_dots[ny]){\n        if(x2==nx)continue;\n        for(int y2:col_dots[nx]){\n            if(y2==ny||!dots[x2][y2])continue;\n            cands.emplace_back(abs(x2-nx)+abs(y2-ny),x2,ny,x2,y2,nx,y2);\n        }\n    }\n    // 45-degree\n    for(int xa:diag_dots[nx-ny+64]){\n        if(xa==nx)continue;\n        int a=xa-nx;\n        for(int xb:ad_dots[nx+ny]){\n            if(xb==nx)continue;\n            int b=xb-nx;\n            int x3=nx+a+b,y3=ny+a-b;\n            if(x3>=0&&x3<N&&y3>=0&&y3<N&&dots[x3][y3])\n                cands.emplace_back(abs(a)+abs(b),xa,ny+a,x3,y3,xb,ny-b);\n        }\n    }\n    sort(cands.begin(),cands.end());\n    for(auto&[p,x2,y2,x3,y3,x4,y4]:cands)\n        if(checkAndDo(nx,ny,x2,y2,x3,y3,x4,y4))return true;\n    return false;\n}\n\npriority_queue<pair<int,pair<int,int>>> work_pq;\n\nvoid addWork(int x,int y){\n    if(x<0||x>=N||y<0||y>=N||dots[x][y]||inPQ[x][y])return;\n    inPQ[x][y]=true;\n    work_pq.push({(x-cc)*(x-cc)+(y-cc)*(y-cc)+1,{x,y}});\n}\n\nvoid afterPlace(int x,int y){\n    // Row and column\n    for(int i=0;i<N;i++){addWork(i,y);addWork(x,i);}\n    // Both diagonals\n    for(int t=1;t<N;t++){\n        addWork(x+t,y+t);addWork(x-t,y-t);\n        addWork(x+t,y-t);addWork(x-t,y+t);\n    }\n    // P3-trigger for axis-parallel: (nx2,ny2) where (x,ny2) is P2 and (nx2,y) is P4\n    for(int ny2:col_dots[x])\n        for(int nx2:row_dots[y])\n            addWork(nx2,ny2);\n}\n\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>M;\n    for(int i=0;i<M;i++){int x,y;cin>>x>>y;addDot(x,y);}\n    cc=(N-1)/2;\n    \n    memset(inPQ,0,sizeof(inPQ));\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)addWork(x,y);\n    \n    auto t0=chrono::steady_clock::now();\n    auto elapsed=[&](){\n        return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();\n    };\n    \n    // Event-driven phase\n    while(!work_pq.empty()&&elapsed()<4000){\n        auto[w,pos]=work_pq.top();work_pq.pop();\n        auto[x,y]=pos;\n        inPQ[x][y]=false;\n        if(dots[x][y])continue;\n        if(findAndPlace(x,y))afterPlace(x,y);\n    }\n    \n    // Fallback: full scan passes to catch missed positions\n    {\n        vector<pair<int,pair<int,int>>> pts;\n        for(int x=0;x<N;x++)for(int y=0;y<N;y++)\n            if(!dots[x][y])pts.emplace_back((x-cc)*(x-cc)+(y-cc)*(y-cc)+1,make_pair(x,y));\n        sort(pts.rbegin(),pts.rend());\n        bool changed=true;\n        while(changed&&elapsed()<4400){\n            changed=false;\n            for(auto&[w,pos]:pts){\n                auto[x,y]=pos;\n                if(dots[x][y])continue;\n                if(findAndPlace(x,y)){\n                    changed=true;\n                    afterPlace(x,y);\n                    // Drain event queue\n                    while(!work_pq.empty()&&elapsed()<4400){\n                        auto[w2,pos2]=work_pq.top();work_pq.pop();\n                        auto[x2,y2]=pos2;\n                        inPQ[x2][y2]=false;\n                        if(dots[x2][y2])continue;\n                        if(findAndPlace(x2,y2))afterPlace(x2,y2);\n                    }\n                }\n            }\n        }\n    }\n    \n    cout<<ops.size()<<\"\\n\";\n    for(auto&op:ops)\n        cout<<op.x1<<' '<<op.y1<<' '<<op.x2<<' '<<op.y2<<' '\n            <<op.x3<<' '<<op.y3<<' '<<op.x4<<' '<<op.y4<<'\\n';\n    return 0;\n}","ahc015":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef array<array<int,10>,10> Grid;\n\nGrid applyTilt(Grid g, char dir) {\n    if (dir=='L') { for(int i=0;i<10;i++){int p=0;for(int j=0;j<10;j++)if(g[i][j])g[i][p++]=g[i][j];for(;p<10;p++)g[i][p]=0;} }\n    else if(dir=='R'){for(int i=0;i<10;i++){int p=9;for(int j=9;j>=0;j--)if(g[i][j])g[i][p--]=g[i][j];for(;p>=0;p--)g[i][p]=0;}}\n    else if(dir=='F'){for(int j=0;j<10;j++){int p=0;for(int i=0;i<10;i++)if(g[i][j])g[p++][j]=g[i][j];for(;p<10;p++)g[p][j]=0;}}\n    else{for(int j=0;j<10;j++){int p=9;for(int i=9;i>=0;i--)if(g[i][j])g[p--][j]=g[i][j];for(;p>=0;p--)g[p][j]=0;}}\n    return g;\n}\nlong long computeScore(const Grid& g){\n    bool vis[10][10]={};long long sum=0;int stk[100][2];\n    static const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\n    for(int si=0;si<10;si++)for(int sj=0;sj<10;sj++){\n        if(!g[si][sj]||vis[si][sj])continue;\n        int f=g[si][sj],sz=0,top=0;stk[top][0]=si;stk[top][1]=sj;top++;vis[si][sj]=true;\n        while(top>0){--top;int x=stk[top][0],y=stk[top][1];sz++;\n            for(int d=0;d<4;d++){int nx=x+dx[d],ny=y+dy[d];\n                if(nx>=0&&nx<10&&ny>=0&&ny<10&&!vis[nx][ny]&&g[nx][ny]==f){vis[nx][ny]=true;stk[top][0]=nx;stk[top][1]=ny;top++;}}}\n        sum+=(long long)sz*sz;}\n    return sum;\n}\nGrid placeCandy(Grid g,int p,int flav){int cnt=0;for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(!g[i][j]&&++cnt==p){g[i][j]=flav;return g;}return g;}\n\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int fl[100];for(int t=0;t<100;t++)cin>>fl[t];\n    Grid grid={};static const char dirs[]={'F','B','L','R'};\n    for(int t=0;t<100;t++){\n        int p;cin>>p;grid=placeCandy(grid,p,fl[t]);\n        char bestDir='F';\n        if(t<99){\n            long long best=-1;int nc=99-t;\n            for(char d1:dirs){\n                Grid g1=applyTilt(grid,d1);long long tot=0;\n                for(int p2=1;p2<=nc;p2++){\n                    Grid g2=placeCandy(g1,p2,fl[t+1]);long long mx=0;\n                    for(char d2:dirs){long long s=computeScore(applyTilt(g2,d2));if(s>mx)mx=s;}\n                    tot+=mx;}\n                if(tot>best){best=tot;bestDir=d1;}}\n        }\n        cout<<bestDir<<'\\n';cout.flush();grid=applyTilt(grid,bestDir);\n    }\n    return 0;\n}","ahc016":"#include <bits/stdc++.h>\n#include <Eigen/Dense>\nusing namespace std;\nusing namespace Eigen;\nint M, N;\ndouble eps;\nvector<double> getDeg(const string& s, int n) {\n    vector<int> d(n,0); int idx=0;\n    for(int i=0;i<n;i++) for(int j=i+1;j<n;j++,idx++) if(s[idx]=='1'){d[i]++;d[j]++;}\n    sort(d.begin(),d.end()); return {d.begin(),d.end()};\n}\nvector<double> getEig(const string& s, int n) {\n    MatrixXd A(n,n); A.setZero(); int idx=0;\n    for(int i=0;i<n;i++) for(int j=i+1;j<n;j++,idx++) if(s[idx]=='1') A(i,j)=A(j,i)=1.0;\n    SelfAdjointEigenSolver<MatrixXd> sol(A,EigenvaluesOnly);\n    vector<double> ev(n); for(int i=0;i<n;i++) ev[i]=sol.eigenvalues()(i); return ev;\n}\nstring makeG(int n, int m) {\n    int me=n*(n-1)/2; m=max(0,min(m,me)); string s(me,'0');\n    auto pos=[&](int a,int b)->int{if(a>b)swap(a,b);return a*(2*n-a-1)/2+(b-a-1);};\n    int cnt=0;\n    for(int d=1;d<n&&cnt<m;d++) for(int i=0;i<n&&cnt<m;i++){int j=(i+d)%n;if(i<j){s[pos(i,j)]='1';cnt++;}}\n    return s;\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    cin>>M>>eps;\n    N=4; while((long long)N*(N-1)/2<M&&N<100) N++;\n    if(eps>1e-9){\n        double need=9.0*(double)(M-1)*(M-1)*eps*(1.0-eps);\n        int N2=4; while((double)N2*(N2-1)/2<need&&N2<100) N2++; N=max(N,N2);\n    }\n    N=min(N,100); int ME=N*(N-1)/2;\n    vector<string> G(M);\n    for(int k=0;k<M;k++){int m=(int)round((double)k*ME/max(1,M-1)); G[k]=makeG(N,m);}\n    cout<<N<<\"\\n\"; for(auto&g:G) cout<<g<<\"\\n\"; cout<<flush;\n    bool useEig=(N<=40); int FD=N+(useEig?N:0);\n    vector<vector<double>> C(M,vector<double>(FD,0.0));\n    if(eps<1e-9){\n        for(int k=0;k<M;k++){\n            auto ds=getDeg(G[k],N); for(int i=0;i<N;i++) C[k][i]=ds[i];\n            if(useEig){auto es=getEig(G[k],N);for(int i=0;i<N;i++) C[k][N+i]=es[i];}\n        }\n    } else {\n        long long opPS=(long long)N*N+(useEig?(long long)N*N*N:0LL);\n        int NS=(int)(1e9/max(1LL,(long long)M*opPS)); NS=max(30,min(500,NS));\n        mt19937 rng(42); uniform_real_distribution<double> u(0.0,1.0);\n        for(int k=0;k<M;k++){\n            for(int s=0;s<NS;s++){\n                string t=G[k]; for(char&c:t) if(u(rng)<eps) c^=1;\n                auto ds=getDeg(t,N); for(int i=0;i<N;i++) C[k][i]+=ds[i];\n                if(useEig){auto es=getEig(t,N);for(int i=0;i<N;i++) C[k][N+i]+=es[i];}\n            }\n            for(int i=0;i<FD;i++) C[k][i]/=NS;\n        }\n    }\n    for(int q=0;q<100;q++){\n        string h; cin>>h;\n        vector<double> hf(FD); auto dh=getDeg(h,N); for(int i=0;i<N;i++) hf[i]=dh[i];\n        if(useEig){auto eh=getEig(h,N);for(int i=0;i<N;i++) hf[N+i]=eh[i];}\n        int best=0; double bestD=1e18;\n        for(int k=0;k<M;k++){\n            double d=0; for(int i=0;i<FD;i++){double dd=hf[i]-C[k][i];d+=dd*dd;}\n            if(d<bestD){bestD=d;best=k;}\n        }\n        cout<<best<<\"\\n\"<<flush;\n    }\n    return 0;\n}","ahc017":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef pair<ll,int> pli;\nconst ll INF=1e18;\nconst int MXN=1005,MXM=3005,MXD=35,MAXCP=10;\nint N,M,D,K,EU[MXM],EV[MXM];ll EW[MXM];\nvector<pair<int,int>> G[MXN];\nll gd[MXN][MXN];double imp[MXM];int aday[MXM];\ndouble ADJ[MXM][MXD];int cutD[MXM][MXD];\nvector<int> ladj[MXM],cpairs[MXM],dayE[MXD];int dpos[MXM];\nuint64_t rs=0xdeadbeef123ULL;\nuint64_t rng(){rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;}\nint ri(int n){return(int)(rng()%(unsigned)n);}\ndouble rd(){return(rng()>>11)*(1.0/(1ull<<53));}\nvoid dijk(int s){fill(gd[s]+1,gd[s]+N+1,INF);gd[s][s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[d,u]=pq.top();pq.pop();if(d>gd[s][u])continue;for(auto&[v,e]:G[u]){ll nd=d+EW[e];if(nd<gd[s][v]){gd[s][v]=nd;pq.push({nd,v});}}}}\nll dijkS(int s,int t,int sk){static ll d[MXN];fill(d+1,d+N+1,INF);d[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;if(u==t)return d[t];for(auto&[v,e]:G[u]){if(e==sk)continue;ll nd=dd+EW[e];if(nd<d[v]){d[v]=nd;pq.push({nd,v});}}}return d[t];}\nstruct BrFr{int u,pe,ix;};struct BrI{int e,sz;};\nint bdt[MXN],blv[MXN];vector<BrFr> bstk;\nvoid findBr(int sk,vector<BrI>&br){fill(bdt+1,bdt+N+1,-1);int tm=0;bstk.clear();if((int)bstk.capacity()<N+2)bstk.reserve(N+2);bdt[1]=blv[1]=tm++;bstk.push_back({1,-1,0});while(!bstk.empty()){BrFr&c=bstk.back();if(c.ix<(int)G[c.u].size()){auto[v,e]=G[c.u][c.ix++];if(e==sk||e==c.pe){}else if(bdt[v]<0){bdt[v]=blv[v]=tm++;bstk.push_back({v,e,0});}else blv[c.u]=min(blv[c.u],bdt[v]);}else{int u=c.u,pe=c.pe,sz=tm-bdt[u];bstk.pop_back();if(!bstk.empty()){BrFr&p=bstk.back();blv[p.u]=min(blv[p.u],blv[u]);if(blv[u]>bdt[p.u])br.push_back({pe,sz});}}}}\nbool cvis[MXN];int cq[MXN];\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);auto tst=chrono::steady_clock::now();\n    cin>>N>>M>>D>>K;for(int i=0;i<M;i++){cin>>EU[i]>>EV[i]>>EW[i];G[EU[i]].push_back({EV[i],i});G[EV[i]].push_back({EU[i],i});}\n    for(int i=1;i<=N;i++){int x,y;cin>>x>>y;}\n    for(int s=1;s<=N;s++)dijk(s);\n    {vector<int>par(N+1,-1),sv(N);vector<ll>sz(N+1,1);iota(sv.begin(),sv.end(),1);for(int s=1;s<=N;s++){fill(par.begin(),par.end(),-1);fill(sz.begin(),sz.end(),1LL);sort(sv.begin(),sv.end(),[s](int a,int b){return gd[s][a]<gd[s][b];});for(int v:sv){if(v==s)continue;for(auto&[u,e]:G[v])if(gd[s][u]+EW[e]==gd[s][v]){par[v]=e;break;}}for(int i=(int)sv.size()-1;i>=0;i--){int v=sv[i];if(par[v]<0)continue;int p=(EU[par[v]]==v)?EV[par[v]]:EU[par[v]];sz[p]+=sz[v];}for(int v:sv){if(par[v]<0)continue;imp[par[v]]+=(double)sz[v];}}}\n    for(int e=0;e<M;e++){ll dt=dijkS(EU[e],EV[e],e);imp[e]*=(dt<INF)?(double)(dt-EW[e]):0.0;}\n    {vector<BrI>br;for(int e=0;e<M;e++){for(int ep:{EU[e],EV[e]}){if((int)G[ep].size()==2){for(auto&[w,oe]:G[ep])if(oe!=e)cpairs[e].push_back(oe);}}sort(cpairs[e].begin(),cpairs[e].end());cpairs[e].erase(unique(cpairs[e].begin(),cpairs[e].end()),cpairs[e].end());br.clear();findBr(e,br);sort(br.begin(),br.end(),[](const BrI&a,const BrI&b){return min(a.sz,N-a.sz)>min(b.sz,N-b.sz);});for(auto&bi:br){if((int)cpairs[e].size()>=MAXCP)break;auto it=lower_bound(cpairs[e].begin(),cpairs[e].end(),bi.e);if(it==cpairs[e].end()||*it!=bi.e)cpairs[e].insert(it,bi.e);}}}\n    for(int u=1;u<=N;u++){int dg=G[u].size();for(int i=0;i<dg;i++)for(int j=i+1;j<dg;j++){int e1=G[u][i].second,e2=G[u][j].second;ladj[e1].push_back(e2);ladj[e2].push_back(e1);}}\n    for(int e=0;e<M;e++){sort(ladj[e].begin(),ladj[e].end());ladj[e].erase(unique(ladj[e].begin(),ladj[e].end()),ladj[e].end());}\n    auto isAdj=[](int a,int b){return binary_search(ladj[a].begin(),ladj[a].end(),b);};\n    auto isCut=[](int a,int b){return binary_search(cpairs[a].begin(),cpairs[a].end(),b);};\n    fill(aday,aday+M,-1);int dc[MXD]={};\n    {vector<int>eo(M);iota(eo.begin(),eo.end(),0);sort(eo.begin(),eo.end(),[](int a,int b){return imp[a]>imp[b];});for(int e:eo){int best=-1;double bs=1e18;int bc=INT_MAX;for(int d=0;d<D;d++){if(dc[d]>=K)continue;int cuts=0;for(int f:cpairs[e])if(aday[f]==d)cuts++;double cf=0;for(int e2:ladj[e])if(aday[e2]==d)cf+=imp[e2];double sc=cf+1e-12*dc[d];if(cuts<bc||(cuts==bc&&sc<bs)){bc=cuts;bs=sc;best=d;}}if(best<0)best=0;aday[e]=best;dc[best]++;}}\n    memset(cutD,0,sizeof(cutD));for(int e=0;e<M;e++)for(int f:cpairs[e])cutD[e][aday[f]]++;\n    memset(ADJ,0,sizeof(ADJ));for(int e=0;e<M;e++)for(int e2:ladj[e])ADJ[e][aday[e2]]+=imp[e2];\n    for(int e=0;e<M;e++){dpos[e]=dayE[aday[e]].size();dayE[aday[e]].push_back(e);}\n    const double BIG=1e30;double T=1.0;\n    {double sm=0;int c=0;for(int tr=0;tr<100000&&c<3000;tr++){int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];if(dlc>0)continue;double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];sm+=fabs(dl);c++;}if(c>0)T=sm/c;if(T<1e-9)T=1.0;}\n    double T0=T;\n    for(long long step=0;;step++){\n        if(step%200000==0){double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>5.3)break;T=T0*exp(-10.*el/5.3);}\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        int ic=isCut(e1,e2)?1:0;\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];\n        int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];\n        double dtot=dl+BIG*dlc;\n        if(dtot<=0||(T>1e-9&&rd()<exp(-dtot/T))){\n            for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}\n            for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n            for(int f:cpairs[e1]){cutD[f][d1]--;cutD[f][d2]++;}\n            for(int f:cpairs[e2]){cutD[f][d2]--;cutD[f][d1]++;}\n            {int p=dpos[e1],L=dayE[d1].back();dayE[d1][p]=L;dpos[L]=p;dayE[d1].pop_back();}\n            {int p=dpos[e2],L=dayE[d2].back();dayE[d2][p]=L;dpos[L]=p;dayE[d2].pop_back();}\n            dpos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;\n            dpos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n        }\n    }\n    for(int d=0;d<D;d++){int mr=(int)dayE[d].size()+5;while(mr-->0){fill(cvis+1,cvis+N+1,false);int h=0,t=0;cvis[1]=true;cq[t++]=1;while(h<t){int u=cq[h++];for(auto&[v,e]:G[u])if(aday[e]!=d&&!cvis[v]){cvis[v]=true;cq[t++]=v;}}bool disc=false;for(int v=1;v<=N;v++)if(!cvis[v]){disc=true;break;}if(!disc)break;bool fx=false;for(int i=0;i<(int)dayE[d].size()&&!fx;i++){int e=dayE[d][i];if(cvis[EU[e]]==cvis[EV[e]])continue;for(int dd=0;dd<D&&!fx;dd++){if(dd==d||(int)dayE[dd].size()>=K)continue;for(int ef:ladj[e]){ADJ[ef][d]-=imp[e];ADJ[ef][dd]+=imp[e];}for(int f:cpairs[e]){cutD[f][d]--;cutD[f][dd]++;}int p=dpos[e],L=dayE[d].back();dayE[d][p]=L;dpos[L]=p;dayE[d].pop_back();dpos[e]=dayE[dd].size();dayE[dd].push_back(e);aday[e]=dd;fx=true;}}if(!fx)break;}}\n    for(int i=0;i<M;i++){if(i)cout<<' ';cout<<aday[i]+1;}cout<<'\\n';\n}","ahc019":"#include <bits/stdc++.h>\nusing namespace std;\nint D;\nstring Fs[2][14],Rs[2][14];\nint bid,B[2][2744];bool occ[2][2744];\nbool boxFits(int r,int x0,int y0,int z0,int a,int b,int c){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++)if(occ[r][(x0+i)*D*D+(y0+j)*D+(z0+k)])return false;return true;}\nvoid fillBox(int r,int x0,int y0,int z0,int a,int b,int c,int id){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++){int idx=(x0+i)*D*D+(y0+j)*D+(z0+k);B[r][idx]=id;occ[r][idx]=true;}}\nvoid fillLine(int r,int x,int y,int z,int len,int ax,int id){for(int k=0;k<len;k++){int idx=(x+(ax==0?k:0))*D*D+(y+(ax==1?k:0))*D+(z+(ax==2?k:0));B[r][idx]=id;occ[r][idx]=true;}}\nstruct Box{int x,y,z,a,b,c;};struct Line{int x,y,z,len,ax;};\nvector<Box> enumBoxes(int arr){\n    vector<Box> boxes;uint16_t fz[14]={},rz[14]={};\n    for(int z=0;z<D;z++)for(int x=0;x<D;x++)if(Fs[arr][z][x]=='1')fz[x]|=1u<<z;\n    for(int z=0;z<D;z++)for(int y=0;y<D;y++)if(Rs[arr][z][y]=='1')rz[y]|=1u<<z;\n    uint16_t am=(uint16_t)((1u<<D)-1);\n    for(int x0=0;x0<D;x0++){uint16_t xm=am;for(int a=1;x0+a<=D;a++){xm&=fz[x0+a-1];if(!xm)break;\n        for(int y0=0;y0<D;y0++){uint16_t ym=am;for(int b=1;y0+b<=D;b++){ym&=rz[y0+b-1];if(!ym)break;\n            uint16_t zm=xm&ym;if(!zm)continue;\n            for(int z=0;z<D;z++){if(!(zm&(1u<<z)))continue;int cm=0;while(z+cm<D&&(zm&(1u<<(z+cm))))cm++;for(int c=1;c<=cm;c++)boxes.push_back({x0,y0,z,a,b,c});}}}}}\n    return boxes;}\nvector<Line> getRemLines(int arr,int ax){\n    vector<Line>L;\n    if(ax==0){for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,s=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=x;else if(!v&&s>=0){L.push_back({s,y,z,x-s,0});s=-1;}}}}\n    else if(ax==1){for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,s=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=y;else if(!v&&s>=0){L.push_back({x,s,z,y-s,1});s=-1;}}}}\n    else{for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,s=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=z;else if(!v&&s>=0){L.push_back({x,y,s,z-s,2});s=-1;}}}}\n    return L;}\ndouble matchScore(const vector<Line>&L0,const vector<Line>&L1){\n    map<int,int>c0,c1;for(auto&l:L0)c0[l.len]++;for(auto&l:L1)c1[l.len]++;\n    double sc=0;int v0=0,v1=0;\n    for(auto&[l,c]:c0){int cl=c1.count(l)?c1[l]:0;int mc=min(c,cl);sc+=mc*1.0/l;v0+=(c-mc)*l;}\n    for(auto&[l,c]:c1){int cl=c0.count(l)?c0[l]:0;if(c>cl)v1+=(c-cl)*l;}\n    sc+=max(v0,v1);return sc;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>D;for(int i=0;i<2;i++){for(int z=0;z<D;z++)cin>>Fs[i][z];for(int z=0;z<D;z++)cin>>Rs[i][z];}\n    memset(B,0,sizeof(B));memset(occ,0,sizeof(occ));bid=0;\n    auto bx0=enumBoxes(0),bx1=enumBoxes(1);\n    typedef array<int,3> Key;\n    auto gk=[](const Box&bx)->Key{Key k={bx.a,bx.b,bx.c};sort(k.begin(),k.end());return k;};\n    map<Key,vector<int>>g0,g1;\n    for(int i=0;i<(int)bx0.size();i++)g0[gk(bx0[i])].push_back(i);\n    for(int i=0;i<(int)bx1.size();i++)g1[gk(bx1[i])].push_back(i);\n    vector<pair<int,Key>>grps;\n    for(auto&[k,v]:g0)if(g1.count(k))grps.push_back({k[0]*k[1]*k[2],k});\n    sort(grps.rbegin(),grps.rend());\n    for(auto&[vol,key]:grps){\n        auto&v0=g0[key];auto&v1=g1[key];int p1=0;\n        for(int i0:v0){\n            auto&B0=bx0[i0];if(!boxFits(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c))continue;\n            while(p1<(int)v1.size()&&!boxFits(1,bx1[v1[p1]].x,bx1[v1[p1]].y,bx1[v1[p1]].z,bx1[v1[p1]].a,bx1[v1[p1]].b,bx1[v1[p1]].c))p1++;\n            if(p1>=(int)v1.size())break;\n            auto&B1=bx1[v1[p1++]];bid++;\n            fillBox(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c,bid);fillBox(1,B1.x,B1.y,B1.z,B1.a,B1.b,B1.c,bid);}}\n    int bax0=1,bax1=1;double bsc=1e18;\n    for(int ax0=0;ax0<3;ax0++){auto Lt0=getRemLines(0,ax0);for(int ax1=0;ax1<3;ax1++){auto Lt1=getRemLines(1,ax1);double sc=matchScore(Lt0,Lt1);if(sc<bsc){bsc=sc;bax0=ax0;bax1=ax1;}}}\n    auto L0=getRemLines(0,bax0),L1=getRemLines(1,bax1);\n    map<int,vector<int>>gl0,gl1;\n    for(int i=0;i<(int)L0.size();i++)gl0[L0[i].len].push_back(i);\n    for(int i=0;i<(int)L1.size();i++)gl1[L1[i].len].push_back(i);\n    vector<bool>lu0(L0.size(),false),lu1(L1.size(),false);\n    for(auto&[l,v0]:gl0){auto it=gl1.find(l);if(it==gl1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;auto&s0=L0[v0[j]];auto&s1=L1[v1[j]];fillLine(0,s0.x,s0.y,s0.z,l,s0.ax,bid);fillLine(1,s1.x,s1.y,s1.z,l,s1.ax,bid);lu0[v0[j]]=lu1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;\n    for(int i=0;i<(int)L0.size();i++)if(!lu0[i])rv0.push_back({L0[i].len,i});\n    for(int i=0;i<(int)L1.size();i++)if(!lu1[i])rv1.push_back({L1[i].len,i});\n    sort(rv0.rbegin(),rv0.rend());sort(rv1.begin(),rv1.end());\n    struct SO{int idx,off;};deque<SO>r0,r1;\n    for(auto&[l,i]:rv0)r0.push_back({i,0});for(auto&[l,i]:rv1)r1.push_back({i,0});\n    auto gpos=[&](const Line&s,int off)->tuple<int,int,int>{return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};};\n    while(!r0.empty()&&!r1.empty()){\n        auto&[i0,o0]=r0.front();auto&[i1,o1]=r1.front();\n        int ml=min(L0[i0].len-o0,L1[i1].len-o1);bid++;\n        auto[x0,y0,z0]=gpos(L0[i0],o0);auto[x1,y1,z1]=gpos(L1[i1],o1);\n        fillLine(0,x0,y0,z0,ml,L0[i0].ax,bid);fillLine(1,x1,y1,z1,ml,L1[i1].ax,bid);\n        o0+=ml;o1+=ml;if(o0==L0[i0].len)r0.pop_front();if(o1==L1[i1].len)r1.pop_front();}\n    while(!r0.empty()){auto[i0,o0]=r0.front();r0.pop_front();bid++;auto[x,y,z]=gpos(L0[i0],o0);fillLine(0,x,y,z,L0[i0].len-o0,L0[i0].ax,bid);}\n    while(!r1.empty()){auto[i1,o1]=r1.front();r1.pop_front();bid++;auto[x,y,z]=gpos(L1[i1],o1);fillLine(1,x,y,z,L1[i1].len-o1,L1[i1].ax,bid);}\n    cout<<bid<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[0][i];}cout<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[1][i];}cout<<\"\\n\";\n    return 0;}","ahc020":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    int N, M, K;\n    cin >> N >> M >> K;\n    vector<ll> X(N), Y(N);\n    for (int i = 0; i < N; i++) cin >> X[i] >> Y[i];\n    vector<int> EU(M), EV(M); vector<ll> EW(M);\n    for (int j = 0; j < M; j++) { cin >> EU[j] >> EV[j] >> EW[j]; EU[j]--; EV[j]--; }\n    vector<ll> A(K), B(K);\n    for (int k = 0; k < K; k++) cin >> A[k] >> B[k];\n    const ll MAXP = 5000, MAXP2 = MAXP*MAXP, INF = (ll)4e18;\n    vector<vector<ll>> D2(N, vector<ll>(K));\n    for (int i = 0; i < N; i++)\n        for (int k = 0; k < K; k++) { ll dx=A[k]-X[i],dy=B[k]-Y[i]; D2[i][k]=dx*dx+dy*dy; }\n    vector<vector<pair<int,int>>> adj(N);\n    for (int j = 0; j < M; j++) { adj[EU[j]].push_back({EV[j],j}); adj[EV[j]].push_back({EU[j],j}); }\n    auto pVal = [&](ll d2) -> ll {\n        if (!d2) return 0; ll p=(ll)sqrt((double)d2); while(p*p<d2)p++; return min(p,MAXP);\n    };\n    // APSP\n    vector<vector<ll>> spD(N, vector<ll>(N, INF));\n    vector<vector<int>> spE(N, vector<int>(N,-1)), spPr(N, vector<int>(N,-1));\n    for (int s = 0; s < N; s++) {\n        spD[s][s]=0;\n        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> pq; pq.push({0,s});\n        while (!pq.empty()) {\n            auto [d,v]=pq.top(); pq.pop(); if(d>spD[s][v]) continue;\n            for (auto& [u,j]:adj[v]) { ll nd=d+EW[j]; if(nd<spD[s][u]){spD[s][u]=nd;spPr[s][u]=v;spE[s][u]=j;pq.push({nd,u});} }\n        }\n    }\n    // Steiner tree\n    auto buildSteiner = [&](vector<bool> term) -> vector<bool> {\n        term[0]=true; vector<int> T; for(int i=0;i<N;i++) if(term[i]) T.push_back(i); int TN=T.size();\n        vector<bool> in(TN,false); vector<ll> key(TN,INF); vector<int> par(TN,-1); key[0]=0;\n        for (int it=0;it<TN;it++) {\n            int u=-1; for(int i=0;i<TN;i++) if(!in[i]&&(u<0||key[i]<key[u])) u=i;\n            if(u<0||key[u]>=INF) break; in[u]=true;\n            for(int w=0;w<TN;w++) if(!in[w]&&spD[T[u]][T[w]]<key[w]){key[w]=spD[T[u]][T[w]];par[w]=u;}\n        }\n        vector<bool> eo(M,false);\n        for(int i=0;i<TN;i++){if(par[i]<0)continue;int src=T[par[i]],dst=T[i];for(int v=dst;v!=src;v=spPr[src][v])eo[spE[src][v]]=true;}\n        return eo;\n    };\n    // 1-opt assignment optimization\n    auto optimizeP = [&](const vector<bool>& reach) -> pair<vector<int>,ll> {\n        vector<vector<int>> vR(N); vector<ll> vMx(N,0);\n        for (int k=0;k<K;k++) {\n            ll best=INF; int bv=-1;\n            for(int i=0;i<N;i++) if(reach[i]&&D2[i][k]<best){best=D2[i][k];bv=i;}\n            if(bv<0||best>MAXP2) return {{},INF};\n            vR[bv].push_back(k); vMx[bv]=max(vMx[bv],best);\n        }\n        vector<ll> Pv(N,0); for(int i=0;i<N;i++) Pv[i]=pVal(vMx[i]);\n        bool imp=true; int iters=0;\n        while (imp&&iters++<400) {\n            imp=false;\n            for (int u=0;u<N;u++) {\n                if(!reach[u]||vR[u].empty()) continue;\n                int kFar=-1; ll mxD2u=0;\n                for(int k:vR[u]) if(D2[u][k]>mxD2u){mxD2u=D2[u][k];kFar=k;}\n                ll secMx=0;\n                for(int k:vR[u]) if(k!=kFar&&D2[u][k]>secMx) secMx=D2[u][k];\n                ll newPu=pVal(secMx); if(newPu==Pv[u]) continue;\n                ll bDelta=0; int bV=-1;\n                for(int v=0;v<N;v++){\n                    if(v==u||!reach[v]) continue;\n                    ll dkv=D2[v][kFar]; if(dkv>MAXP2) continue;\n                    ll newMxv=max(vMx[v],dkv), newPv=pVal(newMxv);\n                    ll delta=newPu*newPu+newPv*newPv-Pv[u]*Pv[u]-Pv[v]*Pv[v];\n                    if(delta<bDelta){bDelta=delta;bV=v;}\n                }\n                if(bV>=0){\n                    auto& ru=vR[u]; ru.erase(find(ru.begin(),ru.end(),kFar));\n                    vMx[u]=secMx; Pv[u]=newPu;\n                    vR[bV].push_back(kFar);\n                    vMx[bV]=max(vMx[bV],D2[bV][kFar]); Pv[bV]=pVal(vMx[bV]);\n                    imp=true;\n                }\n            }\n        }\n        vector<int> P(N,0); ll pc=0;\n        for(int i=0;i<N;i++){P[i]=(int)Pv[i];pc+=Pv[i]*Pv[i];}\n        return {P,pc};\n    };\n    // Evaluate edge set\n    auto evalEO = [&](const vector<bool>& eo) -> tuple<vector<int>,ll,bool> {\n        vector<bool> reach(N,false); queue<int> q; q.push(0); reach[0]=true;\n        while(!q.empty()){int v=q.front();q.pop();for(auto&[u,j]:adj[v])if(eo[j]&&!reach[u]){reach[u]=true;q.push(u);}}\n        ll ec=0; for(int j=0;j<M;j++) if(eo[j]) ec+=EW[j];\n        auto [P,pc]=optimizeP(reach); if(pc==INF) return {{},INF,false};\n        return {P,ec+pc,true};\n    };\n    // MST\n    vector<int> mstPar(N,-1),mstPE(N,-1); vector<vector<int>> mstCh(N);\n    {\n        vector<bool> vis(N,false); vector<ll> key(N,INF); key[0]=0;\n        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> pq; pq.push({0,0});\n        while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(vis[v])continue;vis[v]=true;for(auto&[u,j]:adj[v])if(!vis[u]&&EW[j]<key[u]){key[u]=EW[j];mstPar[u]=v;mstPE[u]=j;pq.push({EW[j],u});}}\n        for(int v=1;v<N;v++) mstCh[mstPar[v]].push_back(v);\n    }\n    // MST leaf pruning\n    vector<bool> act(N,true); vector<vector<int>> vRes(N); vector<ll> vmx(N,0),Pv(N,0);\n    for(int k=0;k<K;k++){ll best=INF;int bv=-1;for(int i=0;i<N;i++)if(D2[i][k]<best){best=D2[i][k];bv=i;}vRes[bv].push_back(k);vmx[bv]=max(vmx[bv],best);}\n    for(int i=0;i<N;i++) Pv[i]=pVal(vmx[i]);\n    ll ec0=0,pc0=0; for(int v=1;v<N;v++)ec0+=EW[mstPE[v]]; for(int i=0;i<N;i++)pc0+=Pv[i]*Pv[i];\n    auto isLeaf=[&](int v){for(int c:mstCh[v])if(act[c])return false;return true;};\n    for(bool imp=true;imp;){\n        imp=false; ll bD=0; int bV=-1; vector<pair<int,int>> bAs; vector<pair<int,ll>> bAf;\n        for(int v=1;v<N;v++){\n            if(!act[v]||!isLeaf(v)) continue;\n            ll delta=-(EW[mstPE[v]]+Pv[v]*Pv[v]);\n            map<int,ll> tmp; vector<pair<int,int>> ta; bool ok=true;\n            for(int k:vRes[v]){\n                ll best=INF;int bu=-1;for(int u=0;u<N;u++){if(u==v||!act[u])continue;if(D2[u][k]<best){best=D2[u][k];bu=u;}}\n                if(bu<0||best>MAXP2){ok=false;break;}\n                ta.push_back({k,bu}); if(!tmp.count(bu))tmp[bu]=vmx[bu]; tmp[bu]=max(tmp[bu],best);\n            }\n            if(!ok) continue;\n            for(auto&[u,nd]:tmp){ll np=pVal(nd);delta+=np*np-Pv[u]*Pv[u];}\n            if(delta<bD){bD=delta;bV=v;bAs=ta;bAf.clear();for(auto&[u,nd]:tmp)bAf.push_back({u,nd});}\n        }\n        if(bV>=0){\n            act[bV]=false;ec0-=EW[mstPE[bV]];pc0-=Pv[bV]*Pv[bV];Pv[bV]=0;vmx[bV]=0;vRes[bV].clear();\n            for(auto&[k,u]:bAs)vRes[u].push_back(k);\n            for(auto&[u,nd]:bAf){pc0-=Pv[u]*Pv[u];vmx[u]=nd;Pv[u]=pVal(nd);pc0+=Pv[u]*Pv[u];}\n            imp=true;\n        }\n    }\n    ll bestCost=INF; vector<bool> bestEO(M,false); vector<int> bestP(N,0);\n    auto updateBest=[&](const vector<bool>&eo,const vector<int>&P,ll cost){if(cost<bestCost){bestCost=cost;bestEO=eo;bestP=P;}};\n    // Eval MST pruning with optimized assignment\n    {\n        vector<bool> eo(M,false); for(int v=1;v<N;v++) if(act[v]) eo[mstPE[v]]=true;\n        auto[P,sc,sf]=evalEO(eo); if(sf) updateBest(eo,P,sc);\n    }\n    // Steiner iterations\n    auto runSteiner=[&](vector<bool> term){\n        term[0]=true;\n        for(int sit=0;sit<15;sit++){\n            auto eo=buildSteiner(term);\n            auto[sp,sc,sf]=evalEO(eo); if(!sf) break;\n            updateBest(eo,sp,sc);\n            vector<bool> nt(N,false); nt[0]=true;\n            for(int i=0;i<N;i++) if(sp[i]>0) nt[i]=true;\n            if(nt==term) break; term=nt;\n        }\n    };\n    {vector<bool> t(N,false);for(int i=0;i<N;i++)if(Pv[i]>0)t[i]=true;runSteiner(t);}\n    {vector<bool> t(N,true);runSteiner(t);}\n    for(int i=0;i<N;i++) cout<<bestP[i]<<\" \\n\"[i==N-1];\n    for(int j=0;j<M;j++) cout<<(int)bestEO[j]<<\" \\n\"[j==M-1];\n    return 0;\n}","ahc021":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int N = 30;\nint board[N][N];\nvector<array<int,4>> ops;\n\nvoid do_swap(int x1, int y1, int x2, int y2) {\n    swap(board[x1][y1], board[x2][y2]);\n    ops.push_back({x1, y1, x2, y2});\n}\n\nvoid sift_down(int x, int y) {\n    while (x < N-1) {\n        int ny = (board[x+1][y] <= board[x+1][y+1]) ? y : y+1;\n        if (board[x][y] <= board[x+1][ny]) break;\n        do_swap(x, y, x+1, ny);\n        y = ny;\n        x++;\n    }\n}\n\nint main() {\n    ios::sync_with_stdio(false);\n    cin.tie(nullptr);\n    \n    for (int x = 0; x < N; x++)\n        for (int y = 0; y <= x; y++)\n            cin >> board[x][y];\n    \n    // Bottom-up heapify: one pass is sufficient to produce a valid heap\n    for (int x = N-2; x >= 0; x--)\n        for (int y = 0; y <= x; y++)\n            sift_down(x, y);\n    \n    cout << ops.size() << \"\\n\";\n    for (auto& op : ops)\n        cout << op[0] << \" \" << op[1] << \" \" << op[2] << \" \" << op[3] << \"\\n\";\n}","toyota2023summer-final":"#include <bits/stdc++.h>\nusing namespace std;\nconst int D9=9;\nint D,N,M;\nbool obs[D9][D9],hasc[D9][D9];\nint cnum[D9][D9],sr[D9*D9],sc[D9*D9],prank[D9][D9];\nint er,ec;\nconst int dr[4]={-1,1,0,0},dc[4]={0,0,-1,1};\nbool in_(int r,int c){return r>=0&&r<D&&c>=0&&c<D;}\nvoid build_sigma(){\n    int dist[D9][D9];memset(dist,-1,sizeof dist);\n    queue<pair<int,int>>q;q.push({er,ec});dist[er][ec]=0;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||dist[nx][ny]>=0||obs[nx][ny])continue;dist[nx][ny]=dist[x][y]+1;q.push({nx,ny});}}\n    vector<pair<int,int>>pos;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(!obs[r][c]&&!(r==er&&c==ec))pos.emplace_back(r,c);\n    sort(pos.begin(),pos.end(),[&](const pair<int,int>&a,const pair<int,int>&b){if(dist[a.first][a.second]!=dist[b.first][b.second])return dist[a.first][a.second]<dist[b.first][b.second];if(a.first!=b.first)return a.first<b.first;return a.second<b.second;});\n    M=(int)pos.size();\n    for(int k=0;k<M;k++){sr[k]=pos[k].first;sc[k]=pos[k].second;prank[pos[k].first][pos[k].second]=k;}\n}\nvoid bfs_emp(bool vis[D9][D9]){\n    memset(vis,0,D9*D9*sizeof(bool));\n    queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny]||hasc[nx][ny])continue;vis[nx][ny]=1;q.push({nx,ny});}}\n}\nbool safe_place(int r,int c,const vector<pair<int,int>>&reach){\n    bool vis[D9][D9];memset(vis,0,sizeof vis);\n    queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny]||hasc[nx][ny])continue;if(nx==r&&ny==c)continue;vis[nx][ny]=1;q.push({nx,ny});}}\n    for(auto[pr,pc]:reach){if(pr==r&&pc==c)continue;if(!vis[pr][pc])return false;}\n    return true;\n}\npair<int,int>pick_place(int t){\n    bool vis[D9][D9];bfs_emp(vis);\n    int ir=sr[t],ic=sc[t];\n    vector<pair<int,int>>reach;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(vis[r][c]&&!(r==er&&c==ec))reach.emplace_back(r,c);\n    if(vis[ir][ic]&&safe_place(ir,ic,reach))return{ir,ic};\n    pair<int,int>best{-1,-1};int bd=INT_MAX,brk=-1;bool gots=false;\n    for(auto[r,c]:reach){\n        if(r==ir&&c==ic)continue;\n        bool s=safe_place(r,c,reach);\n        int d=abs(prank[r][c]-t),rk=prank[r][c];\n        bool better=(!gots&&s)||(gots==s&&(d<bd||(d==bd&&rk>brk)));\n        if(better){best={r,c};bd=d;brk=rk;gots=s;}\n    }\n    return best;\n}\nvector<pair<int,int>>transport(){\n    bool h[D9][D9];memcpy(h,hasc,sizeof h);\n    vector<pair<int,int>>ord;ord.reserve(M);\n    for(int s=0;s<M;s++){\n        bool vis[D9][D9];memset(vis,0,sizeof vis);\n        queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n        int bn=INT_MAX,br=-1,bc=-1;\n        while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny])continue;vis[nx][ny]=1;if(h[nx][ny]){if(cnum[nx][ny]<bn){bn=cnum[nx][ny];br=nx;bc=ny;}}else q.push({nx,ny});}}\n        ord.emplace_back(br,bc);h[br][bc]=0;\n    }\n    return ord;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>D>>N;\n    memset(obs,0,sizeof obs);memset(hasc,0,sizeof hasc);memset(cnum,-1,sizeof cnum);\n    er=0;ec=(D-1)/2;\n    for(int i=0;i<N;i++){int r,c;cin>>r>>c;obs[r][c]=1;}\n    build_sigma();\n    for(int d=0;d<M;d++){\n        int t;cin>>t;\n        auto[r,c]=pick_place(t);\n        hasc[r][c]=1;cnum[r][c]=t;\n        cout<<r<<' '<<c<<'\\n';cout.flush();\n    }\n    auto ord=transport();\n    for(auto[r,c]:ord)cout<<r<<' '<<c<<'\\n';\n    cout.flush();\n}","ahc024":"#include <bits/stdc++.h>\nusing namespace std;\nint n,m,g[50][50];\nbool adj[102][102];\nint acnt[102][102],ccnt[102],dep[102];\nconst int dr[]={0,0,1,-1},dc[]={1,-1,0,0};\nint gc(int r,int c){return(r<0||r>=n||c<0||c>=n)?0:g[r][c];}\nvoid compute_adj(){memset(adj,0,sizeof(adj));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int col=g[i][j];for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=col)adj[col][nc]=adj[nc][col]=1;}}}\nvoid compute_depth(){fill(dep,dep+102,100);queue<int>q;for(int c=0;c<=m;c++)if(adj[c][0]){dep[c]=0;q.push(c);}dep[0]=0;while(!q.empty()){int u=q.front();q.pop();for(int v=1;v<=m;v++)if(adj[u][v]&&dep[v]>dep[u]+1){dep[v]=dep[u]+1;q.push(v);}}}\nvoid recompute(){memset(acnt,0,sizeof(acnt));memset(ccnt,0,sizeof(ccnt));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int col=g[i][j];ccnt[col]++;bool seen[102]={};for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=col&&!seen[nc]){acnt[col][nc]++;seen[nc]=1;}}}}\nbool conn_ok(int r,int c,int col){if(ccnt[col]<=1)return 0;int sr=-1,sc=-1;for(int i=0;i<n&&sr<0;i++)for(int j=0;j<n;j++)if(g[i][j]==col&&!(i==r&&j==c)){sr=i;sc=j;break;}if(sr<0)return 0;bool vis[50][50]={};queue<pair<int,int>>q;q.push({sr,sc});vis[sr][sc]=1;int cnt=1;while(!q.empty()){auto[cr,cc]=q.front();q.pop();for(int d=0;d<4;d++){int nr=cr+dr[d],nc=cc+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==col&&!(nr==r&&nc==c)&&!vis[nr][nc]){vis[nr][nc]=1;cnt++;q.push({nr,nc});}}}return cnt==ccnt[col]-1;}\nbool can_trim(int r,int c){int col=g[r][c];if(!col||!adj[col][0])return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&!adj[nc][0])return 0;}bool za=(r==0||r==n-1||c==0||c==n-1);if(!za)for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&!g[nr][nc]){za=1;break;}}if(!za)return 0;if(!conn_ok(r,c,col))return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&acnt[col][nc]<=1)return 0;}return 1;}\nvoid do_trim(int r,int c){int col=g[r][c];bool seen[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!seen[nc]){acnt[col][nc]--;seen[nc]=1;}}g[r][c]=0;ccnt[col]--;ccnt[0]++;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;bool hz=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2<0||nr2>=n||nc2<0||nc2>=n){hz=1;break;}if(!g[nr2][nc2]){hz=1;break;}}if(!hz)acnt[ncol][0]++;if(ncol==col)continue;bool sc2=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){sc2=1;break;}}if(!sc2)acnt[ncol][col]--;}}\nvoid greedy_trim(){bool ch=1;while(ch){ch=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(g[i][j]&&can_trim(i,j)){do_trim(i,j);ch=1;}}}\nbool can_reassign(int r,int c,int&co){int col=g[r][c];if(!col||adj[col][0])return 0;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int c2=g[nr][nc];if(!c2||c2==col||dep[c2]>=dep[col])continue;bool ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&!adj[c2][dc2]){ok=0;break;}}if(!ok)continue;if(!conn_ok(r,c,col))continue;ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&acnt[col][dc2]<=1){ok=0;break;}}if(!ok)continue;co=c2;return 1;}return 0;}\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);\n    cin>>n>>m;\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>g[i][j];\n    compute_adj();compute_depth();recompute();\n    greedy_trim();\n    bool global=1;\n    while(global){\n        global=0;bool ch=1;\n        while(ch){ch=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++){int co;if(can_reassign(i,j,co)){g[i][j]=co;recompute();ch=1;global=1;}}}\n        if(global)greedy_trim();\n    }\n    for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j)cout<<' ';cout<<g[i][j];}cout<<'\\n';}\n}","ahc025":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N, D, Q, q_used = 0;\n\nchar bq(const vector<int>& L, const vector<int>& R) {\n    cout << L.size() << \" \" << R.size();\n    for (int x : L) cout << \" \" << x;\n    for (int x : R) cout << \" \" << x;\n    cout << \"\\n\";\n    cout.flush();\n    q_used++;\n    char c; cin >> c; return c;\n}\n\nint slm;\nvector<int> ms(vector<int> a) {\n    if ((int)a.size() <= 1 || q_used >= slm) return a;\n    int m = a.size() / 2;\n    auto L = ms(vector<int>(a.begin(), a.begin() + m));\n    auto R = ms(vector<int>(a.begin() + m, a.end()));\n    vector<int> r; int i = 0, j = 0;\n    while (i < (int)L.size() && j < (int)R.size()) {\n        if (q_used >= slm) break;\n        if (bq({L[i]}, {R[j]}) != '>') r.push_back(L[i++]);\n        else r.push_back(R[j++]);\n    }\n    while (i < (int)L.size()) r.push_back(L[i++]);\n    while (j < (int)R.size()) r.push_back(R[j++]);\n    return r;\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n    cin >> N >> D >> Q;\n\n    auto t0 = chrono::high_resolution_clock::now();\n    auto el = [&]() {\n        return chrono::duration<double>(chrono::high_resolution_clock::now() - t0).count();\n    };\n\n    // Phase 1: Sort\n    slm = Q / 2;\n    vector<int> ini(N); iota(ini.begin(), ini.end(), 0);\n    vector<int> ord = ms(ini);\n\n    vector<int> pos(N);\n    for (int i = 0; i < N; i++) pos[ord[i]] = i;\n\n    // Phase 2: Weight estimation via binary search on prefix sums\n    int est_end = Q * 4 / 5;\n    vector<double> w(N, 1.0), ps(N + 1, 0.0);\n    w[ord[0]] = 1.0; ps[1] = 1.0;\n\n    for (int i = 1; i < N; i++) {\n        int lo = 0, hi = i;\n        while (lo < hi && q_used < est_end) {\n            int mid = (lo + hi) / 2;\n            if (bq({ord[i]}, vector<int>(ord.begin(), ord.begin() + mid + 1)) == '>')\n                lo = mid + 1;\n            else hi = mid;\n        }\n        double wlo = ps[lo];\n        double whi = (lo < i) ? ps[lo + 1] : ps[i] * 2.0;\n        w[ord[i]] = max(w[ord[i-1]], (wlo + whi) / 2.0);\n        ps[i+1] = ps[i] + w[ord[i]];\n    }\n\n    // Phase 3: LPT partition\n    vector<int> oi(N); iota(oi.begin(), oi.end(), 0);\n    sort(oi.begin(), oi.end(), [&](int a, int b) {\n        if (fabs(w[a]-w[b]) > 1e-12) return w[a] > w[b];\n        return pos[a] > pos[b];\n    });\n    vector<double> gw(D, 0.0);\n    vector<int> asgn(N, 0);\n    for (int x : oi) {\n        int g = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        asgn[x] = g; gw[g] += w[x];\n    }\n\n    // Phase 4: Local search with estimated weights\n    double total = 0; for (double x : gw) total += x;\n    double mean = total / D;\n\n    for (int p = 0; p < 5000 && el() < 1.5; p++) {\n        bool imp = false;\n        // Single moves\n        for (int x = 0; x < N; x++) {\n            int g0 = asgn[x]; int bg = g0; double bd = 0;\n            double d0 = gw[g0] - mean;\n            for (int g = 0; g < D; g++) {\n                if (g == g0) continue;\n                double d1 = gw[g] - mean;\n                double dc = d0*d0 + d1*d1 - (d0-w[x])*(d0-w[x]) - (d1+w[x])*(d1+w[x]);\n                if (dc > bd) { bd = dc; bg = g; }\n            }\n            if (bg != g0) { gw[g0] -= w[x]; gw[bg] += w[x]; asgn[x] = bg; imp = true; }\n        }\n        // Swaps\n        for (int i = 0; i < N && el() < 1.4; i++) {\n            for (int j = i+1; j < N; j++) {\n                if (asgn[i] == asgn[j]) continue;\n                int gi = asgn[i], gj = asgn[j];\n                double di = gw[gi]-mean, dj = gw[gj]-mean;\n                double di2 = di-w[i]+w[j], dj2 = dj+w[i]-w[j];\n                if (di*di + dj*dj > di2*di2 + dj2*dj2 + 1e-9) {\n                    gw[gi] += w[j]-w[i]; gw[gj] += w[i]-w[j];\n                    asgn[i] = gj; asgn[j] = gi; imp = true;\n                }\n            }\n        }\n        if (!imp) break;\n    }\n\n    // Phase 5: Actual balance improvement using remaining queries\n    vector<vector<int>> gi(D);\n    for (int x = 0; x < N; x++) gi[asgn[x]].push_back(x);\n    for (int g = 0; g < D; g++)\n        sort(gi[g].begin(), gi[g].end(), [&](int a, int b){ return pos[a] < pos[b]; });\n\n    while (q_used + 2 <= Q && el() < 1.9) {\n        int gh = (int)(max_element(gw.begin(), gw.end()) - gw.begin());\n        int gl = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        if (gw[gh] <= gw[gl] + 1e-9 || gi[gh].empty() || gi[gl].empty()) break;\n\n        char cmp = bq(gi[gh], gi[gl]);\n        if (cmp == '=') { gw[gh] = gw[gl] = (gw[gh]+gw[gl])/2; continue; }\n        if (cmp == '<') { swap(gh, gl); swap(gw[gh], gw[gl]); }\n\n        auto& hv = gi[gh]; auto& lt = gi[gl];\n        if ((int)hv.size() <= 1) continue;\n\n        int lo = 0, hi = (int)hv.size() - 1;\n        while (lo < hi && q_used + 1 <= Q && el() < 1.85) {\n            int mid = (lo + hi) / 2;\n            vector<int> L2, R2 = lt;\n            for (int k = 0; k < (int)hv.size(); k++) if (k != mid) L2.push_back(hv[k]);\n            R2.push_back(hv[mid]);\n            char r = bq(L2, R2);\n            if (r == '=') { lo = hi = mid; break; }\n            else if (r == '>') lo = mid + 1;\n            else hi = mid;\n        }\n        lo = min(lo, (int)hv.size() - 1);\n        if (lo > 0) {\n            double da = fabs((gw[gh]-w[hv[lo]]) - (gw[gl]+w[hv[lo]]));\n            double db = fabs((gw[gh]-w[hv[lo-1]]) - (gw[gl]+w[hv[lo-1]]));\n            if (db < da) lo--;\n        }\n\n        int mv = hv[lo];\n        asgn[mv] = gl;\n        gw[gh] -= w[mv]; gw[gl] += w[mv];\n        hv.erase(hv.begin() + lo);\n        lt.insert(lower_bound(lt.begin(), lt.end(), mv,\n            [&](int a, int b){ return pos[a] < pos[b]; }), mv);\n    }\n\n    while (q_used < Q) bq({0}, {1});\n\n    for (int i = 0; i < N; i++) cout << asgn[i] << \" \\n\"[i==N-1];\n    cout.flush();\n    return 0;\n}","ahc026":"#include <bits/stdc++.h>\nusing namespace std;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    \n    int n, m;\n    cin >> n >> m;\n    \n    vector<vector<int>> stacks(m);\n    vector<int> stk(n + 1), pidx(n + 1);\n    vector<int> stack_min(m, n + 1);\n    \n    int h = n / m;\n    for (int i = 0; i < m; i++) {\n        stacks[i].resize(h);\n        for (int j = 0; j < h; j++) {\n            cin >> stacks[i][j];\n            stk[stacks[i][j]] = i;\n            pidx[stacks[i][j]] = j;\n        }\n        stack_min[i] = *min_element(stacks[i].begin(), stacks[i].end());\n    }\n    \n    vector<pair<int,int>> ops;\n    \n    auto recompute_min = [&](int t) {\n        stack_min[t] = stacks[t].empty() ? (n + 1) : *min_element(stacks[t].begin(), stacks[t].end());\n    };\n    \n    for (int v = 1; v <= n; v++) {\n        int s = stk[v];\n        int j = pidx[v];\n        \n        while ((int)stacks[s].size() > j + 1) {\n            int top_pos = (int)stacks[s].size() - 1;\n            int run_start = top_pos;\n            while (run_start > j + 1 && stacks[s][run_start - 1] > stacks[s][run_start])\n                run_start--;\n            \n            int u1 = stacks[s][run_start];\n            long long best_score = LLONG_MIN;\n            int best_t = -1;\n            \n            for (int t = 0; t < m; t++) {\n                if (t == s) continue;\n                long long score;\n                if (stacks[t].empty()) {\n                    score = 2LL * n * n;\n                } else {\n                    int top_t = stacks[t].back();\n                    int min_t = stack_min[t];\n                    if (top_t > u1) {\n                        if (min_t > u1)\n                            score = 3LL * n * n + (n - top_t); // Perfect: patience sort tiebreak\n                        else\n                            score = 1LL * n * n + min_t; // Good valid: prefer large min_t\n                    } else {\n                        score = (long long)min_t - n * n; // Invalid: prefer large min_t\n                    }\n                }\n                if (score > best_score) { best_score = score; best_t = t; }\n            }\n            \n            int move_box = stacks[s][run_start];\n            int new_base = (int)stacks[best_t].size();\n            int old_size_s = (int)stacks[s].size();\n            \n            ops.push_back({move_box, best_t + 1});\n            \n            for (int p = run_start; p < old_size_s; p++) {\n                int b = stacks[s][p];\n                stacks[best_t].push_back(b);\n                stk[b] = best_t;\n                pidx[b] = new_base + (p - run_start);\n                stack_min[best_t] = min(stack_min[best_t], b);\n            }\n            stacks[s].resize(run_start);\n            recompute_min(s);\n        }\n        \n        ops.push_back({v, 0});\n        stacks[s].pop_back();\n        recompute_min(s);\n    }\n    \n    for (auto& [v, i] : ops)\n        cout << v << \" \" << i << \"\\n\";\n    \n    return 0;\n}","ahc027":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=41,MAXC=1601,BUD=100000;\nint N,n;bool hw[MAXN][MAXN],vw[MAXN][MAXN];int dv[MAXN][MAXN];\nconst int DI[]={0,1,0,-1},DJ[]={1,0,-1,0};const char DC[]=\"RDLU\";\nint C(int i,int j){return i*N+j;}int RI(int c){return c/N;}int RJ(int c){return c%N;}\nbool OK(int i,int j,int d){int ni=i+DI[d],nj=j+DJ[d];if(ni<0||ni>=N||nj<0||nj>=N)return false;if(d==0)return !vw[i][j];if(d==1)return !hw[i][j];if(d==2)return !vw[i][nj];return !hw[ni][j];}\nshort AP[MAXC][MAXC];int AF[MAXC][MAXC];\nvoid bfs(int s){memset(AP[s],0xFF,n*sizeof(short));int fs[MAXC];AP[s][s]=0;fs[s]=s;static int q[MAXC];int h=0,tail=0;q[tail++]=s;while(h<tail){int u=q[h++];for(int d=0;d<4;d++)if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(AP[s][v]<0){AP[s][v]=AP[s][u]+1;fs[v]=(u==s)?v:fs[u];q[tail++]=v;}}}for(int i=0;i<n;i++)AF[s][i]=(i==s)?s:fs[i];}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N;n=N*N;\n    for(int i=0;i<N-1;i++){string s;cin>>s;for(int j=0;j<N;j++)hw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N-1;j++)vw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>dv[i][j];\n    for(int s=0;s<n;s++)bfs(s);\n    short D_home[MAXC];for(int c=0;c<n;c++)D_home[c]=AP[c][0];\n    string route;route.reserve(BUD+10);\n    vector<int> lv(n,0);int pos=0,t=0;\n    {vector<bool> vis(n,false);vis[0]=true;vector<pair<int,int>> stk;stk.reserve(n);stk.push_back({0,0});\n    while(!stk.empty()){int u=stk.back().first;int& nd=stk.back().second;bool found=false;\n    while(nd<4){int d=nd++;if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(!vis[v]){route+=DC[d];t++;pos=v;lv[v]=t;vis[v]=true;stk.push_back({v,0});found=true;break;}}}\n    if(!found){stk.pop_back();if(!stk.empty()){int par=stk.back().first;for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==par){route+=DC[d];t++;pos=par;lv[par]=t;break;}}}}}\n    for(int c=0;c<n;c++)lv[c]=t;\n    float sqd[MAXC];for(int c=0;c<n;c++)sqd[c]=sqrtf((float)dv[RI(c)][RJ(c)]);\n    int committed=-1;\n    while(t+(int)D_home[pos]+2<=BUD){\n        bool rrt=(committed<0)||(pos==committed);\n        if(!rrt&&t+(int)AP[pos][committed]+(int)D_home[committed]+2>BUD)rrt=true;\n        if(rrt){const short* Ap=AP[pos];int best=-1;float bu=0.0f;\n            for(int c=0;c<n;c++){if(c==pos)continue;int dc=(int)Ap[c];if(t+dc+(int)D_home[c]+2>BUD)continue;\n                float u=sqd[c]*(float)(t-lv[c]+1)/(float)(dc+1);if(u>bu){bu=u;best=c;}}\n            committed=best;if(committed<0)break;}\n        int nx=AF[pos][committed];bool moved=false;\n        for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;lv[pos]=t;moved=true;break;}\n        if(!moved)break;}\n    while(pos!=0){int nx=AF[pos][0];for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;break;}}\n    cout<<route<<\"\\n\";return 0;}","ahc028":"#include <bits/stdc++.h>\nusing namespace std;\nint N, M, si, sj;\nvector<string> targets;\nvector<pair<int,int>> charPos[26];\nint ovM[200][200];\nvoid computeOvMatrix() {\n    for(int i=0;i<M;i++) for(int j=0;j<M;j++) {\n        if(i==j){ovM[i][j]=0;continue;}\n        ovM[i][j]=0;\n        for(int k=4;k>=1;k--){bool ok=true;for(int l=0;l<k&&ok;l++)if(targets[i][5-k+l]!=targets[j][l])ok=false;if(ok){ovM[i][j]=k;break;}}\n    }\n}\nvector<int> greedyPerm(int start){\n    vector<bool> used(M,false);vector<int> perm;perm.reserve(M);perm.push_back(start);used[start]=true;\n    while((int)perm.size()<M){int last=perm.back(),best=-1,bov=-1;for(int j=0;j<M;j++)if(!used[j]&&ovM[last][j]>bov){bov=ovM[last][j];best=j;}perm.push_back(best);used[best]=true;}\n    return perm;\n}\nint permOv(const vector<int>&p){int s=0;for(int i=1;i<(int)p.size();i++)s+=ovM[p[i-1]][p[i]];return s;}\nint swapGain(const vector<int>&perm,int i,int j){\n    int m=perm.size(),a=perm[i],b=perm[j],og=0,ng=0;\n    if(i>0){og+=ovM[perm[i-1]][a];ng+=ovM[perm[i-1]][b];}\n    if(j<m-1){og+=ovM[b][perm[j+1]];ng+=ovM[a][perm[j+1]];}\n    if(j==i+1){og+=ovM[a][b];ng+=ovM[b][a];}\n    else{if(i<m-1){og+=ovM[a][perm[i+1]];ng+=ovM[b][perm[i+1]];}if(j>0){og+=ovM[perm[j-1]][b];ng+=ovM[perm[j-1]][a];}}\n    return ng-og;\n}\nbool swapOpt(vector<int>&perm){int m=perm.size(),bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=swapGain(perm,i,j);if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;swap(perm[bi],perm[bj]);return true;}\nbool orOpt(vector<int>&perm){\n    int m=perm.size(),bg=0,bk=-1,bp=-1;\n    for(int k=0;k<m;k++){int e=perm[k];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=k)rest.push_back(perm[i]);\n        int lo=(k>0)?ovM[perm[k-1]][e]:0,ro=(k<m-1)?ovM[e][perm[k+1]]:0,bov=(k>0&&k<m-1)?ovM[perm[k-1]][perm[k+1]]:0,rc=lo+ro-bov;\n        for(int p=0;p<=(int)rest.size();p++){int nl=(p>0)?ovM[rest[p-1]][e]:0,nr=(p<(int)rest.size())?ovM[e][rest[p]]:0,nb=(p>0&&p<(int)rest.size())?ovM[rest[p-1]][rest[p]]:0,g=nl+nr-nb-rc;if(g>bg){bg=g;bk=k;bp=p;}}}\n    if(bk==-1)return false;\n    int e=perm[bk];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=bk)rest.push_back(perm[i]);rest.insert(rest.begin()+bp,e);perm=rest;return true;\n}\nbool reverseOpt(vector<int>&perm){\n    int m=perm.size();if(m<2)return false;\n    vector<int> diff(m-1),pref(m,0);\n    for(int k=0;k<m-1;k++)diff[k]=ovM[perm[k+1]][perm[k]]-ovM[perm[k]][perm[k+1]];\n    for(int k=0;k<m-1;k++)pref[k+1]=pref[k]+diff[k];\n    int bg=0,bi=-1,bj=-1;\n    for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=pref[j]-pref[i];if(i>0)g+=ovM[perm[i-1]][perm[j]]-ovM[perm[i-1]][perm[i]];if(j<m-1)g+=ovM[perm[i]][perm[j+1]]-ovM[perm[j]][perm[j+1]];if(g>bg){bg=g;bi=i;bj=j;}}\n    if(bi==-1)return false;reverse(perm.begin()+bi,perm.begin()+bj+1);return true;\n}\nvoid localSearch(vector<int>&perm){bool imp=true;while(imp){imp=false;if(swapOpt(perm))imp=true;if(orOpt(perm))imp=true;if(reverseOpt(perm))imp=true;}}\nstring buildString(const vector<int>&perm){string s=targets[perm[0]];for(int i=1;i<(int)perm.size();i++)s+=targets[perm[i]].substr(ovM[perm[i-1]][perm[i]]);return s;}\nvector<pair<int,int>> findPath(const string&s){\n    int L=s.size(),G=N*N;const int INF=1e9;\n    vector<int> dp((L+1)*G,INF),prv((L+1)*G,-1);\n    dp[si*N+sj]=0;\n    for(int i=0;i<L;i++){int c=s[i]-'A',base=i*G,nb=(i+1)*G;\n        for(int p=0;p<G;p++){int val=dp[base+p];if(val==INF)continue;int r=p/N,cc=p%N;\n            for(auto&[nr,nc]:charPos[c]){int np=nr*N+nc,cost=val+abs(r-nr)+abs(cc-nc)+1;if(cost<dp[nb+np]){dp[nb+np]=cost;prv[nb+np]=p;}}}}\n    int bc=INF,bp=-1,lb=L*G;for(int p=0;p<G;p++)if(dp[lb+p]<bc){bc=dp[lb+p];bp=p;}\n    vector<pair<int,int>> path(L);int pos=bp;\n    for(int i=L;i>=1;i--){path[i-1]={pos/N,pos%N};pos=prv[i*G+pos];}\n    return path;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    auto t0=chrono::steady_clock::now();\n    auto ms_el=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    cin>>N>>M>>si>>sj;\n    for(int i=0;i<N;i++){string row;cin>>row;for(int j=0;j<N;j++)charPos[row[j]-'A'].push_back({i,j});}\n    targets.resize(M);for(int i=0;i<M;i++)cin>>targets[i];\n    computeOvMatrix();\n    vector<int> best;int bestOv=-1;\n    for(int s=0;s<M;s++){auto p=greedyPerm(s);int o=permOv(p);if(o>bestOv){bestOv=o;best=p;}}\n    localSearch(best);bestOv=permOv(best);\n    {\n        mt19937 rng(42);uniform_real_distribution<double> ud(0.0,1.0);\n        vector<int> cur=best;int curOv=bestOv;double T=2.0;\n        for(long long it=0;;it++){\n            if(it%50000==0&&ms_el()>=1700)break;\n            T=max(0.05,T*0.9999998);\n            int i=rng()%M,j=rng()%M;if(i==j)continue;if(i>j)swap(i,j);\n            int gain=swapGain(cur,i,j);\n            if(gain>0||ud(rng)<exp((double)gain/T)){swap(cur[i],cur[j]);curOv+=gain;if(curOv>bestOv){bestOv=curOv;best=cur;}}\n        }\n    }\n    if(ms_el()<1850)localSearch(best);\n    string ss=buildString(best);\n    auto path=findPath(ss);\n    for(auto&[r,c]:path)cout<<r<<\" \"<<c<<\"\\n\";\n    return 0;\n}","ahc030":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,MAX_OPS;double eps,coef;int ops=0;\nstruct Field{int d,hi,hj;vector<pair<int,int>>cells;vector<int>rp,cp;vector<pair<int,int>>pos;};\nvector<Field>F;vector<vector<int>>drld;vector<vector<double>>prob,ell;\nvector<double>robs,cobs;int nrr=0,nrc=0;\ndouble qdiv(const vector<pair<int,int>>&c){ops++;cout<<\"q \"<<c.size();for(auto[i,j]:c)cout<<' '<<i<<' '<<j;cout<<'\\n';cout.flush();int v;cin>>v;return v;}\nint qdrl(int i,int j){ops++;cout<<\"q 1 \"<<i<<' '<<j<<'\\n';cout.flush();int v;cin>>v;drld[i][j]=v;return v;}\nbool qans(const vector<pair<int,int>>&o){ops++;cout<<\"a \"<<o.size();for(auto[i,j]:o)cout<<' '<<i<<' '<<j;cout<<'\\n';cout.flush();int r;cin>>r;return r==1;}\nvoid do_row_col(int reps){for(int rep=0;rep<reps;rep++){for(int i=0;i<N;i++){vector<pair<int,int>>c;for(int j=0;j<N;j++)c.push_back({i,j});robs[i]+=qdiv(c);}nrr++;for(int j=0;j<N;j++){vector<pair<int,int>>c;for(int i=0;i<N;i++)c.push_back({i,j});cobs[j]+=qdiv(c);}nrc++;}}\nvoid run_mf(int nit){\n  if(!nrr&&!nrc)return;\n  double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n  vector<double>tmr(N,0),tmc(N,0);\n  for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)tmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)tmc[dj+c]+=pp*F[k].cp[c];}}\n  for(int it=0;it<nit;it++)for(int k=0;k<M;k++){\n    int np=(int)F[k].pos.size();\n    vector<double>kmr(N,0),kmc(N,0);\n    for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)kmc[dj+c]+=pp*F[k].cp[c];}\n    for(int i=0;i<N;i++)tmr[i]-=kmr[i];for(int j=0;j<N;j++)tmc[j]-=kmc[j];\n    vector<vector<double>>drow(N,vector<double>(F[k].hi+1)),dcol(N,vector<double>(F[k].hj+1));\n    for(int i=0;i<N;i++){double be=nrr*(N*eps+tmr[i]*coef),bd=robs[i]-be;for(int r=0;r<=F[k].hi;r++){double e=nrr*(N*eps+(F[k].rp[r]+tmr[i])*coef),d=robs[i]-e;drow[i][r]=(-d*d+bd*bd)/(2*vr);}}\n    for(int j=0;j<N;j++){double be=nrc*(N*eps+tmc[j]*coef),bd=cobs[j]-be;for(int c=0;c<=F[k].hj;c++){double e=nrc*(N*eps+(F[k].cp[c]+tmc[j])*coef),d=cobs[j]-e;dcol[j][c]=(-d*d+bd*bd)/(2*vc);}}\n    vector<double>ll(np,-1e300);double mx=-1e300;\n    for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];double lp=ell[k][p];for(int r=0;r<=F[k].hi;r++)lp+=drow[di+r][r];for(int c=0;c<=F[k].hj;c++)lp+=dcol[dj+c][c];ll[p]=lp;mx=max(mx,lp);}\n    double s=0;for(int p=0;p<np;p++){prob[k][p]=(ll[p]>-1e250)?exp(ll[p]-mx):0.0;s+=prob[k][p];}\n    if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;\n    fill(kmr.begin(),kmr.end(),0);fill(kmc.begin(),kmc.end(),0);\n    for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)kmc[dj+c]+=pp*F[k].cp[c];}\n    for(int i=0;i<N;i++)tmr[i]+=kmr[i];for(int j=0;j<N;j++)tmc[j]+=kmc[j];\n  }\n}\nvoid apply_constraints(){\n  for(int k=0;k<M;k++){int np=(int)F[k].pos.size();bool ch=false;\n    for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells){if(drld[di+ci][dj+cj]==0){ell[k][p]=-1e30;prob[k][p]=0;ch=true;break;}}}\n    if(ch){double s=0;for(double pp:prob[k])s+=pp;\n      if(s>1e-15){for(auto&pp:prob[k])pp/=s;}\n      else{int cnt=0;for(int p=0;p<np;p++)if(ell[k][p]>-1e29)cnt++;\n        for(int p=0;p<np;p++)prob[k][p]=(ell[k][p]>-1e29&&cnt>0)?1.0/cnt:0;\n        if(cnt==0){fill(ell[k].begin(),ell[k].end(),0);fill(prob[k].begin(),prob[k].end(),1.0/np);}}}\n  }\n}\ndouble field_entropy(int k){double H=0;for(double p:prob[k])if(p>1e-12)H-=p*log(p);return H;}\nvoid do_shape_query(int k){\n  if(ops>=MAX_OPS-5)return;int np=(int)F[k].pos.size();\n  int p1=-1,p2=-1;for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;if(p1<0||prob[k][p]>prob[k][p1]){p2=p1;p1=p;}else if(p2<0||prob[k][p]>prob[k][p2])p2=p;}\n  if(p1<0||prob[k][p1]>0.98)return;\n  auto[di1,dj1]=F[k].pos[p1];\n  vector<pair<int,int>>S;\n  if(p2>=0){auto[di2,dj2]=F[k].pos[p2];set<pair<int,int>>c2;for(auto[ci,cj]:F[k].cells)c2.insert({di2+ci,dj2+cj});for(auto[ci,cj]:F[k].cells){pair<int,int>c={di1+ci,dj1+cj};if(!c2.count(c))S.push_back(c);}if((int)S.size()<2){S.clear();for(auto[ci,cj]:F[k].cells)S.push_back({di1+ci,dj1+cj});}}\n  else{for(auto[ci,cj]:F[k].cells)S.push_back({di1+ci,dj1+cj});}\n  if((int)S.size()<2)return;\n  vector<bool>Smap(N*N,false);for(auto[i,j]:S)Smap[i*N+j]=true;\n  vector<int>ovl(np,0);for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells)if(Smap[(di+ci)*N+(dj+cj)])ovl[p]++;}\n  double omega=0;for(int m=0;m<M;m++){if(m==k)continue;for(int p=0;p<(int)F[m].pos.size();p++){double pp=prob[m][p];if(pp<1e-12)continue;auto[di,dj]=F[m].pos[p];for(auto[ci,cj]:F[m].cells)if(Smap[(di+ci)*N+(dj+cj)])omega+=pp;}}\n  double y=qdiv(S),sz=(double)S.size(),varq=max(1e-9,sz*eps*(1-eps));\n  double newmax=-1e300;\n  for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;double mu=sz*eps+((double)ovl[p]+omega)*coef,d=y-mu;ell[k][p]-=d*d/(2*varq);newmax=max(newmax,ell[k][p]);}\n  if(newmax>-1e29)for(int p=0;p<np;p++)if(ell[k][p]>-1e29)ell[k][p]-=newmax;\n}\nvector<vector<double>>get_oil_prob(){\n  vector<vector<double>>noc(N,vector<double>(N,1.0));\n  for(int k=0;k<M;k++){vector<vector<double>>cvk(N,vector<double>(N,0));for(int p=0;p<(int)F[k].pos.size();p++){double pp=prob[k][p];if(pp<1e-12)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells)cvk[di+ci][dj+cj]+=pp;}for(int i=0;i<N;i++)for(int j=0;j<N;j++)noc[i][j]*=max(0.0,1.0-cvk[i][j]);}\n  vector<vector<double>>op(N,vector<double>(N));for(int i=0;i<N;i++)for(int j=0;j<N;j++)op[i][j]=1.0-noc[i][j];return op;\n}\nvector<pair<int,int>>make_guess(const vector<vector<double>>&op,double thr=0.5){\n  vector<pair<int,int>>res;for(int i=0;i<N;i++)for(int j=0;j<N;j++){bool oil=(drld[i][j]>0)||(drld[i][j]<0&&op[i][j]>thr);if(oil)res.push_back({i,j});}return res;\n}\nint main(){\n  ios_base::sync_with_stdio(false);cin.tie(NULL);\n  cin>>N>>M>>eps;MAX_OPS=2*N*N;coef=1.0-2.0*eps;\n  drld.assign(N,vector<int>(N,-1));robs.assign(N,0.0);cobs.assign(N,0.0);\n  F.resize(M);\n  for(int k=0;k<M;k++){cin>>F[k].d;F[k].cells.resize(F[k].d);F[k].hi=F[k].hj=0;\n    for(int t=0;t<F[k].d;t++){cin>>F[k].cells[t].first>>F[k].cells[t].second;F[k].hi=max(F[k].hi,F[k].cells[t].first);F[k].hj=max(F[k].hj,F[k].cells[t].second);}\n    F[k].rp.assign(F[k].hi+1,0);F[k].cp.assign(F[k].hj+1,0);for(auto[ci,cj]:F[k].cells){F[k].rp[ci]++;F[k].cp[cj]++;}\n    for(int di=0;di+F[k].hi<N;di++)for(int dj=0;dj+F[k].hj<N;dj++)F[k].pos.push_back({di,dj});}\n  prob.resize(M);ell.resize(M);\n  for(int k=0;k<M;k++){int sz=(int)F[k].pos.size();prob[k].assign(sz,1.0/sz);ell[k].assign(sz,0.0);}\n  int n_reps=(eps>=0.15)?3:(eps>=0.08)?2:1;\n  do_row_col(n_reps);\n  run_mf(200);\n  {int qb=min(60,MAX_OPS-ops-20);\n   for(int q=0;q<qb&&ops<MAX_OPS-15;q++){\n     int bk=0;double be=field_entropy(0);for(int k=1;k<M;k++){double h=field_entropy(k);if(h>be){be=h;bk=k;}}\n     if(be<0.1)break;do_shape_query(bk);run_mf(15);}}\n  apply_constraints();run_mf(100);\n  while(ops<MAX_OPS-1){\n    auto op=get_oil_prob();auto g=make_guess(op);if(qans(g))return 0;\n    int bi=-1,bj=-1;double bunc=0;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(drld[i][j]>=0)continue;double pu=min(op[i][j],1.0-op[i][j]);if(pu>bunc){bunc=pu;bi=i;bj=j;}}\n    if(bunc<0.05||bi<0){for(int i=0;i<N&&ops<MAX_OPS-2;i++)for(int j=0;j<N&&ops<MAX_OPS-2;j++)if(drld[i][j]<0&&op[i][j]>0.05&&op[i][j]<0.95)qdrl(i,j);break;}\n    qdrl(bi,bj);apply_constraints();run_mf(20);}\n  {auto op=get_oil_prob();auto g=make_guess(op);if(ops<MAX_OPS)qans(g);}\n  return 0;\n}","ahc031":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef tuple<ll,int,int> T3;\nint W,D,N;vector<vector<int>>a;int NC;vector<vector<int>>C;vector<set<int>>SS;vector<vector<ll>>AR;\nvector<int>compute_heights(const vector<int>&days){vector<int>h(N,1);auto ben=[&](int k,int cur)->ll{ll b=0;for(int d:days){int df=a[d][k]-cur*W;if(df>0)b+=(ll)min(W,df);}return b;};priority_queue<T3>pq;for(int k=0;k<N;k++){ll b=ben(k,1);if(b>0)pq.push({b,k,1});}for(int rem=W-N;rem>0&&!pq.empty();){auto[b,k,c]=pq.top();pq.pop();if(b<=0)break;h[k]++;rem--;ll nb=ben(k,h[k]);if(nb>0)pq.push({nb,k,h[k]});}sort(h.begin(),h.end());return h;}\nll area_cost(int d,const vector<int>&h){ll c=0;for(int k=0;k<N;k++){int df=a[d][k]-h[k]*W;if(df>0)c+=(ll)df*100;}return c;}\nset<int>get_bd(const vector<int>&arr){set<int>S;int y=0;for(int i=0;i+1<(int)arr.size();i++){y+=arr[i];S.insert(y);}return S;}\nll bdist(const set<int>&A,const set<int>&B){ll c=0;for(int x:A)if(!B.count(x))c++;for(int x:B)if(!A.count(x))c++;return c*(ll)W;}\nvector<int>arr_greedy(const vector<int>&h,const set<int>&t){vector<int>tgt(t.begin(),t.end());multiset<int>av(h.begin(),h.end());vector<int>arr;int S=0,j=0,nt=(int)tgt.size();while(!av.empty()){while(j<nt&&S>=tgt[j])j++;if(j>=nt){for(int x:av)arr.push_back(x);break;}int need=tgt[j]-S;auto it=av.find(need);if(it!=av.end()){arr.push_back(need);S+=need;av.erase(it);j++;}else{auto ub=av.upper_bound(need);if(ub!=av.begin()){--ub;arr.push_back(*ub);S+=*ub;av.erase(ub);while(j<nt&&S>=tgt[j])j++;}else{it=av.begin();arr.push_back(*it);S+=*it;av.erase(it);while(j<nt&&S>=tgt[j])j++;}}}return arr;}\nvector<int>hill_climb(vector<int>arr,const set<int>&t){if(t.empty()||(int)arr.size()<=1)return arr;int n=arr.size();vector<int>ps(n+1,0);for(int i=0;i<n;i++)ps[i+1]=ps[i]+arr[i];bool impr=true;while(impr){impr=false;for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(arr[i]==arr[j])continue;int delta=arr[j]-arr[i],gain=0;for(int k=i+1;k<=j;k++){gain-=(int)t.count(ps[k]);gain+=(int)t.count(ps[k]+delta);}if(gain>0){swap(arr[i],arr[j]);for(int k=i+1;k<=j;k++)ps[k]+=delta;impr=true;}}}}return arr;}\nvoid out_sol(const vector<vector<int>>&arrs){for(int d=0;d<D;d++){const auto&arr=arrs[d];vector<int>y(N+1);y[0]=0;for(int i=0;i<N;i++)y[i+1]=y[i]+arr[i];vector<pair<int,int>>s(N);for(int i=0;i<N;i++)s[i]={arr[i],y[i]};sort(s.begin(),s.end());for(int k=0;k<N;k++)cout<<s[k].second<<\" 0 \"<<s[k].second+s[k].first<<\" \"<<W<<\"\\n\";}}\nvoid rebuild(const vector<int>&s,vector<set<int>>&Sv,vector<ll>&dc,int from){for(int d=from;d<D;d++){set<int>prev=(d>0)?Sv[d-1]:set<int>();if(d>0&&s[d]==s[d-1]){Sv[d]=Sv[d-1];dc[d]=AR[d][s[d]];}else{auto arr=arr_greedy(C[s[d]],prev);Sv[d]=get_bd(arr);dc[d]=AR[d][s[d]]+(d>0?bdist(prev,Sv[d]):0LL);}}}\nvector<int>local_search(vector<int>s){vector<set<int>>Sv(D);vector<ll>dc(D,0);rebuild(s,Sv,dc,0);for(int iter=0;iter<20;iter++){bool any=false;for(int d=0;d<D;d++){int bL=s[d];ll bD=0;ll od=dc[d],od1=(d+1<D?dc[d+1]:0LL);for(int L=0;L<NC;L++){if(L==s[d])continue;set<int>prev=(d>0)?Sv[d-1]:set<int>();auto na=arr_greedy(C[L],prev);auto nSd=get_bd(na);ll ndd=AR[d][L]+(d>0?bdist(prev,nSd):0LL);ll ndd1=0;if(d+1<D){ndd1=AR[d+1][s[d+1]];if(s[d+1]!=L)ndd1+=bdist(nSd,get_bd(arr_greedy(C[s[d+1]],nSd)));}ll delta=(ndd+ndd1)-(od+od1);if(delta<bD){bD=delta;bL=L;}}if(bL!=s[d]){s[d]=bL;rebuild(s,Sv,dc,d);any=true;}}if(!any)break;}return s;}\npair<ll,vector<vector<int>>>solve_final(const vector<int>&s){vector<vector<int>>arrs(D);ll cost=0;arrs[0]=C[s[0]];cost+=AR[0][s[0]];set<int>cur=get_bd(arrs[0]);for(int d=1;d<D;d++){if(s[d]==s[d-1]){arrs[d]=arrs[d-1];cost+=AR[d][s[d]];}else{arrs[d]=hill_climb(arr_greedy(C[s[d]],cur),cur);set<int>ns=get_bd(arrs[d]);cost+=AR[d][s[d]]+bdist(cur,ns);cur=ns;}}return{cost,arrs};}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>W>>D>>N;a.resize(D,vector<int>(N));for(int d=0;d<D;d++)for(int k=0;k<N;k++)cin>>a[d][k];\n    vector<int>aidx(D);iota(aidx.begin(),aidx.end(),0);\n    C.push_back(compute_heights(aidx));\n    for(int d=0;d<D;d++)C.push_back(compute_heights({d}));\n    for(int d=0;d+1<D;d++)C.push_back(compute_heights({d,d+1}));\n    for(int d=0;d+2<D;d++)C.push_back(compute_heights({d,d+1,d+2}));\n    NC=(int)C.size();\n    SS.resize(NC);for(int L=0;L<NC;L++)SS[L]=get_bd(C[L]);\n    AR.assign(D,vector<ll>(NC));for(int d=0;d<D;d++)for(int L=0;L<NC;L++)AR[d][L]=area_cost(d,C[L]);\n    vector<vector<ll>>pcg(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++){if(L1==L2)continue;pcg[L1][L2]=bdist(SS[L1],get_bd(arr_greedy(C[L2],SS[L1])));}\n    const ll INF=2e18;\n    vector<vector<ll>>dp(D,vector<ll>(NC,INF));vector<vector<int>>frm(D,vector<int>(NC,-1));\n    for(int L=0;L<NC;L++)dp[0][L]=AR[0][L];\n    for(int d=1;d<D;d++)for(int L=0;L<NC;L++)for(int pL=0;pL<NC;pL++){if(dp[d-1][pL]==INF)continue;ll c=dp[d-1][pL]+pcg[pL][L]+AR[d][L];if(c<dp[d][L]){dp[d][L]=c;frm[d][L]=pL;}}\n    int bL2=(int)(min_element(dp[D-1].begin(),dp[D-1].end())-dp[D-1].begin());\n    vector<int>dpseq(D);dpseq[D-1]=bL2;for(int d=D-2;d>=0;d--)dpseq[d]=frm[d+1][dpseq[d+1]];\n    vector<int>gseq(D);\n    {vector<set<int>>Sv(D);int L0=0;for(int L=0;L<NC;L++)if(AR[0][L]<AR[0][L0])L0=L;gseq[0]=L0;Sv[0]=get_bd(C[gseq[0]]);for(int d=1;d<D;d++){ll bc=INF;int bL=gseq[d-1];for(int L=0;L<NC;L++){ll c=AR[d][L];if(L!=gseq[d-1])c+=bdist(Sv[d-1],get_bd(arr_greedy(C[L],Sv[d-1])));if(c<bc){bc=c;bL=L;}}gseq[d]=bL;Sv[d]=(bL==gseq[d-1])?Sv[d-1]:get_bd(arr_greedy(C[bL],Sv[d-1]));}}\n    vector<int>apseq(D);for(int d=0;d<D;d++)apseq[d]=d+1;\n    auto[c1,a1]=solve_final(local_search(dpseq));\n    auto[c2,a2]=solve_final(local_search(gseq));\n    auto[c3,a3]=solve_final(local_search(apseq));\n    ll bc=min({c1,c2,c3});\n    if(bc==c1)out_sol(a1);else if(bc==c2)out_sol(a2);else out_sol(a3);\n    return 0;\n}","ahc032":"#include <bits/stdc++.h>\nusing namespace std;\nusing namespace chrono;\nconstexpr long long MOD = 998244353;\nint N, M, K;\nlong long sv[20][3][3];\nlong long b[9][9];\nlong long cur_score;\ninline long long add_mod(long long a, long long c) { long long s=a+c; return s>=MOD?s-MOD:s; }\ninline long long sub_mod(long long a, long long c) { return a>=c?a-c:a-c+MOD; }\nvoid apply_s(int m,int p,int q){ for(int i=0;i<3;i++) for(int j=0;j<3;j++){ long long &cell=b[p+i][q+j]; long long nv=add_mod(cell,sv[m][i][j]); cur_score+=nv-cell; cell=nv; } }\nvoid undo_s(int m,int p,int q){ for(int i=0;i<3;i++) for(int j=0;j<3;j++){ long long &cell=b[p+i][q+j]; long long nv=sub_mod(cell,sv[m][i][j]); cur_score+=nv-cell; cell=nv; } }\nstruct Op{int m,p,q;};\nvoid fwd_greedy(vector<Op>&ops){ while((int)ops.size()<K){ long long bg=0;int bm=-1,bp=-1,bq=-1; for(int m=0;m<M;m++) for(int p=0;p<=N-3;p++) for(int q=0;q<=N-3;q++){ long long g=0; for(int i=0;i<3;i++) for(int j=0;j<3;j++) g+=add_mod(b[p+i][q+j],sv[m][i][j])-b[p+i][q+j]; if(g>bg){bg=g;bm=m;bp=p;bq=q;} } if(bm<0)break; apply_s(bm,bp,bq);ops.push_back({bm,bp,bq}); } }\nbool bwd_greedy(vector<Op>&ops){ bool imp=false; for(int idx=0;idx<(int)ops.size();){ long long s0=cur_score; undo_s(ops[idx].m,ops[idx].p,ops[idx].q); if(cur_score>s0){ops[idx]=ops.back();ops.pop_back();imp=true;} else{apply_s(ops[idx].m,ops[idx].p,ops[idx].q);++idx;} } return imp; }\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>M>>K; cur_score=0;\n    for(int i=0;i<N;i++) for(int j=0;j<N;j++){cin>>b[i][j];b[i][j]%=MOD;cur_score+=b[i][j];}\n    for(int m=0;m<M;m++) for(int i=0;i<3;i++) for(int j=0;j<3;j++) cin>>sv[m][i][j];\n    vector<Op>ops;ops.reserve(K);\n    fwd_greedy(ops);\n    for(int cyc=0;cyc<20;cyc++){if(!bwd_greedy(ops))break;fwd_greedy(ops);}\n    long long best_score=cur_score; vector<Op>best_ops=ops;\n    mt19937 rng(42); const int POS=N-2;\n    auto rand_op=[&]()->Op{return{(int)(rng()%M),(int)(rng()%POS),(int)(rng()%POS)};};\n    auto t0=steady_clock::now(); const long long TL_US=1850000;\n    double T_start=1e8;\n    if(!ops.empty()){ long long sumd=0;int cnt=0; for(int i=0;i<5000;i++){ int L=(int)ops.size();if(!L)break; int idx=rng()%L; Op old_op=ops[idx],new_op=rand_op(); long long s0=cur_score; undo_s(old_op.m,old_op.p,old_op.q); apply_s(new_op.m,new_op.p,new_op.q); long long d=cur_score-s0;sumd+=(d<0?-d:d);cnt++; undo_s(new_op.m,new_op.p,new_op.q); apply_s(old_op.m,old_op.p,old_op.q); } if(cnt>0)T_start=max(1.0,(double)sumd/cnt); }\n    double T=T_start,T_end=max(T_start*1e-7,1.0);\n    for(long long it=0;;it++){\n        if(it%50000==0){ long long el=duration_cast<microseconds>(steady_clock::now()-t0).count(); if(el>=TL_US)break; T=T_start*pow(T_end/T_start,(double)el/TL_US); }\n        int L=(int)ops.size(); Op n1=rand_op(),o1{},o2{},n2{}; int i1=-1,i2=-1,mt;\n        if(L==0){mt=0;} else{ int r=(int)(rng()%10); if(L==K)mt=(r<2)?1:(r<7)?2:3; else mt=(r<2)?0:(r<3)?1:(r<7)?2:3; if(mt==3&&L<2)mt=2; }\n        if(mt==1||mt==2){i1=(int)(rng()%L);o1=ops[i1];}\n        if(mt==3){i1=(int)(rng()%L);do{i2=(int)(rng()%L);}while(i2==i1);o1=ops[i1];o2=ops[i2];n2=rand_op();}\n        long long s0=cur_score;\n        switch(mt){ case 0:apply_s(n1.m,n1.p,n1.q);break; case 1:undo_s(o1.m,o1.p,o1.q);break; case 2:undo_s(o1.m,o1.p,o1.q);apply_s(n1.m,n1.p,n1.q);break; case 3:undo_s(o1.m,o1.p,o1.q);undo_s(o2.m,o2.p,o2.q);apply_s(n1.m,n1.p,n1.q);apply_s(n2.m,n2.p,n2.q);break; }\n        long long delta=cur_score-s0; bool acc;\n        if(delta>=0)acc=true; else if(T<=0.5)acc=false; else acc=(double)(rng()%1000000)<exp((double)delta/T)*1e6;\n        if(acc){ switch(mt){ case 0:ops.push_back(n1);break; case 1:ops[i1]=ops.back();ops.pop_back();break; case 2:ops[i1]=n1;break; case 3:ops[i1]=n1;ops[i2]=n2;break; } if(cur_score>best_score){best_score=cur_score;best_ops=ops;} }\n        else{ switch(mt){ case 0:undo_s(n1.m,n1.p,n1.q);break; case 1:apply_s(o1.m,o1.p,o1.q);break; case 2:undo_s(n1.m,n1.p,n1.q);apply_s(o1.m,o1.p,o1.q);break; case 3:undo_s(n2.m,n2.p,n2.q);undo_s(n1.m,n1.p,n1.q);apply_s(o2.m,o2.p,o2.q);apply_s(o1.m,o1.p,o1.q);break; } }\n    }\n    cout<<best_ops.size()<<'\\n'; for(auto&op:best_ops)cout<<op.m<<' '<<op.p<<' '<<op.q<<'\\n';\n    return 0;\n}","ahc033":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=5;\nint A[N][N],posR[N*N],posP[N*N],grid[N][N];\nint craneR,craneC,craneContainer;\nbool craneHolding;\nint recvSent[N],recvPickedUp[N],dispatchCount[N];\nmap<int,pair<int,int>> bufPos;\nset<pair<int,int>> usedBufs;\nbool done_[N*N];\nstring result;\nvoid sRecv(){for(int r=0;r<N;r++){bool bl=craneHolding&&craneR==r&&craneC==0;if(!bl&&grid[r][0]==-1&&recvSent[r]<N)grid[r][0]=A[r][recvSent[r]++];}}\nvoid sDisp(){for(int r=0;r<N;r++)if(grid[r][N-1]!=-1){dispatchCount[r]++;grid[r][N-1]=-1;}}\nvoid act(char c){result+=c;if(c=='P'){craneContainer=grid[craneR][craneC];grid[craneR][craneC]=-1;craneHolding=true;}else if(c=='Q'){grid[craneR][craneC]=craneContainer;craneHolding=false;craneContainer=-1;}else if(c=='U')craneR--;else if(c=='D')craneR++;else if(c=='L')craneC--;else if(c=='R')craneC++;}\nvoid turn_(char c){sRecv();act(c);sDisp();}\nvoid goto_(int tr,int tc){while(craneR!=tr||craneC!=tc){if(craneR<tr)turn_('D');else if(craneR>tr)turn_('U');else if(craneC<tc)turn_('R');else turn_('L');}}\nvoid pickup_(int r,int c,bool ig){while(grid[r][c]==-1){if(ig&&recvSent[r]<N){turn_('P');return;}turn_('.');}turn_('P');}\npair<int,int> freeBuf(int tR=-1){\n    if(tR>=0)for(int c=N-2;c>=1;c--){auto p=make_pair(tR,c);if(!usedBufs.count(p)&&grid[tR][c]==-1)return p;}\n    for(int c=N-2;c>=1;c--)for(int r=0;r<N;r++){auto p=make_pair(r,c);if(!usedBufs.count(p)&&grid[r][c]==-1)return p;}\n    for(int r=0;r<N;r++)if(recvSent[r]==N){auto p=make_pair(r,0);if(!usedBufs.count(p)&&grid[r][0]==-1)return p;}\n    return{-1,-1};\n}\nint nNext(int g){return dispatchCount[g]<N?N*g+dispatchCount[g]:-1;}\nvoid deliver_(int sR,int sC,bool ib,bool ig,int d){goto_(sR,sC);pickup_(sR,sC,ig);int c=craneContainer;if(ib){usedBufs.erase({sR,sC});bufPos.erase(c);}else if(ig)recvPickedUp[sR]++;done_[c]=true;goto_(d,N-1);turn_('Q');}\nvoid bufGate_(int r,int dR,int dC){goto_(r,0);pickup_(r,0,true);int c=craneContainer;recvPickedUp[r]++;usedBufs.insert({dR,dC});bufPos[c]={dR,dC};goto_(dR,dC);turn_('Q');}\nvoid clearB_(int r){int bl=A[r][recvPickedUp[r]],gb=bl/N;if(nNext(gb)==bl)deliver_(r,0,false,true,gb);else{auto[br,bc]=freeBuf(gb);if(br!=-1)bufGate_(r,br,bc);else deliver_(r,0,false,true,gb);}}\nvoid delGate(int g){int k=nNext(g);if(k<0||done_[k])return;if(bufPos.count(k)){auto[br,bc]=bufPos[k];deliver_(br,bc,true,false,g);}else{int r=posR[k],p=posP[k];while(recvPickedUp[r]<p)clearB_(r);deliver_(r,0,false,true,g);}}\nvector<int> plan(){\n    const int ND=N+1;int DB=1;for(int i=0;i<N;i++)DB*=ND;const int NS=DB*N*N;\n    auto enc=[&](array<int,N>d,int r,int c)->int{int s=0;for(int i=0;i<N;i++)s=s*ND+d[i];return s*N*N+r*N+c;};\n    auto dec=[&](int s,array<int,N>&d,int&r,int&c){c=s%N;s/=N;r=s%N;s/=N;for(int i=N-1;i>=0;i--){d[i]=s%ND;s/=ND;}};\n    vector<int>dist(NS,INT_MAX/2),pS(NS,-1),pG(NS,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;\n    array<int,N>d0{};int s0=enc(d0,0,0);dist[s0]=0;pq.push({0,s0});\n    while(!pq.empty()){auto[w,s]=pq.top();pq.pop();if(w>dist[s])continue;array<int,N>d;int r,c;dec(s,d,r,c);\n        for(int g=0;g<N;g++){if(d[g]>=N)continue;int k=N*g+d[g],sR=posR[k];\n            int tc=abs(r-sR)+c+abs(sR-g)+(N-1)+2+posP[k]*5;\n            auto nd=d;nd[g]++;int ns=enc(nd,g,N-1);\n            if(dist[s]+tc<dist[ns]){dist[ns]=dist[s]+tc;pS[ns]=s;pG[ns]=g;pq.push({dist[ns],ns});}}}\n    array<int,N>gD;gD.fill(N);int best=-1,bd=INT_MAX;\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int gs=enc(gD,r,c);if(dist[gs]<bd){bd=dist[gs];best=gs;}}\n    vector<int>ord;if(best!=-1)for(int s=best;pS[s]!=-1;s=pS[s])ord.push_back(pG[s]);\n    reverse(ord.begin(),ord.end());return ord;\n}\nvoid solve(){\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)grid[r][c]=-1;\n    craneR=craneC=0;craneHolding=false;craneContainer=-1;\n    fill(recvSent,recvSent+N,0);fill(recvPickedUp,recvPickedUp+N,0);\n    fill(dispatchCount,dispatchCount+N,0);fill(done_,done_+N*N,false);\n    bufPos.clear();usedBufs.clear();result.clear();\n    for(int r=0;r<N;r++)for(int p=0;p<N;p++){posR[A[r][p]]=r;posP[A[r][p]]=p;}\n    auto ord=plan();for(int g:ord)delGate(g);\n    for(int it=0;it<3000;it++){\n        bool done=true;for(int i=0;i<N;i++)if(dispatchCount[i]<N){done=false;break;}if(done)break;\n        int bK=-1,bSc=INT_MAX,bSR=-1,bSC=-1;bool bBuf=false;\n        for(int g=0;g<N;g++){int k=nNext(g);if(k<0||done_[k])continue;int sR,sC;bool ib;\n            if(bufPos.count(k)){auto&bp=bufPos[k];sR=bp.first;sC=bp.second;ib=true;}\n            else{int r=posR[k],p=posP[k];if(recvPickedUp[r]!=p)continue;sR=r;sC=0;ib=false;}\n            int sc=abs(craneR-sR)+abs(craneC-sC)+abs(sR-g)+abs(sC-(N-1));\n            if(sc<bSc){bSc=sc;bK=k;bSR=sR;bSC=sC;bBuf=ib;}}\n        if(bK>=0)deliver_(bSR,bSC,bBuf,!bBuf,bK/N);\n        else{int bG=-1,bD=INT_MAX;\n            for(int g=0;g<N;g++){int k=nNext(g);if(k<0||done_[k]||bufPos.count(k))continue;\n                int r=posR[k],p=posP[k];if(recvPickedUp[r]==p)continue;\n                int d=abs(craneR-r)+abs(craneC);if(d<bD){bD=d;bG=g;}}\n            if(bG>=0)clearB_(posR[nNext(bG)]);}\n    }\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    int n;cin>>n;for(int r=0;r<N;r++)for(int p=0;p<N;p++)cin>>A[r][p];\n    solve();cout<<result<<\"\\n\";for(int i=1;i<N;i++)cout<<\"B\\n\";return 0;\n}","ahc034":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N;\nint h[20][20];\nint curR, curC, curLoad;\nvector<string> ops;\n\nvoid doLoad(int d) {\n    if (d <= 0) return;\n    ops.push_back(\"+\" + to_string(d));\n    h[curR][curC] -= d; curLoad += d;\n}\n\nvoid doUnload(int d) {\n    d = min(d, curLoad);\n    if (d <= 0) return;\n    ops.push_back(\"-\" + to_string(d));\n    h[curR][curC] += d; curLoad -= d;\n}\n\nvoid moveStep(char dir, int dr, int dc) {\n    curR += dr; curC += dc;\n    ops.push_back(string(1, dir));\n    if (h[curR][curC] > 0) doLoad(h[curR][curC]);\n    else if (h[curR][curC] < 0 && curLoad > 0) doUnload(min(curLoad, -h[curR][curC]));\n}\n\nvoid moveTo(int tr, int tc) {\n    while (curR != tr || curC != tc) {\n        bool canR = (curR != tr), canC = (curC != tc);\n        if (canR && canC) {\n            int dr = curR < tr ? 1 : -1, dc = curC < tc ? 1 : -1;\n            int nextRh = h[curR + dr][curC], nextCh = h[curR][curC + dc];\n            int valR, valC;\n            if (curLoad > 0) {\n                valR = abs(nextRh); valC = abs(nextCh);\n            } else {\n                valR = max(0, nextRh); valC = max(0, nextCh);\n                if (valR == 0 && valC == 0) { valR = abs(nextRh); valC = abs(nextCh); }\n            }\n            if (valR >= valC) moveStep(dr > 0 ? 'D' : 'U', dr, 0);\n            else moveStep(dc > 0 ? 'R' : 'L', 0, dc);\n        } else if (canR) {\n            int dr = curR < tr ? 1 : -1;\n            moveStep(dr > 0 ? 'D' : 'U', dr, 0);\n        } else {\n            int dc = curC < tc ? 1 : -1;\n            moveStep(dc > 0 ? 'R' : 'L', 0, dc);\n        }\n    }\n}\n\nbool allZero() {\n    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) if (h[i][j] != 0) return false;\n    return true;\n}\n\nint main() {\n    ios::sync_with_stdio(false); cin.tie(0);\n    cin >> N;\n    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) cin >> h[i][j];\n    curR = curC = curLoad = 0;\n    if (h[0][0] > 0) doLoad(h[0][0]);\n    while (!allZero() && (int)ops.size() < 95000) {\n        auto mhdist = [&](int i, int j) { return abs(i-curR)+abs(j-curC); };\n        if (curLoad > 0) {\n            int best = INT_MAX, bi = -1, bj = -1;\n            for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)\n                if (h[i][j] < 0) { int d = mhdist(i,j); if (d < best) { best=d; bi=i; bj=j; } }\n            if (bi < 0) break;\n            moveTo(bi, bj);\n            if (h[bi][bj] < 0 && curLoad > 0) doUnload(min(curLoad, -h[bi][bj]));\n        } else {\n            double bestScore = -1; int bi = -1, bj = -1;\n            for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)\n                if (h[i][j] > 0) {\n                    double s = (double)h[i][j] / (mhdist(i,j) + 1);\n                    if (s > bestScore) { bestScore = s; bi = i; bj = j; }\n                }\n            if (bi < 0) break;\n            moveTo(bi, bj);\n            if (h[bi][bj] > 0) doLoad(h[bi][bj]);\n        }\n    }\n    for (const auto& op : ops) cout << op << \"\\n\";\n    return 0;\n}","ahc035":"#include <bits/stdc++.h>\nusing namespace std;\nint main(){\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,T; cin>>N>>M>>T;\n    const int SC=2*N*(N-1),nn=N*N;\n    vector<vector<int>> X(SC,vector<int>(M));\n    for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    mt19937 rng(42);\n    vector<array<int,4>> nbr(nn); vector<int> ndeg(nn,0);\n    for(int p=0;p<nn;p++){int r=p/N,c=p%N;if(r>0)nbr[p][ndeg[p]++]=p-N;if(r<N-1)nbr[p][ndeg[p]++]=p+N;if(c>0)nbr[p][ndeg[p]++]=p-1;if(c<N-1)nbr[p][ndeg[p]++]=p+1;}\n    for(int turn=0;turn<T;turn++){\n        auto ts=chrono::steady_clock::now();\n        vector<int> vals(SC,0);\n        for(int k=0;k<SC;k++) for(int l=0;l<M;l++) vals[k]+=X[k][l];\n        vector<bool> ins(SC,false); vector<int> sel;\n        for(int l=0;l<M;l++){int bk=0;for(int k=1;k<SC;k++)if(X[k][l]>X[bk][l])bk=k;if(!ins[bk]){ins[bk]=true;sel.push_back(bk);}}\n        {vector<int> ord(SC);iota(ord.begin(),ord.end(),0);sort(ord.begin(),ord.end(),[&](int a,int b){return vals[a]>vals[b];});for(int k:ord){if((int)sel.size()>=nn)break;if(!ins[k]){ins[k]=true;sel.push_back(k);}}}\n        vector<int> pst(nn*nn);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++){int s=0;for(int l=0;l<M;l++)s+=max(X[sel[i]][l],X[sel[j]][l]);pst[i*nn+j]=s;}\n        vector<int> psum(nn,0);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++) psum[i]+=pst[i*nn+j];\n        auto ctrb=[&](const vector<int>&g,int p)->int{int v=0;for(int d=0;d<ndeg[p];d++)v+=pst[g[p]*nn+g[nbr[p][d]]];return v;};\n        auto totsc=[&](const vector<int>&g)->int{int s=0;for(int p=0;p<nn;p++){if((p%N)<N-1)s+=pst[g[p]*nn+g[p+1]];if(p<nn-N)s+=pst[g[p]*nn+g[p+N]];}return s;};\n        auto locsrch=[&](vector<int> g)->vector<int>{bool imp=true;while(imp){imp=false;for(int a=0;a<nn;a++)for(int b=a+1;b<nn;b++){int bef=ctrb(g,a)+ctrb(g,b);swap(g[a],g[b]);int aft=ctrb(g,a)+ctrb(g,b);if(aft>bef)imp=true;else swap(g[a],g[b]);}}return g;};\n        auto grinit=[&]()->vector<int>{vector<int> g(nn,-1);vector<bool> used(nn,false);for(int pos=0;pos<nn;pos++){int r=pos/N,c=pos%N;int bs=-1;int64_t bv=-1;for(int s=0;s<nn;s++){if(used[s])continue;int cv=0;if(r>0)cv+=pst[s*nn+g[pos-N]];if(c>0)cv+=pst[s*nn+g[pos-1]];int64_t ev=(int64_t)cv*1000000LL+psum[s];if(ev>bv){bv=ev;bs=s;}}g[pos]=bs;used[bs]=true;}return g;};\n        int gbest=-1; vector<int> bg;\n        for(int rest=0;rest<3;rest++){\n            double rt0=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n            if(rt0>=0.185) break;\n            double tl=(0.185-rt0)/(3-rest),tend=rt0+tl;\n            vector<int> g(nn); double T0;\n            if(rest==0){g=grinit();T0=200.0;}else{iota(g.begin(),g.end(),0);shuffle(g.begin(),g.end(),rng);T0=1000.0;}\n            int cur=totsc(g),lb=cur; vector<int> lg=g; double temp=T0;\n            for(int it=0;;it++){\n                if((it&0x7FF)==0){double now=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(now>=tend)break;temp=T0*pow(0.1/T0,(now-rt0)/tl);}\n                int p1=rng()%nn,p2=rng()%nn; if(p1==p2)continue;\n                int bef=ctrb(g,p1)+ctrb(g,p2); swap(g[p1],g[p2]); int aft=ctrb(g,p1)+ctrb(g,p2); int d=aft-bef;\n                if(d>=0||(rng()%1000000)<(int)(1e6*exp((double)d/temp))){cur+=d;if(cur>lb){lb=cur;lg=g;}}else swap(g[p1],g[p2]);\n            }\n            lg=locsrch(lg); int sc=totsc(lg); if(sc>gbest){gbest=sc;bg=lg;}\n        }\n        for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(j)cout<<' ';cout<<sel[bg[i*N+j]];}cout<<'\\n';}\n        cout.flush();\n        for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    }\n    return 0;\n}","ahc038":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,V;\nconst int DR[]={0,1,0,-1},DC[]={1,0,-1,0};\nint rx,ry,nfp,Vp,rfp=-1;\nint fpd[4],hld[4];\nstruct Del{int sr,sc,tr,tc;bool done;};\nvector<Del>P;\nint np;\nvector<vector<int>>g;\nmap<pair<int,int>,int>sm;\nvector<string>ops;\n\nvoid em(char mv){\n    if(mv=='D')rx++;else if(mv=='U')rx--;else if(mv=='R')ry++;else if(mv=='L')ry--;\n    string op(2*Vp,'.');op[0]=mv;\n    for(int k=0;k<nfp;k++){\n        int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];\n        if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(hld[k]<0){\n            if(k==rfp)continue;\n            auto it=sm.find({fr,fc});\n            if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}\n        }else{\n            int di=hld[k];\n            if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}\n        }\n    }\n    ops.push_back(op);\n}\nbool navto(int tr,int tc){\n    while((rx!=tr||ry!=tc)&&(int)ops.size()<99990){\n        char mv='.';\n        if(rx<tr)mv='D';else if(rx>tr)mv='U';else if(ry<tc)mv='R';else mv='L';\n        em(mv);\n    }\n    return rx==tr&&ry==tc;\n}\nint pickfp(int di,int r,int c){\n    sm.erase({r,c});\n    int bk=-1,br=-1,bc=-1,bv=INT_MAX;\n    for(int k=0;k<nfp;k++){\n        if(hld[k]>=0)continue;\n        int ar=r-DR[fpd[k]],ac=c-DC[fpd[k]];\n        if(ar<0||ar>=N||ac<0||ac>=N)continue;\n        int tar=P[di].tr-DR[fpd[k]],tac=P[di].tc-DC[fpd[k]];\n        if(tar<0||tar>=N||tac<0||tac>=N)continue;\n        int v=abs(rx-ar)+abs(ry-ac);\n        if(v<bv){bv=v;bk=k;br=ar;bc=ac;}\n    }\n    if(bk<0){\n        bv=INT_MAX;\n        for(int k=0;k<nfp;k++){\n            if(hld[k]>=0)continue;\n            int ar=r-DR[fpd[k]],ac=c-DC[fpd[k]];\n            if(ar<0||ar>=N||ac<0||ac>=N)continue;\n            int v=abs(rx-ar)+abs(ry-ac);\n            if(v<bv){bv=v;bk=k;br=ar;bc=ac;}\n        }\n    }\n    if(bk<0){sm[{r,c}]=di;return -1;}\n    rfp=bk;bool ok2=navto(br,bc);rfp=-1;\n    if(!ok2){sm[{r,c}]=di;return -1;}\n    if((int)ops.size()>=99990){sm[{r,c}]=di;return -1;}\n    string op(2*Vp,'.');bool ok=false;\n    for(int k=0;k<nfp;k++){\n        int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];\n        if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k==bk&&fr==r&&fc==c&&g[r][c]==1&&hld[k]<0){hld[k]=di;g[r][c]=0;op[Vp+1+k]='P';ok=true;}\n        else if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n        else{int di2=hld[k];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n    }\n    ops.push_back(op);\n    if(!ok){sm[{r,c}]=di;return -1;}\n    return bk;\n}\nbool dropfp(int k,int di){\n    if(hld[k]!=di)return true;\n    int r=P[di].tr,c=P[di].tc;\n    int ar=r-DR[fpd[k]],ac=c-DC[fpd[k]];\n    if(ar<0||ar>=N||ac<0||ac>=N)return false;\n    navto(ar,ac);\n    if(hld[k]!=di)return true;\n    if((int)ops.size()>=99990)return false;\n    string op(2*Vp,'.');bool ok=false;\n    for(int k2=0;k2<nfp;k2++){\n        int fr=rx+DR[fpd[k2]],fc=ry+DC[fpd[k2]];\n        if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k2==k&&fr==r&&fc==c&&g[r][c]==0&&hld[k2]==di){g[r][c]=1;P[di].done=true;hld[k2]=-1;op[Vp+1+k2]='P';ok=true;}\n        else if(hld[k2]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k2]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k2]='P';}}\n        else{int di2=hld[k2];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k2]=-1;op[Vp+1+k2]='P';}}\n    }\n    ops.push_back(op);\n    return ok;\n}\nbool cbh(int bk){\n    if(hld[bk]<0)return false;\n    int di=hld[bk];\n    auto valid=[&](int r,int c)->bool{int a=r-DR[fpd[bk]],b=c-DC[fpd[bk]];return a>=0&&a<N&&b>=0&&b<N;};\n    pair<int,int>tmp={-1,-1};\n    {\n        set<pair<int,int>>ts;\n        for(auto&d:P)if(!d.done)ts.insert({d.tr,d.tc});\n        for(int i=0;i<N&&tmp.first<0;i++)for(int j=0;j<N&&tmp.first<0;j++)\n            if(!g[i][j]&&!ts.count({i,j})&&valid(i,j))tmp={i,j};\n        if(tmp.first<0)for(int i=0;i<N&&tmp.first<0;i++)for(int j=0;j<N&&tmp.first<0;j++)\n            if(!g[i][j]&&valid(i,j))tmp={i,j};\n    }\n    if(tmp.first<0)return false;\n    int otr=P[di].tr,otc=P[di].tc;\n    P[di].tr=tmp.first;P[di].tc=tmp.second;g[tmp.first][tmp.second]=0;\n    if(dropfp(bk,di)){\n        P[di].done=false;P[di].tr=otr;P[di].tc=otc;\n        P[di].sr=tmp.first;P[di].sc=tmp.second;sm[{tmp.first,tmp.second}]=di;return true;\n    }else{\n        P[di].tr=otr;P[di].tc=otc;\n        if(!g[tmp.first][tmp.second])g[tmp.first][tmp.second]=1;\n        hld[bk]=-1;return false;\n    }\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>V;\n    vector<string>sg(N),tg(N);\n    for(auto&s:sg)cin>>s;for(auto&s:tg)cin>>s;\n    vector<pair<int,int>>S,T;\n    g.assign(N,vector<int>(N,0));\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){\n        if(sg[i][j]=='1'){S.push_back({i,j});g[i][j]=1;}\n        if(tg[i][j]=='1')T.push_back({i,j});\n    }\n    int m=M;\n    nfp=min(V-1,4);Vp=nfp+1;\n    cout<<Vp<<\"\\n\";\n    for(int k=0;k<nfp;k++)cout<<\"0 1\\n\";\n    cout<<\"0 0\\n\";\n    rx=ry=0;\n    for(int k=0;k<nfp;k++){hld[k]=-1;fpd[k]=0;}\n    // Matching\n    vector<int>mt(m,-1);\n    {\n        vector<bool>su(m,false),tu(m,false);\n        for(int i=0;i<m;i++)if(!su[i])\n            for(int j=0;j<m;j++)if(!tu[j]&&S[i]==T[j]){mt[i]=j;su[i]=tu[j]=true;break;}\n        for(int i=0;i<m;i++){\n            if(su[i])continue;\n            int bj=-1,bd=INT_MAX;\n            for(int j=0;j<m;j++){\n                if(tu[j])continue;\n                int d=abs(S[i].first-T[j].first)+abs(S[i].second-T[j].second);\n                if(d<bd){bd=d;bj=j;}\n            }\n            mt[i]=bj;su[i]=tu[bj]=true;\n        }\n        bool imp=true;\n        while(imp){\n            imp=false;\n            for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){\n                int si0=S[i].first,si1=S[i].second,sj0=S[j].first,sj1=S[j].second;\n                int ti0=T[mt[i]].first,ti1=T[mt[i]].second,tj0=T[mt[j]].first,tj1=T[mt[j]].second;\n                if(abs(si0-tj0)+abs(si1-tj1)+abs(sj0-ti0)+abs(sj1-ti1)<\n                   abs(si0-ti0)+abs(si1-ti1)+abs(sj0-tj0)+abs(sj1-tj1)){swap(mt[i],mt[j]);imp=true;}\n            }\n        }\n    }\n    P.clear();\n    for(int i=0;i<m;i++)\n        if(S[i]!=T[mt[i]])P.push_back({S[i].first,S[i].second,T[mt[i]].first,T[mt[i]].second,false});\n    np=(int)P.size();\n    sm.clear();for(int i=0;i<np;i++)sm[{P[i].sr,P[i].sc}]=i;\n    // Orientation turns (with action checks)\n    auto orient_check=[&](string&op){\n        for(int k=0;k<nfp;k++){\n            int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];\n            if(fr<0||fr>=N||fc<0||fc>=N)continue;\n            if(hld[k]<0){\n                auto it=sm.find({fr,fc});\n                if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}\n            }else{\n                int di=hld[k];\n                if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}\n            }\n        }\n    };\n    if(nfp>=2){\n        string op(2*Vp,'.');\n        if(nfp>=2){op[2]='R';fpd[1]=1;}\n        if(nfp>=3){op[3]='R';fpd[2]=1;}\n        if(nfp>=4){op[4]='L';fpd[3]=3;}\n        orient_check(op);ops.push_back(op);\n    }\n    if(nfp>=3){\n        string op(2*Vp,'.');op[3]='R';fpd[2]=2;\n        orient_check(op);ops.push_back(op);\n    }\n    int stall=0;\n    while((int)ops.size()<97000){\n        int tdone=0;for(auto&d:P)if(d.done)tdone++;\n        if(tdone==np)break;\n        bool prog=false;\n        // Step 1: deliver nearest held with unblocked target\n        {\n            int bk=-1,bd=INT_MAX;\n            for(int k=0;k<nfp;k++){\n                if(hld[k]<0)continue;\n                int di=hld[k];\n                if(g[P[di].tr][P[di].tc]!=0)continue;\n                int ar=P[di].tr-DR[fpd[k]],ac=P[di].tc-DC[fpd[k]];\n                if(ar<0||ar>=N||ac<0||ac>=N)continue;\n                int d=abs(rx-ar)+abs(ry-ac);\n                if(d<bd){bd=d;bk=k;}\n            }\n            if(bk>=0){if(!dropfp(bk,hld[bk]))cbh(bk);prog=true;}\n        }\n        // Step 2: pick and deliver from sm\n        if(!prog){\n            int fi=-1,bd=INT_MAX;\n            for(auto&[src,di]:sm){\n                if(g[P[di].tr][P[di].tc]!=0)continue;\n                for(int k=0;k<nfp;k++){\n                    if(hld[k]>=0)continue;\n                    int ar=src.first-DR[fpd[k]],ac=src.second-DC[fpd[k]];\n                    if(ar<0||ar>=N||ac<0||ac>=N)continue;\n                    int d=abs(rx-ar)+abs(ry-ac);\n                    if(d<bd){bd=d;fi=di;}\n                }\n            }\n            if(fi>=0){\n                int k=pickfp(fi,P[fi].sr,P[fi].sc);\n                if(k>=0){if(!dropfp(k,fi))cbh(k);prog=true;}\n            }\n        }\n        // Step 3: cycle break\n        if(!prog){\n            for(int k=0;k<nfp;k++){\n                if(hld[k]>=0){if(cbh(k))prog=true;break;}\n            }\n            if(!prog){\n                int ci=-1,bd=INT_MAX;\n                for(auto&[src,di]:sm){\n                    int d=abs(rx-src.first)+abs(ry-src.second);\n                    if(d<bd){bd=d;ci=di;}\n                }\n                if(ci>=0){int k=pickfp(ci,P[ci].sr,P[ci].sc);if(k>=0&&cbh(k))prog=true;}\n            }\n        }\n        if(prog)stall=0;\n        else{stall++;if(stall>300)break;em('.');}\n    }\n    for(auto&op:ops)cout<<op<<\"\\n\";\n    return 0;\n}","ahc039":"#include <bits/stdc++.h>\nusing namespace std;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    using Clock = chrono::steady_clock;\n    auto t0 = Clock::now();\n    auto elapsedMs = [&]() {\n        return (long long)chrono::duration_cast<chrono::milliseconds>(Clock::now()-t0).count();\n    };\n    int N; cin >> N;\n    int M = 2*N;\n    vector<int> X(M), Y(M), W(M);\n    for (int i=0; i<M; i++) { cin>>X[i]>>Y[i]; W[i]=(i<N)?1:-1; }\n    const int CMAX=100000;\n    // Trivial initial output\n    {\n        int x1=X[0],x2=(x1<CMAX)?x1+1:x1-1,y1=Y[0],y2=(y1<CMAX)?y1+1:y1-1;\n        if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n        cout<<4<<\"\\n\"<<x1<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y2<<\"\\n\"<<x1<<\" \"<<y2<<\"\\n\";\n    }\n    struct FE{int key,other,w;};\n    vector<FE> bx(M),by(M);\n    {\n        vector<int> idx(M); iota(idx.begin(),idx.end(),0);\n        sort(idx.begin(),idx.end(),[&](int a,int b){return X[a]<X[b];});\n        for(int i=0;i<M;i++) bx[i]={X[idx[i]],Y[idx[i]],W[idx[i]]};\n        iota(idx.begin(),idx.end(),0);\n        sort(idx.begin(),idx.end(),[&](int a,int b){return Y[a]<Y[b];});\n        for(int i=0;i<M;i++) by[i]={Y[idx[i]],X[idx[i]],W[idx[i]]};\n    }\n    auto kadane=[](const vector<FE>&fish,int lo,int hi)->pair<int,int>{\n        int cur=0,cs=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n        for(int i=0,n=(int)fish.size();i<n;){\n            int xv=fish[i].key,gs=0;\n            while(i<n&&fish[i].key==xv){if(fish[i].other>=lo&&fish[i].other<=hi)gs+=fish[i].w;i++;}\n            if(!ir){if(gs>0){cs=xv;cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs;bhi=xv;}}}\n            else{cur+=gs;if(cur>mx){mx=cur;blo=cs;bhi=xv;}if(cur<0){cur=0;ir=false;}}\n        }\n        return{blo,bhi};\n    };\n    auto evalRect=[&](int x1,int x2,int y1,int y2){\n        int s=0;\n        for(int i=0;i<M;i++) if(X[i]>=x1&&X[i]<=x2&&Y[i]>=y1&&Y[i]<=y2)s+=W[i];\n        return s;\n    };\n    auto coordDescent=[&](int x1,int x2,int y1,int y2)->tuple<int,int,int,int,int>{\n        x1=max(0,min(CMAX,x1));x2=max(0,min(CMAX,x2));\n        y1=max(0,min(CMAX,y1));y2=max(0,min(CMAX,y2));\n        if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n        int px1=-1,px2=-1,py1=-1,py2=-1;\n        for(int it=0;it<20;it++){\n            if(x1==px1&&x2==px2&&y1==py1&&y2==py2)break;\n            px1=x1;px2=x2;py1=y1;py2=y2;\n            auto[nx1,nx2]=kadane(bx,y1,y2);if(nx1>=0){x1=nx1;x2=nx2;}\n            auto[ny1,ny2]=kadane(by,x1,x2);if(ny1>=0){y1=ny1;y2=ny2;}\n        }\n        return make_tuple(evalRect(x1,x2,y1,y2),x1,x2,y1,y2);\n    };\n    // Grid Kadane's\n    const int G=200,step=CMAX/G;\n    vector<vector<int>> grid(G,vector<int>(G,0));\n    for(int i=0;i<M;i++) grid[min(X[i]/step,G-1)][min(Y[i]/step,G-1)]+=W[i];\n    int bgx1=0,bgx2=0,bgy1=0,bgy2=0,bgs=0;\n    for(int gx1=0;gx1<G;gx1++){\n        vector<int> cs(G,0);\n        for(int gx2=gx1;gx2<G;gx2++){\n            for(int gy=0;gy<G;gy++)cs[gy]+=grid[gx2][gy];\n            int cur=0,cst=0,mx=0,ms=0,me=-1;\n            for(int gy=0;gy<G;gy++){cur+=cs[gy];if(cur>mx){mx=cur;ms=cst;me=gy;}if(cur<0){cur=0;cst=gy+1;}}\n            if(me>=0&&mx>bgs){bgs=mx;bgx1=gx1;bgx2=gx2;bgy1=ms;bgy2=me;}\n        }\n    }\n    int ix1=bgx1*step,ix2=min((bgx2+1)*step,CMAX);\n    int iy1=bgy1*step,iy2=min((bgy2+1)*step,CMAX);\n    int gscore=-1,rx1=0,rx2=1,ry1=0,ry2=1;\n    auto tryRun=[&](int x1,int x2,int y1,int y2){\n        auto[s,a,b,c,d]=coordDescent(x1,x2,y1,y2);\n        if(s>gscore){gscore=s;rx1=a;rx2=b;ry1=c;ry2=d;}\n    };\n    tryRun(ix1,ix2,iy1,iy2);\n    tryRun(0,CMAX,0,CMAX);\n    {\n        long long cx=0,cy=0;\n        for(int i=0;i<N;i++){cx+=X[i];cy+=Y[i];}\n        cx/=N;cy/=N;\n        tryRun((int)cx-40000,(int)cx+40000,(int)cy-40000,(int)cy+40000);\n        tryRun((int)cx-15000,(int)cx+15000,(int)cy-15000,(int)cy+15000);\n    }\n    mt19937 rng(42);\n    for(int trial=0;;trial++){\n        if(trial%100==0&&elapsedMs()>1500)break;\n        int seed=rng()%N;\n        int hx=200+(int)(rng()%50000),hy=200+(int)(rng()%50000);\n        tryRun(X[seed]-hx,X[seed]+hx,Y[seed]-hy,Y[seed]+hy);\n    }\n    // ARM SEARCH\n    // findArm: sweep along one direction, Kadane's on cross-section\n    // fish_sorted: (sweep_coord, cross_coord, weight), cross in [clo,chi]\n    // Returns (score, cross1, cross2, sweep_end)\n    auto findArm=[&](const vector<tuple<int,int,int>>&fish_sorted,int clo,int chi)\n        ->tuple<int,int,int,int>{\n        vector<int> xs;\n        for(auto&[sw,cr,w]:fish_sorted)if(cr>=clo&&cr<=chi)xs.push_back(cr);\n        sort(xs.begin(),xs.end());xs.erase(unique(xs.begin(),xs.end()),xs.end());\n        if(xs.empty())return{0,-1,-1,0};\n        int kx=(int)xs.size();\n        vector<int> cum(kx,0);\n        int bsc=0,bc1=-1,bc2=-1,bsw=0;\n        int i=0,n=(int)fish_sorted.size();\n        while(i<n){\n            int csw=get<0>(fish_sorted[i]);\n            while(i<n&&get<0>(fish_sorted[i])==csw){\n                auto&[sw,cr,w]=fish_sorted[i];\n                if(cr>=clo&&cr<=chi){\n                    int idx=(int)(lower_bound(xs.begin(),xs.end(),cr)-xs.begin());\n                    cum[idx]+=w;\n                }\n                i++;\n            }\n            int cur=0,cs=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n            for(int j=0;j<kx;j++){\n                int gs=cum[j];\n                if(!ir){if(gs>0){cs=xs[j];cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs;bhi=xs[j];}}}\n                else{cur+=gs;if(cur>mx){mx=cur;blo=cs;bhi=xs[j];}if(cur<0){cur=0;ir=false;}}\n            }\n            if(mx>bsc){bsc=mx;bc1=blo;bc2=bhi;bsw=csw;}\n        }\n        return{bsc,bc1,bc2,bsw};\n    };\n    // Build sorted fish for 4 arm directions (restricted to base cross-section)\n    vector<tuple<int,int,int>> ft,fb,fright,fl;\n    for(int i=0;i<M;i++){\n        if(Y[i]>ry2&&X[i]>=rx1&&X[i]<=rx2)ft.emplace_back(Y[i],X[i],W[i]);\n        if(Y[i]<ry1&&X[i]>=rx1&&X[i]<=rx2)fb.emplace_back(-Y[i],X[i],W[i]);\n        if(X[i]>rx2&&Y[i]>=ry1&&Y[i]<=ry2)fright.emplace_back(X[i],Y[i],W[i]);\n        if(X[i]<rx1&&Y[i]>=ry1&&Y[i]<=ry2)fl.emplace_back(-X[i],Y[i],W[i]);\n    }\n    sort(ft.begin(),ft.end());sort(fb.begin(),fb.end());\n    sort(fright.begin(),fright.end());sort(fl.begin(),fl.end());\n    auto[ts,tax1,tax2,tay2]=findArm(ft,rx1,rx2);\n    auto[bms,bax1,bax2,neg_bay]=findArm(fb,rx1,rx2); int bay1=-neg_bay;\n    auto[rms,ray1,ray2,rax2]=findArm(fright,ry1,ry2);\n    auto[ls,lay1,lay2,neg_lax]=findArm(fl,ry1,ry2); int lax1=-neg_lax;\n    // Perimeter budget\n    int P_base=2*(rx2-rx1)+2*(ry2-ry1);\n    int budget=400000-P_base;\n    // Arm validity (strict interior to avoid duplicate vertices)\n    bool ht=ts>0&&tax1>rx1&&tax2<rx2&&tax1<tax2&&tay2>ry2;\n    bool hb=bms>0&&bax1>rx1&&bax2<rx2&&bax1<bax2&&bay1<ry1;\n    bool hr=rms>0&&ray1>ry1&&ray2<ry2&&ray1<ray2&&rax2>rx2;\n    bool hl=ls>0&&lay1>ry1&&lay2<ry2&&lay1<lay2&&lax1<rx1;\n    int ct=ht?2*(tay2-ry2):0;\n    int cb=hb?2*(ry1-bay1):0;\n    int cr2=hr?2*(rax2-rx2):0;\n    int cl=hl?2*(rx1-lax1):0;\n    int total_cost=ct+cb+cr2+cl;\n    // If over budget, disable worst arms by score/cost\n    if(total_cost>budget){\n        vector<pair<double,int>> eff;\n        if(ht&&ct>0)eff.push_back({(double)ts/ct,0});\n        if(hb&&cb>0)eff.push_back({(double)bms/cb,1});\n        if(hr&&cr2>0)eff.push_back({(double)rms/cr2,2});\n        if(hl&&cl>0)eff.push_back({(double)ls/cl,3});\n        sort(eff.begin(),eff.end());\n        for(auto&[e,idx]:eff){\n            if(total_cost<=budget)break;\n            if(idx==0){ht=false;total_cost-=ct;}\n            else if(idx==1){hb=false;total_cost-=cb;}\n            else if(idx==2){hr=false;total_cost-=cr2;}\n            else{hl=false;total_cost-=cl;}\n        }\n    }\n    int combined=gscore+(ht?ts:0)+(hb?bms:0)+(hr?rms:0)+(hl?ls:0);\n    if(combined>=1){\n        vector<pair<int,int>> v;\n        // Bottom edge\n        v.push_back({rx1,ry1});\n        if(hb){if(bax1>rx1)v.push_back({bax1,ry1});v.push_back({bax1,bay1});v.push_back({bax2,bay1});if(bax2<rx2)v.push_back({bax2,ry1});}\n        v.push_back({rx2,ry1});\n        // Right edge\n        if(hr){if(ray1>ry1)v.push_back({rx2,ray1});v.push_back({rax2,ray1});v.push_back({rax2,ray2});if(ray2<ry2)v.push_back({rx2,ray2});}\n        v.push_back({rx2,ry2});\n        // Top edge (going left)\n        if(ht){if(tax2<rx2)v.push_back({tax2,ry2});v.push_back({tax2,tay2});v.push_back({tax1,tay2});if(tax1>rx1)v.push_back({tax1,ry2});}\n        v.push_back({rx1,ry2});\n        // Left edge (going down)\n        if(hl){if(lay2<ry2)v.push_back({rx1,lay2});v.push_back({lax1,lay2});v.push_back({lax1,lay1});if(lay1>ry1)v.push_back({rx1,lay1});}\n        // Remove consecutive duplicates\n        vector<pair<int,int>> res;\n        for(auto&p:v){if(res.empty()||res.back()!=p)res.push_back(p);}\n        while(res.size()>1&&res.front()==res.back())res.pop_back();\n        // Check all distinct\n        set<pair<int,int>> vs(res.begin(),res.end());\n        bool ok=(int)vs.size()==(int)res.size()&&(int)res.size()>=4;\n        if(ok){\n            cout<<(int)res.size()<<\"\\n\";\n            for(auto&[x,y]:res)cout<<x<<\" \"<<y<<\"\\n\";\n            return 0;\n        }\n    }\n    // Fallback: output base rectangle\n    if(gscore>=1){\n        if(rx1>=rx2){if(rx2<CMAX)rx2++;else rx1--;}\n        if(ry1>=ry2){if(ry2<CMAX)ry2++;else ry1--;}\n        cout<<4<<\"\\n\"<<rx1<<\" \"<<ry1<<\"\\n\"<<rx2<<\" \"<<ry1<<\"\\n\"<<rx2<<\" \"<<ry2<<\"\\n\"<<rx1<<\" \"<<ry2<<\"\\n\";\n    }\n    return 0;\n}","ahc040":"#pragma GCC optimize(\"O3,unroll-loops\")\n#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint N, T;\nvector<double> W, H;\ndouble sW, sH, mxW, mxH, totA;\n\nstruct Op { int p, r; char d; int b; };\n\npair<ll,ll> simulate(const vector<Op>& ops) {\n    vector<ll> x0(N,0),y0(N,0),x1(N,0),y1(N,0);\n    vector<bool> pl(N,false);\n    for (const auto& o : ops) {\n        int p = o.p;\n        ll w = max(1LL, llround(o.r ? H[p] : W[p]));\n        ll h = max(1LL, llround(o.r ? W[p] : H[p]));\n        if (o.d == 'U') {\n            ll xl = o.b >= 0 ? x1[o.b] : 0LL;\n            ll yt = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && x0[i] < xl+w && x1[i] > xl)\n                    yt = max(yt, y1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        } else {\n            ll yt = o.b >= 0 ? y1[o.b] : 0LL;\n            ll xl = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && y0[i] < yt+h && y1[i] > yt)\n                    xl = max(xl, x1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        }\n        pl[p] = true;\n    }\n    ll rW=0, rH=0;\n    for (int i = 0; i < N; i++)\n        if (pl[i]) { rW=max(rW,x1[i]); rH=max(rH,y1[i]); }\n    return {rW, rH};\n}\n\n// col=false: shelf packing (rows); col=true: column packing\n// For col=false, line0 uses U, rest use L\n// For col=true,  line0 uses L, rest use U\nvector<Op> make_pack(const vector<int>& rot, double tgt, bool col) {\n    vector<Op> ops; ops.reserve(N);\n    int cl = -1; double cm = 0;\n    vector<int> lr; vector<double> lc;\n    int p0 = -1;\n    for (int i = 0; i < N; i++) {\n        double m = col ? (rot[i] ? W[i] : H[i]) : (rot[i] ? H[i] : W[i]);\n        double c = col ? (rot[i] ? H[i] : W[i]) : (rot[i] ? W[i] : H[i]);\n        if (cl < 0 || cm + m > tgt) {\n            cl++; cm = m;\n            lr.push_back(i); lc.push_back(c);\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', -1});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        } else {\n            cm += m;\n            if (c > lc[cl]) { lc[cl]=c; lr[cl]=i; }\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', p0});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        }\n    }\n    return ops;\n}\n\ndouble calc_score(const vector<int>& rot, double tgt, bool col) {\n    auto [a,b] = simulate(make_pack(rot, tgt, col));\n    return (double)(a+b);\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    double sigma;\n    cin >> N >> T >> sigma;\n    W.resize(N); H.resize(N);\n    for (int i = 0; i < N; i++) cin >> W[i] >> H[i];\n\n    sW=sH=mxW=mxH=totA=0;\n    for (int i = 0; i < N; i++) {\n        sW+=W[i]; sH+=H[i];\n        mxW=max(mxW,W[i]); mxH=max(mxH,H[i]);\n        totA+=W[i]*H[i];\n    }\n\n    const double BUDGET = 2600.0;\n    auto t0 = chrono::steady_clock::now();\n    auto now = [&]() {\n        return chrono::duration<double,milli>(chrono::steady_clock::now()-t0).count();\n    };\n\n    vector<int> g_rot;\n    double g_tgt=0, g_score=1e18;\n    bool g_col=false;\n\n    for (int t = 0; t < T; t++) {\n        double ts = now();\n        double per = max(1.0, (BUDGET - ts) / (T - t));\n        double dl = ts + per * 0.95;\n\n        mt19937 rng(t * 1234567891u ^ 987654321u);\n        uniform_real_distribution<double> uni(0,1);\n\n        bool col;\n        double lo, hi, tgt;\n        vector<int> rot(N);\n\n        if (t < (T+1)/2) {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            // Init rotation: minimize cross-dim\n            for (int i = 0; i < N; i++)\n                rot[i] = col ? (H[i]<W[i] ? 1:0) : (W[i]<H[i] ? 1:0);\n            int nf = max(1, (int)sqrt((double)t+0.1));\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.4)));\n        } else if (g_score < 1e17) {\n            rot=g_rot; col=g_col; tgt=g_tgt;\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            int nf = max(1, N/8);\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.12)));\n        } else {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            for (int i = 0; i < N; i++) rot[i] = rng()%2;\n        }\n\n        // Greedy rotation improvement\n        double cur = calc_score(rot, tgt, col);\n        for (int i = 0; i < N; i++) {\n            rot[i] ^= 1;\n            double ns = calc_score(rot, tgt, col);\n            if (ns < cur) cur = ns;\n            else rot[i] ^= 1;\n        }\n\n        vector<int> br=rot;\n        double bt=tgt;\n        bool bc=col;\n        double bs=cur;\n\n        double Th = cur*0.05+1.0;\n        double Tl = max(1.0, cur*1e-5);\n\n        // Simulated Annealing\n        for (int it=0; ; it++) {\n            if ((it&63)==0 && now()>=dl) break;\n            double frac = max(0.0, min(1.0, (now()-ts)/per));\n            double Tc = max(Tl, Th * pow(Tl/Th, frac));\n\n            int mv = rng()%10, fi=-1;\n            double ot=tgt;\n            bool oc=col;\n            double olo=lo, ohi=hi;\n\n            if (mv < 7) {\n                fi = rng()%N;\n                rot[fi] ^= 1;\n            } else if (mv < 9) {\n                tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.35)));\n            } else {\n                col ^= 1;\n                lo = col ? mxH : mxW;\n                hi = col ? sH  : sW;\n                tgt = max(lo, min(hi, ot));\n            }\n\n            double ns = calc_score(rot, tgt, col);\n            double d = ns - cur;\n            if (d <= 0 || uni(rng) < exp(-d/Tc)) {\n                cur = ns;\n                if (ns < bs) { bs=ns; br=rot; bt=tgt; bc=col; }\n            } else {\n                if (fi >= 0) rot[fi] ^= 1;\n                else if (mv < 9) tgt = ot;\n                else { col=oc; lo=olo; hi=ohi; tgt=ot; }\n            }\n        }\n\n        // Final greedy passes\n        for (int pass=0; pass<3; pass++) {\n            bool imp=false;\n            for (int i=0; i<N; i++) {\n                br[i] ^= 1;\n                double ns = calc_score(br, bt, bc);\n                if (ns < bs) { bs=ns; imp=true; }\n                else br[i] ^= 1;\n            }\n            if (!imp) break;\n        }\n\n        if (bs < g_score) { g_score=bs; g_rot=br; g_tgt=bt; g_col=bc; }\n\n        auto ops = make_pack(br, bt, bc);\n        cout << (int)ops.size() << \"\\n\";\n        for (const auto& op : ops)\n            cout << op.p << \" \" << op.r << \" \" << op.d << \" \" << op.b << \"\\n\";\n        cout.flush();\n\n        ll Wf, Hf;\n        cin >> Wf >> Hf;\n    }\n\n    return 0;\n}","ahc041":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\nint N,M,H,A[1000];\nvector<int>G[1000];\nint par[1000],dep[1000],ssm[1000],mdn[1000];\nvector<int>ch[1000];\nvoid dfs_init(int v){ssm[v]=A[v];mdn[v]=0;for(int c:ch[v]){dfs_init(c);ssm[v]+=ssm[c];mdn[v]=max(mdn[v],mdn[c]+1);}}\nvoid push_dep(int v,int d){dep[v]=d;for(int c:ch[v])push_dep(c,d+1);}\nbool in_sub(int w,int v){for(;w!=-1;w=par[w])if(w==v)return true;return false;}\nvoid pull_ssm(int v){for(;v!=-1;v=par[v]){int s=A[v];for(int c:ch[v])s+=ssm[c];ssm[v]=s;}}\nvoid pull_mdn(int v){for(;v!=-1;v=par[v]){int m=0;for(int c:ch[v])m=max(m,mdn[c]+1);mdn[v]=m;}}\nvoid do_move(int v,int np){int op=par[v];if(op!=-1){auto&c=ch[op];c.erase(find(c.begin(),c.end(),v));}par[v]=np;if(np!=-1){ch[np].push_back(v);push_dep(v,dep[np]+1);}else push_dep(v,0);if(op!=-1){pull_ssm(op);pull_mdn(op);}if(np!=-1){pull_ssm(np);pull_mdn(np);}}\nvoid rebuild(){for(int i=0;i<N;i++)ch[i].clear();fill(dep,dep+N,0);for(int v=0;v<N;v++)if(par[v]!=-1)ch[par[v]].push_back(v);for(int v=0;v<N;v++)if(par[v]==-1){queue<int>q;q.push(v);while(!q.empty()){int u=q.front();q.pop();for(int c:ch[u]){dep[c]=dep[u]+1;q.push(c);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nll compute_score(){ll s=0;for(int i=0;i<N;i++)s+=(ll)(dep[i]+1)*A[i];return s;}\nvoid run_greedy(mt19937&rng){for(;;){bool ok=false;vector<int>p(N);iota(p.begin(),p.end(),0);shuffle(p.begin(),p.end(),rng);for(int v:p){int lim=H-1-mdn[v];if(lim<0)continue;int bp=par[v];ll bg=0;for(int w:G[v]){if(dep[w]>lim||in_sub(w,v))continue;ll g=(ll)(dep[w]+1-dep[v])*ssm[v];if(g>bg){bg=g;bp=w;}}if(bg>0){do_move(v,bp);ok=true;}}if(!ok)break;}}\nvoid build_bfs(vector<int>&ord){fill(par,par+N,-1);fill(dep,dep+N,0);for(int i=0;i<N;i++)ch[i].clear();vector<bool>vis(N,false);for(int s:ord){if(vis[s])continue;queue<int>q;q.push(s);vis[s]=true;while(!q.empty()){int v=q.front();q.pop();if(dep[v]>=H)continue;for(int u:G[v])if(!vis[u]){vis[u]=true;par[u]=v;dep[u]=dep[v]+1;ch[v].push_back(u);q.push(u);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>H;for(int i=0;i<N;i++)cin>>A[i];\n    for(int i=0;i<M;i++){int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}\n    for(int i=0;i<N;i++){int x,y;cin>>x>>y;}\n    auto t0=chrono::steady_clock::now();\n    mt19937 rng(42);\n    ll best_sc=-1;vector<int>best_par(N);\n    for(int trial=0;;trial++){\n        if(chrono::duration<double>(chrono::steady_clock::now()-t0).count()>0.3)break;\n        vector<int>ord(N);iota(ord.begin(),ord.end(),0);\n        if(trial==0)sort(ord.begin(),ord.end(),[](int a,int b){return A[a]<A[b];});\n        else shuffle(ord.begin(),ord.end(),rng);\n        build_bfs(ord);run_greedy(rng);\n        ll sc=compute_score();if(sc>best_sc){best_sc=sc;copy(par,par+N,best_par.begin());}\n    }\n    copy(best_par.begin(),best_par.end(),par);rebuild();\n    ll cur=best_sc;\n    uniform_real_distribution<double>uni(0,1);\n    auto ts=chrono::steady_clock::now();\n    double sa_t=1.80-chrono::duration<double>(ts-t0).count();\n    if(sa_t<0.05)sa_t=0.05;\n    double T=1000;\n    for(long long step=0;;step++){\n        if(step%10000==0){double t=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(t>=sa_t)break;T=1000*pow(0.001,t/sa_t);}\n        int v=rng()%N;int lim=H-1-mdn[v];if(lim<0)continue;\n        if(G[v].empty())continue;int w=G[v][rng()%G[v].size()];\n        if(w==par[v]||dep[w]>lim||in_sub(w,v))continue;\n        ll gain=(ll)(dep[w]+1-dep[v])*ssm[v];\n        if(gain>0||(T>0.01&&uni(rng)<exp((double)gain/T))){\n            do_move(v,w);cur+=gain;\n            if(cur>best_sc){best_sc=cur;copy(par,par+N,best_par.begin());}\n        }\n    }\n    for(int v=0;v<N;v++){if(v)cout<<' ';cout<<best_par[v];}cout<<'\\n';\n}","ahc042":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,OR_[42],OC_[42],ctop_[21],cbot_[21],rleft_[21],rright_[21];\nlong long gmask(int dir,int idx,int depth){long long m=0;for(int k=0;k<M;k++){int r=OR_[k],c=OC_[k];if(dir==0&&c==idx&&r<=depth)m|=1LL<<k;else if(dir==1&&c==idx&&r>=depth)m|=1LL<<k;else if(dir==2&&r==idx&&c<=depth)m|=1LL<<k;else if(dir==3&&r==idx&&c>=depth)m|=1LL<<k;}return m;}\nint gcost(int dir,int depth){return(dir==0||dir==2)?2*(depth+1):2*(N-depth);}\nstruct Cand{int dir,idx,depth,cost;long long mask;};\nstruct Sol{int sel[4][20];long long sm[4][20];void init(){memset(sel,-1,sizeof sel);memset(sm,0,sizeof sm);}int cost()const{int t=0;for(int d=0;d<4;d++)for(int i=0;i<N;i++)if(sel[d][i]>=0)t+=gcost(d,sel[d][i]);return t;}};\nvoid dr_impl(Sol&s,int sd,int si){for(;;){bool ch=false;for(int d=0;d<4&&!ch;d++)for(int i=0;i<N&&!ch;i++){if(s.sel[d][i]<0||(d==sd&&i==si))continue;long long ot=0;for(int d2=0;d2<4;d2++)for(int i2=0;i2<N;i2++)if((d2!=d||i2!=i)&&s.sel[d2][i2]>=0)ot|=s.sm[d2][i2];long long un=s.sm[d][i]&~ot;if(!un){s.sel[d][i]=-1;s.sm[d][i]=0;ch=true;break;}int nd;if(d==0){nd=0;for(int k=0;k<M;k++)if((un>>k)&1)nd=max(nd,OR_[k]);}else if(d==1){nd=N-1;for(int k=0;k<M;k++)if((un>>k)&1)nd=min(nd,OR_[k]);}else if(d==2){nd=0;for(int k=0;k<M;k++)if((un>>k)&1)nd=max(nd,OC_[k]);}else{nd=N-1;for(int k=0;k<M;k++)if((un>>k)&1)nd=min(nd,OC_[k]);}if(nd!=s.sel[d][i]){s.sel[d][i]=nd;s.sm[d][i]=gmask(d,i,nd);ch=true;}}if(!ch)break;}}\nvoid depth_red(Sol&s){dr_impl(s,-1,-1);}\nvoid local_search(Sol&s,const vector<Cand>&cands){for(int it=0;it<10;it++){long long cov1=0;{int cnt[64]={};for(int d=0;d<4;d++)for(int i=0;i<N;i++)if(s.sel[d][i]>=0)for(int k=0;k<M;k++)if((s.sm[d][i]>>k)&1)cnt[k]++;for(int k=0;k<M;k++)if(cnt[k]==1)cov1|=1LL<<k;}int cur=s.cost();Sol bs=s;int bc=cur;for(const auto&c:cands){if(!(c.mask&cov1))continue;int d=c.dir,idx=c.idx,dep=c.depth;if(s.sel[d][idx]>=0){int cu=s.sel[d][idx];if((d==0||d==2)?dep<=cu:dep>=cu)continue;}Sol ts=s;ts.sel[d][idx]=dep;ts.sm[d][idx]=c.mask;dr_impl(ts,d,idx);dr_impl(ts,-1,-1);int nc=ts.cost();if(nc<bc){bc=nc;bs=ts;}}if(bc<cur)s=bs;else break;}}\nint main(){ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N;vector<string>board(N);for(int i=0;i<N;i++)cin>>board[i];M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]=='x'){OR_[M]=i;OC_[M]=j;M++;}if(!M)return 0;fill(ctop_,ctop_+N,N);fill(cbot_,cbot_+N,-1);fill(rleft_,rleft_+N,N);fill(rright_,rright_+N,-1);for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]=='o'){ctop_[j]=min(ctop_[j],i);cbot_[j]=max(cbot_[j],i);rleft_[i]=min(rleft_[i],j);rright_[i]=max(rright_[i],j);}\nvector<Cand>cands;for(int k=0;k<M;k++){int r=OR_[k],c=OC_[k];if(r<ctop_[c])cands.push_back({0,c,r,gcost(0,r),gmask(0,c,r)});if(r>cbot_[c])cands.push_back({1,c,r,gcost(1,r),gmask(1,c,r)});if(c<rleft_[r])cands.push_back({2,r,c,gcost(2,c),gmask(2,r,c)});if(c>rright_[r])cands.push_back({3,r,c,gcost(3,c),gmask(3,r,c)});}\nmt19937 rng(42);Sol best;best.init();int best_cost=INT_MAX;\nfor(int trial=0;trial<10;trial++){if(trial>0)shuffle(cands.begin(),cands.end(),rng);Sol cur;cur.init();long long rem=(1LL<<M)-1;while(rem){double bst=1e18;int bi=-1;for(int i=0;i<(int)cands.size();i++){long long nm=cands[i].mask&rem;if(!nm)continue;int d=cands[i].dir,idx=cands[i].idx,dep=cands[i].depth;int ac=cands[i].cost;if(cur.sel[d][idx]>=0){int cu=cur.sel[d][idx];if((d==0||d==2)?dep<=cu:dep>=cu)continue;ac-=gcost(d,cu);}if(ac<=0)continue;double rv=(double)ac/__builtin_popcountll(nm);if(rv<bst){bst=rv;bi=i;}}if(bi<0)break;cur.sel[cands[bi].dir][cands[bi].idx]=cands[bi].depth;cur.sm[cands[bi].dir][cands[bi].idx]=cands[bi].mask;rem&=~cands[bi].mask;}depth_red(cur);local_search(cur,cands);int c=cur.cost();if(c<best_cost){best_cost=c;best=cur;}}\nstatic const char dirs[]=\"UDLR\",revs[]=\"DURL\";for(int d=0;d<4;d++)for(int i=0;i<N;i++){if(best.sel[d][i]<0)continue;int dep=best.sel[d][i];int s=(d==0||d==2)?dep+1:N-dep;for(int k=0;k<s;k++)cout<<dirs[d]<<' '<<i<<'\\n';for(int k=0;k<s;k++)cout<<revs[d]<<' '<<i<<'\\n';}return 0;}","ahc044":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN = 100;\nint N, L, T[MAXN], a[MAXN], b[MAXN], cv[MAXN], fv[MAXN], flow[MAXN];\nvoid computeFlow(){fill(flow,flow+N,0);for(int i=0;i<N;i++){flow[a[i]]+=cv[i];flow[b[i]]+=fv[i];}flow[0]++;}\nlong long flowErr(){long long e=0;for(int j=0;j<N;j++)e+=abs(flow[j]-T[j]);return e;}\nbool checkConn(){bool vis[MAXN]={};queue<int>q;vis[0]=true;q.push(0);while(!q.empty()){int x=q.front();q.pop();if(!vis[a[x]]){vis[a[x]]=true;q.push(a[x]);}if(!vis[b[x]]){vis[b[x]]=true;q.push(b[x]);}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nvoid fixConn(){for(int pass=0;pass<N;pass++){bool vis[MAXN]={};queue<int>q;vis[0]=true;q.push(0);while(!q.empty()){int x=q.front();q.pop();if(!vis[a[x]]){vis[a[x]]=true;q.push(a[x]);}if(!vis[b[x]]){vis[b[x]]=true;q.push(b[x]);}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bestD=(long long)4e18;int besti=-1;bool bestA=false;for(int i=0;i<N;i++){if(!vis[i])continue;if(a[i]!=u){int old=a[i],w=cv[i];long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bestD){bestD=d;besti=i;bestA=true;}}if(b[i]!=u){int old=b[i],w=fv[i];long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bestD){bestD=d;besti=i;bestA=false;}}}if(besti<0)break;if(bestA){if(cv[besti]>0){flow[a[besti]]-=cv[besti];flow[u]+=cv[besti];}a[besti]=u;}else{if(fv[besti]>0){flow[b[besti]]-=fv[besti];flow[u]+=fv[besti];}b[besti]=u;}}}\nvoid flowSearch(){long long curErr=flowErr();bool improved=true;while(improved){improved=false;for(int i=0;i<N;i++){for(int t2=0;t2<2;t2++){int old=(t2?b[i]:a[i]),w=(t2?fv[i]:cv[i]);int bestJ=-1;long long bestD=0;for(int j=0;j<N;j++){if(j==old)continue;long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[j]+w-T[j])-abs(flow[j]-T[j]))):0LL;if(d<bestD){if(t2)b[i]=j;else a[i]=j;bool ok=checkConn();if(t2)b[i]=old;else a[i]=old;if(ok){bestD=d;bestJ=j;}}}if(bestJ>=0){if(w>0){flow[old]-=w;flow[bestJ]+=w;}curErr+=bestD;if(t2)b[i]=bestJ;else a[i]=bestJ;improved=true;}}}}}\nlong long simulate(){int cnt[MAXN]={},vc[MAXN]={};int cur=0;cnt[0]++;vc[0]++;for(int w=2;w<=L;w++){int nxt=(vc[cur]&1)?a[cur]:b[cur];cur=nxt;cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++)e+=abs(cnt[j]-T[j]);return e;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>L;for(int i=0;i<N;i++)cin>>T[i];\n    for(int i=0;i<N;i++){cv[i]=(T[i]+1)/2;fv[i]=T[i]/2;}\n    for(int i=0;i<N;i++)a[i]=b[i]=0;\n    vector<tuple<int,int,int>>items;\n    for(int i=0;i<N;i++){items.emplace_back(cv[i],0,i);items.emplace_back(fv[i],1,i);}\n    sort(items.rbegin(),items.rend());\n    int rem[MAXN];for(int j=0;j<N;j++)rem[j]=T[j];if(rem[0]>0)rem[0]--;\n    priority_queue<pair<int,int>>pq;for(int j=0;j<N;j++)pq.push({rem[j],j});\n    for(auto&[w,type,emp]:items){auto[cap,bin]=pq.top();pq.pop();if(type==0)a[emp]=bin;else b[emp]=bin;rem[bin]-=w;pq.push({rem[bin],bin});}\n    computeFlow();fixConn();flowSearch();\n    long long bestErr=simulate();\n    int bestA[MAXN],bestB[MAXN];copy(a,a+N,bestA);copy(b,b+N,bestB);long long curErr=bestErr;\n    mt19937 rng(42);\n    auto t0=chrono::steady_clock::now();\n    while(true){\n        long long el=chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now()-t0).count();\n        if(el>1800000LL)break;\n        int i=rng()%N,type=rng()%2,jNew=(int)(rng()%N);\n        int&ptr=type?b[i]:a[i];int old=ptr;\n        if(jNew==old)continue;\n        ptr=jNew;\n        if(!checkConn()){ptr=old;continue;}\n        long long err=simulate();\n        if(err<=curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,bestA);copy(b,b+N,bestB);}}\n        else ptr=old;\n    }\n    copy(bestA,bestA+N,a);copy(bestB,bestB+N,b);\n    for(int i=0;i<N;i++)cout<<a[i]<<\" \"<<b[i]<<\"\\n\";\n    return 0;\n}","ahc045":"#include <bits/stdc++.h>\nusing namespace std;\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,Q,L,W; cin>>N>>M>>Q>>L>>W;\n    vector<int> G(M); for(int& g:G) cin>>g;\n    vector<double> cx(N),cy(N);\n    for(int i=0;i<N;i++){int lx,rx,ly,ry;cin>>lx>>rx>>ly>>ry;cx[i]=(lx+rx)/2.0;cy[i]=(ly+ry)/2.0;}\n    auto ed2=[&](int a,int b)->double{double dx=cx[a]-cx[b],dy=cy[a]-cy[b];return dx*dx+dy*dy;};\n    vector<int> mst_par(N,-1);\n    {vector<bool> vis(N,false);vector<double> key(N,1e18);key[0]=0;\n    for(int iter=0;iter<N;iter++){int u=-1;for(int v=0;v<N;v++)if(!vis[v]&&(u==-1||key[v]<key[u]))u=v;\n    vis[u]=true;for(int v=0;v<N;v++)if(!vis[v]){double d=ed2(u,v);if(d<key[v]){key[v]=d;mst_par[v]=u;}}}}\n    vector<vector<int>> mch(N);for(int v=1;v<N;v++)mch[mst_par[v]].push_back(v);\n    vector<int> post;{stack<pair<int,int>> stk;stk.push({0,0});while(!stk.empty()){auto&[v,ci]=stk.top();if(ci<(int)mch[v].size())stk.push({mch[v][ci++],0});else{post.push_back(v);stk.pop();}}}\n    vector<int> esz(N);vector<bool> sc(N,false);multiset<int> remG(G.begin(),G.end());\n    for(int v:post){esz[v]=1;for(int c:mch[v])if(!sc[c])esz[v]+=esz[c];if(v!=0&&remG.count(esz[v])){sc[v]=true;remG.erase(remG.find(esz[v]));}}\n    bool ok=(remG.size()==1&&*remG.begin()==esz[0]);\n    vector<vector<int>> grp(M);\n    {map<int,queue<int>> sg;for(int i=0;i<M;i++)sg[G[i]].push(i);\n    if(ok){vector<bool> asn(N,false);\n    for(int v:post){if(v==0||!sc[v])continue;int gid=sg[esz[v]].front();sg[esz[v]].pop();queue<int>q;q.push(v);while(!q.empty()){int u=q.front();q.pop();if(asn[u])continue;grp[gid].push_back(u);asn[u]=true;for(int c:mch[u])if(!asn[c])q.push(c);}}\n    int gid=sg[esz[0]].front();sg[esz[0]].pop();for(int v=0;v<N;v++)if(!asn[v])grp[gid].push_back(v);}\n    else{auto eb=[](uint32_t x)->uint64_t{uint64_t r=0;for(int i=0;i<16;i++)r|=((uint64_t)((x>>i)&1))<<(2*i);return r;};\n    vector<int> ord(N);iota(ord.begin(),ord.end(),0);sort(ord.begin(),ord.end(),[&](int a,int b){uint64_t ma=eb((uint32_t)cx[a])|(eb((uint32_t)cy[a])<<1);uint64_t mb=eb((uint32_t)cx[b])|(eb((uint32_t)cy[b])<<1);return ma<mb;});\n    int pos=0;for(int i=0;i<M;i++){grp[i].assign(ord.begin()+pos,ord.begin()+pos+G[i]);pos+=G[i];}}}\n    int qrem=Q;vector<vector<pair<double,pair<int,int>>>> ae(M);\n    auto dq=[&](const vector<int>&qc,int gi){if((int)qc.size()<2||qrem<=0)return;qrem--;cout<<\"? \"<<qc.size();for(int c:qc)cout<<\" \"<<c;cout<<\"\\n\"<<flush;for(int k=0;k+1<(int)qc.size();k++){int a,b;cin>>a>>b;ae[gi].push_back({ed2(a,b),{a,b}});}};\n    auto nq=[&](int g)->int{if(g<=1)return 0;if(g<=L)return 1;return(g-2)/(L-1)+1;};\n    int tmand=0;for(int i=0;i<M;i++)tmand+=nq(G[i]);int xtra=Q-tmand;\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;auto&v=grp[i];if(g<=L){dq(v,i);continue;}\n    vector<bool> it(g,false);it[0]=true;vector<double> dt(g,1e18);vector<int> nt(g,0);for(int j=1;j<g;j++)dt[j]=ed2(v[0],v[j]);int tsz=1;\n    while(tsz<g&&qrem>0){int bj=-1;double bd=1e18;for(int j=0;j<g;j++)if(!it[j]&&dt[j]<bd){bd=dt[j];bj=j;}if(bj<0)break;int rep=nt[bj];\n    vector<pair<double,int>>cands;for(int j=0;j<g;j++)if(!it[j])cands.push_back({ed2(v[rep],v[j]),j});sort(cands.begin(),cands.end());cands.resize(min((int)cands.size(),L-1));\n    vector<int>qc={v[rep]};for(auto&[d,j]:cands)qc.push_back(v[j]);dq(qc,i);\n    for(auto&[d,j]:cands)if(!it[j]){it[j]=true;tsz++;for(int k=0;k<g;k++)if(!it[k]){double d2=ed2(v[j],v[k]);if(d2<dt[k]){dt[k]=d2;nt[k]=j;}}}}}\n    {vector<int>lg;for(int i=0;i<M;i++)if(G[i]>L)lg.push_back(i);if(!lg.empty()&&xtra>0)for(int qi=0;qi<xtra&&qrem>0;qi++){int gi=lg[qi%(int)lg.size()];int g=G[gi];auto&v=grp[gi];int st=max(1,g/L),off=(qi/(int)lg.size())%st;vector<int>win;for(int k=off;k<g&&(int)win.size()<L;k+=st)win.push_back(v[k]);if((int)win.size()>=2)dq(win,gi);}}\n    vector<int>par(N);auto fu=[&](int x)->int{while(par[x]!=x){par[x]=par[par[x]];x=par[x];}return x;};\n    vector<vector<pair<int,int>>>ans(M);\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;auto&v=grp[i];for(int k:v)par[k]=k;sort(ae[i].begin(),ae[i].end());\n    for(auto&[d,e]:ae[i]){int ra=fu(e.first),rb=fu(e.second);if(ra!=rb){par[ra]=rb;ans[i].push_back(e);}}\n    for(int k=1;k<g;k++){int ra=fu(v[k]),rb=fu(v[k-1]);if(ra!=rb){par[ra]=rb;ans[i].push_back({v[k],v[k-1]});}}}\n    cout<<\"!\\n\";\n    for(int i=0;i<M;i++){for(int j=0;j<G[i];j++){if(j>0)cout<<\" \";cout<<grp[i][j];}cout<<\"\\n\";for(auto&[a,b]:ans[i])cout<<a<<\" \"<<b<<\"\\n\";}\n    return 0;\n}","ahc046":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20;\nbool grid[N][N];\nconst int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\ninline bool inB(int r,int c){return(unsigned)r<(unsigned)N&&(unsigned)c<(unsigned)N;}\n\nconst int NS1=N*N*21*21;\nstatic int d1[NS1],p1[NS1],q1[NS1];\nstatic uint8_t a1[NS1];\n\nvector<pair<char,char>> fp1(int r0,int c0,int tr,int tc){\n    memset(d1,-1,sizeof(d1));\n    int S=(r0*N+c0)*441,G=(tr*N+tc)*441;\n    if(S==G)return{};\n    d1[S]=0;int qh=0,qt=0;q1[qt++]=S;\n    while(qh<qt&&d1[G]==-1){\n        int s=q1[qh++];\n        int t=s,ebc=t%21-1;t/=21;int ebr=t%21-1;t/=21;\n        int c=t%N,r=t/N,dv=d1[s]+1;\n        for(int d=0;d<4;d++){\n            int nr=r+DR[d],nc=c+DC[d];\n            auto isB=[&](int br,int bc){return !inB(br,bc)||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){int ns=(nr*N+nc)*441+(ebr+1)*21+(ebc+1);\n                if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(0<<2)|d;q1[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}\n             if(sr!=r||sc!=c){int ns=(sr*N+sc)*441+(ebr+1)*21+(ebc+1);\n                if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(1<<2)|d;q1[qt++]=ns;}}}\n            if(inB(nr,nc)){\n                if(nr==ebr&&nc==ebc){int ns=(r*N+c)*441;\n                    if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}\n                else if(ebr==-1&&!grid[nr][nc]){int ns=(r*N+c)*441+(nr+1)*21+(nc+1);\n                    if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}\n            }\n        }\n    }\n    if(d1[G]==-1){\n        vector<pair<char,char>> res;int r=r0,c=c0;\n        while(r!=tr){res.push_back({'M',r<tr?'D':'U'});r+=(r<tr?1:-1);}\n        while(c!=tc){res.push_back({'M',c<tc?'R':'L'});c+=(c<tc?1:-1);}\n        return res;\n    }\n    vector<pair<char,char>> path;\n    for(int cur=G;cur!=S;cur=p1[cur])path.push_back({\"MSA\"[a1[cur]>>2],\"UDLR\"[a1[cur]&3]});\n    reverse(path.begin(),path.end());return path;\n}\n\nconst int NS2=N*N*2*21*21;\nstatic int d2[NS2],p2[NS2],q2[NS2];\nstatic uint8_t a2[NS2];\n\nvector<pair<char,char>> fp2(int r0,int c0,int tr1,int tc1,int tr2,int tc2){\n    memset(d2,-1,sizeof(d2));\n    auto E=[](int r,int c,int v,int ebr,int ebc){\n        return (r*N+c)*2*441+v*441+(ebr+1)*21+(ebc+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(tr2,tc2,1,-1,-1);\n    d2[S]=0;int qh=0,qt=0;q2[qt++]=S;\n    while(qh<qt&&d2[G]==-1){\n        int s=q2[qh++];\n        int t=s,ebc=t%21-1;t/=21;int ebr=t%21-1;t/=21;\n        int v=t%2;t/=2;int c=t%N,r=t/N,dv=d2[s]+1;\n        for(int d=0;d<4;d++){\n            int nr=r+DR[d],nc=c+DC[d];\n            auto isB=[&](int br,int bc){return !inB(br,bc)||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){\n                int nv=v|(nr==tr1&&nc==tc1?1:0);\n                int ns=E(nr,nc,nv,ebr,ebc);\n                if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(0<<2)|d;q2[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}\n             if(sr!=r||sc!=c){\n                int nv=v|(sr==tr1&&sc==tc1?1:0);\n                int ns=E(sr,sc,nv,ebr,ebc);\n                if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(1<<2)|d;q2[qt++]=ns;}}}\n            if(inB(nr,nc)){\n                if(nr==ebr&&nc==ebc){int ns=E(r,c,v,-1,-1);\n                    if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(2<<2)|d;q2[qt++]=ns;}}\n                else if(ebr==-1&&!grid[nr][nc]){int ns=E(r,c,v,nr,nc);\n                    if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(2<<2)|d;q2[qt++]=ns;}}\n            }\n        }\n    }\n    if(d2[G]==-1){\n        auto a=fp1(r0,c0,tr1,tc1),b=fp1(tr1,tc1,tr2,tc2);\n        a.insert(a.end(),b.begin(),b.end());return a;\n    }\n    vector<pair<char,char>> path;\n    for(int cur=G;cur!=S;cur=p2[cur])path.push_back({\"MSA\"[a2[cur]>>2],\"UDLR\"[a2[cur]&3]});\n    reverse(path.begin(),path.end());return path;\n}\n\nint cr,cc,eebr=-1,eebc=-1;\n\nvoid execPath(const vector<pair<char,char>>&path){\n    for(auto[a,d]:path){\n        cout<<a<<' '<<d<<'\\n';\n        int di=d=='U'?0:d=='D'?1:d=='L'?2:3;\n        int nr=cr+DR[di],nc=cc+DC[di];\n        if(a=='M'){cr=nr;cc=nc;}\n        else if(a=='S'){\n            while(inB(cr+DR[di],cc+DC[di])&&!grid[cr+DR[di]][cc+DC[di]]&&\n                  !(cr+DR[di]==eebr&&cc+DC[di]==eebc))\n                cr+=DR[di],cc+=DC[di];\n        }else{\n            if(nr==eebr&&nc==eebc){eebr=eebc=-1;}\n            else if(eebr==-1&&!grid[nr][nc]){eebr=nr;eebc=nc;}\n            else grid[nr][nc]^=1;\n        }\n    }\n    eebr=eebc=-1;\n}\n\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int Nin,M;cin>>Nin>>M;\n    vector<pair<int,int>> pts(M);\n    for(int i=0;i<M;i++)cin>>pts[i].first>>pts[i].second;\n    memset(grid,0,sizeof(grid));\n    cr=pts[0].first;cc=pts[0].second;\n    eebr=eebc=-1;\n    int k=1;\n    while(k<M){\n        int tr=pts[k].first,tc=pts[k].second;\n        if(k+1<M){\n            int tr2=pts[k+1].first,tc2=pts[k+1].second;\n            auto jp=fp2(cr,cc,tr,tc,tr2,tc2);\n            auto ip1=fp1(cr,cc,tr,tc);\n            auto ip2=fp1(tr,tc,tr2,tc2);\n            if((int)jp.size()<(int)ip1.size()+(int)ip2.size()){\n                execPath(jp);\n                cr=tr2;cc=tc2;k+=2;\n            }else{\n                execPath(ip1);\n                cr=tr;cc=tc;k+=1;\n            }\n        }else{\n            execPath(fp1(cr,cc,tr,tc));\n            cr=tr;cc=tc;k+=1;\n        }\n    }\n    return 0;\n}"},"4":{"ahc001":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=205;\nint n,px[MAXN],py[MAXN];long long pr[MAXN];\ndouble score_pi(double si,long long ri){if(si<=0)return 0;double r=(si<=(double)ri)?si/ri:(double)ri/si;return 1-(1-r)*(1-r);}\nstruct Split{int x1,y1,x2,y2,dir,sp,lo,hi;vector<int>L,R;};\nvector<Split>splits;int rx1[MAXN],ry1[MAXN],rx2[MAXN],ry2[MAXN];\nvoid recompute(){for(int i=0;i<n;i++){rx1[i]=0;ry1[i]=0;rx2[i]=10000;ry2[i]=10000;}for(auto&s:splits){for(int i:s.L){if(s.dir==0)rx2[i]=min(rx2[i],s.sp);else ry2[i]=min(ry2[i],s.sp);}for(int j:s.R){if(s.dir==0)rx1[j]=max(rx1[j],s.sp);else ry1[j]=max(ry1[j],s.sp);}}}\ndouble evalAt(const Split&s,int sp){double t=0;for(int i:s.L){int nx2=(s.dir==0&&rx2[i]==s.sp)?sp:rx2[i];int ny2=(s.dir==1&&ry2[i]==s.sp)?sp:ry2[i];t+=score_pi((double)max(0,nx2-rx1[i])*max(0,ny2-ry1[i]),pr[i]);}for(int j:s.R){int nx1=(s.dir==0&&rx1[j]==s.sp)?sp:rx1[j];int ny1=(s.dir==1&&ry1[j]==s.sp)?sp:ry1[j];t+=score_pi((double)max(0,rx2[j]-nx1)*max(0,ry2[j]-ny1),pr[j]);}return t;}\nmt19937 rng(42);double p_rand=0;\nvoid doBuild(vector<int>comp,int x1,int y1,int x2,int y2){\n    int nc=(int)comp.size();if(nc==1)return;\n    long long tr=0;for(int i:comp)tr+=pr[i];long long H=y2-y1,W=x2-x1;\n    vector<int>bx(comp),by(comp);\n    sort(bx.begin(),bx.end(),[](int a,int b){return px[a]<px[b];});\n    sort(by.begin(),by.end(),[](int a,int b){return py[a]<py[b];});\n    struct Cand{double sc;int dir,k,sp,lo,hi;};vector<Cand>cands;\n    auto ss=[](long long AL,long long RL,int nL,long long AR,long long RR,int nR){double a=(RL<=0||AL>=RL)?(double)nL:nL*(1-pow(1-(double)AL/RL,2));double b=(RR<=0||AR>=RR)?(double)nR:nR*(1-pow(1-(double)AR/RR,2));return a+b;};\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[bx[k-1]];if(px[bx[k-1]]>=px[bx[k]])continue;int lo=max(px[bx[k-1]]+1,x1+1),hi=min(px[bx[k]],x2-1);if(lo>hi)continue;int sp=(int)round(x1+(double)W*pf/tr);sp=max(lo,min(hi,sp));cands.push_back({ss((long long)(sp-x1)*H,pf,k,(long long)(x2-sp)*H,tr-pf,nc-k),0,k,sp,lo,hi});}}\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[by[k-1]];if(py[by[k-1]]>=py[by[k]])continue;int lo=max(py[by[k-1]]+1,y1+1),hi=min(py[by[k]],y2-1);if(lo>hi)continue;int sp=(int)round(y1+(double)H*pf/tr);sp=max(lo,min(hi,sp));cands.push_back({ss((long long)(sp-y1)*W,pf,k,(long long)(y2-sp)*W,tr-pf,nc-k),1,k,sp,lo,hi});}}\n    if(cands.empty())return;\n    sort(cands.begin(),cands.end(),[](const Cand&a,const Cand&b){return a.sc>b.sc;});\n    int ch=0;if(p_rand>0&&(int)cands.size()>1){int K=min((int)cands.size(),5);if(uniform_real_distribution<double>(0,1)(rng)<p_rand)ch=rng()%K;}\n    auto&c=cands[ch];Split s;s.x1=x1;s.y1=y1;s.x2=x2;s.y2=y2;s.dir=c.dir;s.sp=c.sp;s.lo=c.lo;s.hi=c.hi;\n    if(c.dir==0){for(int i=0;i<c.k;i++)s.L.push_back(bx[i]);for(int i=c.k;i<nc;i++)s.R.push_back(bx[i]);splits.push_back(s);doBuild(s.L,x1,y1,s.sp,y2);doBuild(s.R,s.sp,y1,x2,y2);}\n    else{for(int i=0;i<c.k;i++)s.L.push_back(by[i]);for(int i=c.k;i<nc;i++)s.R.push_back(by[i]);splits.push_back(s);doBuild(s.L,x1,y1,x2,s.sp);doBuild(s.R,x1,s.sp,x2,y2);}\n}\nbool lsPass(){bool imp=false;for(auto&s:splits){if(s.lo>=s.hi)continue;int bsp=s.sp;double bs=evalAt(s,s.sp);int lo=s.lo,hi=s.hi;while(hi-lo>=3){int m1=lo+(hi-lo)/3,m2=hi-(hi-lo)/3;double s1=evalAt(s,m1),s2=evalAt(s,m2);if(s1<s2-1e-9)lo=m1+1;else if(s2<s1-1e-9)hi=m2-1;else{lo=m1;hi=m2;}}for(int sp=lo;sp<=hi;sp++){double sc=evalAt(s,sp);if(sc>bs){bs=sc;bsp=sp;}}if(bsp!=s.sp){s.sp=bsp;recompute();imp=true;}}return imp;}\ndouble computeScore(){double t=0;for(int i=0;i<n;i++){long long A=(long long)(rx2[i]-rx1[i])*(ry2[i]-ry1[i]);t+=score_pi((double)min(A,(long long)pr[i]),pr[i]);}return t;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>n;for(int i=0;i<n;i++)cin>>px[i]>>py[i]>>pr[i];\n    vector<int>all(n);iota(all.begin(),all.end(),0);\n    auto t0=chrono::steady_clock::now();\n    auto msf=[&](){return(int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    const double prs[]={0.0,0.1,0.2,0.3,0.4,0.5};\n    double best=-1;int bx1[MAXN],by1[MAXN],bx2[MAXN],by2[MAXN];\n    auto save=[&](){for(int i=0;i<n;i++){bx1[i]=rx1[i];by1[i]=ry1[i];bx2[i]=rx2[i];by2[i]=ry2[i];}};\n    vector<pair<uint32_t,double>>tinfo;\n    vector<pair<double,int>>ph1;\n    // Phase 1: Quick 2-pass evaluation\n    for(int trial=0;msf()<2200;trial++){\n        uint32_t seed=(uint32_t)(trial*7919+12345);\n        double pr=prs[trial==0?0:1+(trial-1)%5];\n        splits.clear();rng.seed(seed);p_rand=pr;\n        doBuild(all,0,0,10000,10000);recompute();\n        for(int p=0;p<2&&msf()<2200;p++)if(!lsPass())break;\n        double q=computeScore();\n        tinfo.emplace_back(seed,pr);\n        ph1.emplace_back(q,(int)tinfo.size()-1);\n        if(q>best){best=q;save();}\n    }\n    // Phase 2: Full LS on top trials\n    sort(ph1.rbegin(),ph1.rend());\n    for(auto&[q,tid]:ph1){\n        if(msf()>4500)break;\n        splits.clear();rng.seed(tinfo[tid].first);p_rand=tinfo[tid].second;\n        doBuild(all,0,0,10000,10000);recompute();\n        while(msf()<4500)if(!lsPass())break;\n        double sc=computeScore();\n        if(sc>best){best=sc;save();}\n    }\n    for(int i=0;i<n;i++){\n        int x1=bx1[i],y1=by1[i],x2=bx2[i],y2=by2[i],W=x2-x1,H=y2-y1,xi=px[i],yi=py[i];\n        long long A=(long long)W*H,ri=pr[i];\n        if(A<=(long long)ri){cout<<x1<<\" \"<<y1<<\" \"<<x2<<\" \"<<y2<<\"\\n\";continue;}\n        double br=0;int bw=W,bh=H;bool done=false;\n        for(int w=1;w<=W&&!done;w++){long long h0=ri/w;for(int dh=0;dh<=1;dh++){long long hh=h0+dh;if(hh<1||hh>(long long)H)continue;long long area=(long long)w*hh;double ratio=area<=(long long)ri?(double)area/ri:(double)ri/area;if(ratio>br){br=ratio;bw=w;bh=(int)hh;if(br>=1-1e-9){done=true;break;}}}}\n        int a=max(x1,xi+1-bw),b=max(y1,yi+1-bh);\n        cout<<a<<\" \"<<b<<\" \"<<(a+bw)<<\" \"<<(b+bh)<<\"\\n\";\n    }\n    return 0;\n}","ahc002":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef chrono::steady_clock Clock;\nconst int N=50,MAXM=N*N+1;\nint si,sj,M,tid[N][N],pval[N][N];\nconst int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\nconst char dc[]={'U','D','L','R'};\nmt19937 rng;\nbool tu[MAXM],btu[MAXM];\nint pi_[MAXM],pj_[MAXM],pt_[MAXM],bpi[MAXM],bpj[MAXM],bpt[MAXM];\nchar pmv[MAXM],bpmv[MAXM];\nint plen,blen;long long cscore,bscore;int ci,cj;\nvoid save_best(){if(cscore<=bscore)return;bscore=cscore;blen=plen;memcpy(btu,tu,M);memcpy(bpi,pi_,plen*4);memcpy(bpj,pj_,plen*4);memcpy(bpt,pt_,plen*4);if(plen>1)memcpy(bpmv,pmv,plen-1);}\nvoid restore_best(){cscore=bscore;plen=blen;memcpy(tu,btu,M);memcpy(pi_,bpi,plen*4);memcpy(pj_,bpj,plen*4);memcpy(pt_,bpt,plen*4);if(plen>1)memcpy(pmv,bpmv,plen-1);ci=pi_[plen-1];cj=pj_[plen-1];}\nvoid walk_init(){fill(tu,tu+M,false);plen=1;ci=si;cj=sj;pi_[0]=si;pj_[0]=sj;pt_[0]=tid[si][sj];tu[tid[si][sj]]=true;cscore=pval[si][sj];}\nbool walk_step(double a,double b,double g,double g2){\n    int bd=-1;double bh=-1e18;\n    for(int d=0;d<4;d++){\n        int ni=ci+dx[d],nj=cj+dy[d];\n        if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;\n        int t=tid[ni][nj];if(tu[t])continue;\n        tu[t]=true;\n        int cnt=0;double nv=0,nv2=0;\n        for(int d2=0;d2<4;d2++){\n            int nni=ni+dx[d2],nnj=nj+dy[d2];\n            if((unsigned)nni>=(unsigned)N||(unsigned)nnj>=(unsigned)N)continue;\n            int t2=tid[nni][nnj];if(tu[t2])continue;\n            cnt++;nv+=pval[nni][nnj];\n            for(int d3=0;d3<4;d3++){\n                int n3i=nni+dx[d3],n3j=nnj+dy[d3];\n                if((unsigned)n3i>=(unsigned)N||(unsigned)n3j>=(unsigned)N)continue;\n                int t3=tid[n3i][n3j];\n                if(!tu[t3]&&t3!=t2)nv2+=pval[n3i][n3j];\n            }\n        }\n        tu[t]=false;\n        double h=a*pval[ni][nj]+g*nv+g2*nv2-b*cnt+(cnt==0?-1e6:0.0)\n               +uniform_real_distribution<double>(-0.5,0.5)(rng);\n        if(h>bh){bh=h;bd=d;}\n    }\n    if(bd==-1)return false;\n    int ni=ci+dx[bd],nj=cj+dy[bd];\n    tu[tid[ni][nj]]=true;cscore+=pval[ni][nj];pmv[plen-1]=dc[bd];\n    pi_[plen]=ni;pj_[plen]=nj;pt_[plen]=tid[ni][nj];plen++;ci=ni;cj=nj;return true;\n}\nvoid walk_extend(double a,double b,double g,double g2){while(walk_step(a,b,g,g2));}\nvoid walk_undo(int s){s=min(s,plen-1);while(s-->0){plen--;tu[pt_[plen]]=false;cscore-=pval[pi_[plen]][pj_[plen]];}ci=pi_[plen-1];cj=pj_[plen-1];}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    rng.seed(chrono::steady_clock::now().time_since_epoch().count());\n    cin>>si>>sj;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>tid[i][j];\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>pval[i][j];\n    M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)M=max(M,tid[i][j]+1);\n    bscore=pval[si][sj];blen=1;bpi[0]=si;bpj[0]=sj;bpt[0]=tid[si][sj];\n    fill(btu,btu+M,false);btu[tid[si][sj]]=true;\n    auto deadline=Clock::now()+chrono::milliseconds(1850);\n    for(int iter=0;Clock::now()<deadline;iter++){\n        double a=uniform_real_distribution<double>(0.5,2.0)(rng);\n        double b=uniform_real_distribution<double>(0,25)(rng);\n        double g=uniform_real_distribution<double>(0,1.0)(rng);\n        double g2=uniform_real_distribution<double>(0,0.1)(rng);\n        if(iter%4==0||blen<=1){walk_init();}\n        else{\n            restore_best();\n            int mb=blen-1,back,r=rng()%10;\n            if(r<5)back=uniform_int_distribution<int>(1,max(1,mb/10))(rng);\n            else if(r<8)back=uniform_int_distribution<int>(max(1,mb/10),max(1,mb/3))(rng);\n            else back=uniform_int_distribution<int>(max(1,mb/3),mb)(rng);\n            walk_undo(back);\n        }\n        walk_extend(a,b,g,g2);\n        save_best();\n    }\n    cout<<string(bpmv,bpmv+blen-1)<<\"\\n\";\n}","ahc003":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30;\nconst double DELTA_VAR=1e6,INIT_SIG2_R=1e8,INIT_SIG2_E=1e7,MIN_SIG2=1e4;\ndouble mu_row[N],sig2_row[N],mu_col[N],sig2_col[N];\ndouble mu_h[N][N-1],sig2_h[N][N-1],mu_v[N-1][N],sig2_v[N-1][N];\nbool obs_h[N][N-1],obs_v[N-1][N];\ndouble wh(int i,int j){return obs_h[i][j]?mu_h[i][j]:mu_row[i];}\ndouble wv(int i,int j){return obs_v[i][j]?mu_v[i][j]:mu_col[j];}\nstring dijkstra(int sr,int sc,int tr,int tc){\n    static double dist[N*N];static int par[N*N];static char pdir[N*N];\n    fill(dist,dist+N*N,1e18);\n    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>> pq;\n    int src=sr*N+sc,dst=tr*N+tc;dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){\n        auto[d,u]=pq.top();pq.pop();\n        if(d>dist[u]+1e-9)continue;if(u==dst)break;\n        int r=u/N,c=u%N;\n        if(r>0){int nv=(r-1)*N+c;double nd=d+wv(r-1,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='U';pq.push({nd,nv});}}\n        if(r<N-1){int nv=(r+1)*N+c;double nd=d+wv(r,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='D';pq.push({nd,nv});}}\n        if(c>0){int nv=r*N+(c-1);double nd=d+wh(r,c-1);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='L';pq.push({nd,nv});}}\n        if(c<N-1){int nv=r*N+(c+1);double nd=d+wh(r,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='R';pq.push({nd,nv});}}\n    }\n    string path;for(int cur=dst;cur!=src;cur=par[cur])path+=pdir[cur];\n    reverse(path.begin(),path.end());return path;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    for(int i=0;i<N;i++){mu_row[i]=5000;sig2_row[i]=INIT_SIG2_R;}\n    for(int j=0;j<N;j++){mu_col[j]=5000;sig2_col[j]=INIT_SIG2_R;}\n    for(int q=0;q<1000;q++){\n        int sr,sc,tr,tc;cin>>sr>>sc>>tr>>tc;\n        string path=dijkstra(sr,sc,tr,tc);cout<<path<<\"\\n\";cout.flush();\n        int obs;cin>>obs;\n        double noise_var=(double)obs*obs/300.0;\n        int kh[N]={},lv[N]={};\n        struct E{bool is_h;int i,j;};vector<E> edges;\n        int r=sr,c=sc;\n        for(char ch:path){\n            if(ch=='U'){edges.push_back({false,r-1,c});lv[c]++;r--;}\n            else if(ch=='D'){edges.push_back({false,r,c});lv[c]++;r++;}\n            else if(ch=='L'){edges.push_back({true,r,c-1});kh[r]++;c--;}\n            else{edges.push_back({true,r,c});kh[r]++;c++;}\n        }\n        double pred_r=0,pvar_r=0;\n        for(int i=0;i<N;i++)if(kh[i]>0){pred_r+=kh[i]*mu_row[i];pvar_r+=(double)kh[i]*kh[i]*sig2_row[i]+kh[i]*DELTA_VAR;}\n        for(int j=0;j<N;j++)if(lv[j]>0){pred_r+=lv[j]*mu_col[j];pvar_r+=(double)lv[j]*lv[j]*sig2_col[j]+lv[j]*DELTA_VAR;}\n        double tvr=pvar_r+noise_var,resr=(double)obs-pred_r;\n        for(int i=0;i<N;i++)if(kh[i]>0){double K=sig2_row[i]*kh[i]/tvr;mu_row[i]=clamp(mu_row[i]+K*resr,1000.0,9000.0);sig2_row[i]=max(sig2_row[i]*(1.0-K*kh[i]),MIN_SIG2);}\n        for(int j=0;j<N;j++)if(lv[j]>0){double K=sig2_col[j]*lv[j]/tvr;mu_col[j]=clamp(mu_col[j]+K*resr,1000.0,9000.0);sig2_col[j]=max(sig2_col[j]*(1.0-K*lv[j]),MIN_SIG2);}\n        for(auto& e:edges){\n            if(e.is_h&&!obs_h[e.i][e.j]){obs_h[e.i][e.j]=true;mu_h[e.i][e.j]=mu_row[e.i];sig2_h[e.i][e.j]=INIT_SIG2_E;}\n            else if(!e.is_h&&!obs_v[e.i][e.j]){obs_v[e.i][e.j]=true;mu_v[e.i][e.j]=mu_col[e.j];sig2_v[e.i][e.j]=INIT_SIG2_E;}\n        }\n        double pred_e=0,pvar_e=0;\n        for(auto& e:edges){pred_e+=(e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j]);pvar_e+=(e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j]);}\n        double tve=pvar_e+noise_var,rese=(double)obs-pred_e;\n        for(auto& e:edges){\n            double& mu=e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j];\n            double& s2=e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j];\n            double K=s2/tve;mu=clamp(mu+K*rese,1000.0,9000.0);s2=max(s2*(1.0-K),MIN_SIG2);\n        }\n    }\n    return 0;\n}","ahc004":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20,MAXM=800,MAXL=12;\nint M,bs,score;\nint8_t grid[N][N],bg[N][N],h_mm[N][MAXM][N],v_mm[N][MAXM][N];\nint match_count[MAXM],slen[MAXM];\nint8_t S[MAXM][MAXL],char_pos[MAXM][8][MAXL],char_pos_cnt[MAXM][8];\nuint8_t char_appears[MAXM];\nint unsat_arr[MAXM],unsat_cnt,unsat_pos[MAXM];\nvoid unsat_remove(int k){int pos=unsat_pos[k];if(pos<0)return;int last=unsat_arr[--unsat_cnt];unsat_arr[pos]=last;unsat_pos[last]=pos;unsat_pos[k]=-1;}\nvoid unsat_add(int k){if(unsat_pos[k]>=0)return;unsat_pos[k]=unsat_cnt;unsat_arr[unsat_cnt++]=k;}\nvoid apply_cell(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int om=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;match_count[k]-=(h_mm[r][k][j]==0);h_mm[r][k][j]++;match_count[k]-=(v_mm[c][k][i2]==0);v_mm[c][k][i2]++;}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;h_mm[r][k][j]--;match_count[k]+=(h_mm[r][k][j]==0);v_mm[c][k][i2]--;match_count[k]+=(v_mm[c][k][i2]==0);}\n        int nm=match_count[k];if(om>0&&nm==0){unsat_add(k);score--;}else if(om==0&&nm>0){unsat_remove(k);score++;}}grid[r][c]=nc;}\nint compute_delta(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);int d=0;\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int mc=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi];mc-=(h_mm[r][k][(c-p+N)%N]==0);mc-=(v_mm[c][k][(r-p+N)%N]==0);}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi];mc+=(h_mm[r][k][(c-p+N)%N]==1);mc+=(v_mm[c][k][(r-p+N)%N]==1);}\n        d+=(mc>0)-(match_count[k]>0);}return d;}\nvoid recompute(){score=0;unsat_cnt=0;fill(unsat_pos,unsat_pos+M,-1);\n    for(int r=0;r<N;r++)for(int k=0;k<M;k++)for(int j=0;j<N;j++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[r][(j+p)%N]!=S[k][p]);h_mm[r][k][j]=mm;}\n    for(int c=0;c<N;c++)for(int k=0;k<M;k++)for(int i=0;i<N;i++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[(i+p)%N][c]!=S[k][p]);v_mm[c][k][i]=mm;}\n    for(int k=0;k<M;k++){match_count[k]=0;for(int r=0;r<N;r++)for(int j=0;j<N;j++)match_count[k]+=(h_mm[r][k][j]==0);for(int c=0;c<N;c++)for(int i=0;i<N;i++)match_count[k]+=(v_mm[c][k][i]==0);if(match_count[k]>0)score++;else unsat_add(k);}}\nvoid safe_refresh(){\n    int votes[N][N][8];memset(votes,0,sizeof(votes));\n    for(int k=0;k<M;k++){int bm=INT_MAX,br=0,bj=0,bd=0;\n        for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n        for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n        int rthr=max(0,min(3,slen[k]>=7?slen[k]-4:slen[k]-5));\n        if(bm>rthr)continue;\n        for(int p=0;p<slen[k];p++){int rr=bd?(br+p)%N:br,cc=bd?bj:(bj+p)%N;votes[rr][cc][S[k][p]]++;}}\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int bc=0,bv=votes[r][c][0];\n        for(int ch=1;ch<8;ch++)if(votes[r][c][ch]>bv){bv=votes[r][c][ch];bc=ch;}\n        if(bv>0&&grid[r][c]!=bc){int d=compute_delta(r,c,grid[r][c],bc);\n            if(d>0){apply_cell(r,c,grid[r][c],bc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}}}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int n;cin>>n>>M;\n    for(int k=0;k<M;k++){string s;cin>>s;slen[k]=s.size();char_appears[k]=0;memset(char_pos_cnt[k],0,8);\n        for(int p=0;p<slen[k];p++){int ch=s[p]-'A';S[k][p]=ch;char_pos[k][ch][char_pos_cnt[k][ch]++]=p;char_appears[k]|=(1u<<ch);}}\n    mt19937 rng(42);\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)grid[i][j]=rng()%8;\n    recompute();bs=score;memcpy(bg,grid,sizeof(grid));\n    auto t0=chrono::steady_clock::now();const double TL=2.85;\n    if(score<M*5/100){\n        while(unsat_cnt>0){double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=0.15||score>=M*2/5)break;\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n            for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n            for(int p=0;p<slen[k];p++){int rr=bd?(br+p)%N:br,cc=bd?bj:(bj+p)%N;int nc=S[k][p],oc=grid[rr][cc];if(nc!=oc)apply_cell(rr,cc,oc,nc);}\n            if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}\n        if(score!=bs){memcpy(grid,bg,sizeof(grid));recompute();}}\n    double sa0=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n    double sad=max(0.1,TL-sa0);\n    double phase1_end=sa0+sad*0.50;\n    bool restart_triggered=false,restart_done=false;\n    double T=5.0;\n    for(int iter=0;;iter++){\n        if((iter&0xFFF)==0){\n            double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=TL)break;\n            if(!restart_triggered&&el>=phase1_end){\n                restart_triggered=true;\n                if(bs<M*90/100){\n                    restart_done=true;\n                    memcpy(grid,bg,sizeof(grid));recompute();\n                    for(int i=0;i<5;i++){int r=rng()%N,c=rng()%N,nc=rng()%8;if(nc!=grid[r][c])apply_cell(r,c,grid[r][c],nc);}\n                }\n            }\n            if(restart_done){double prog=min(1.0,max(0.0,(el-phase1_end)/(TL-phase1_end)));T=2.0*pow(0.001/2.0,prog);}\n            else{double prog=min(1.0,max(0.0,(el-sa0)/sad));T=5.0*pow(0.001/5.0,prog);}\n        }\n        if(iter>0&&(iter%100000)==0&&bs<M*95/100)safe_refresh();\n        bool guided=false;int r,c,nc,oc;\n        if(unsat_cnt>0&&rng()%(uint32_t)M<(uint32_t)unsat_cnt){\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int rr=0;rr<N;rr++)for(int jj=0;jj<N;jj++)if(h_mm[rr][k][jj]<bm){bm=h_mm[rr][k][jj];br=rr;bj=jj;bd=0;}\n            for(int cc=0;cc<N;cc++)for(int ii=0;ii<N;ii++)if(v_mm[cc][k][ii]<bm){bm=v_mm[cc][k][ii];br=ii;bj=cc;bd=1;}\n            int thr=max(0,min(3,slen[k]>=7?slen[k]-4:slen[k]-5));\n            if(bm>=1&&bm<=thr)for(int p=0;p<slen[k]&&!guided;p++){int rr=bd?(br+p)%N:br,cc2=bd?bj:(bj+p)%N;if(grid[rr][cc2]!=S[k][p]){r=rr;c=cc2;nc=S[k][p];oc=grid[rr][cc2];guided=true;}}\n        }\n        if(!guided){r=rng()%N;c=rng()%N;nc=rng()%8;oc=grid[r][c];if(nc==oc)continue;}\n        int d=compute_delta(r,c,oc,nc);\n        if(d>=0||(double)rng()<exp((double)d/T)*4294967295.0){apply_cell(r,c,oc,nc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}\n    }\n    for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<(char)('A'+bg[i][j]);cout<<'\\n';}\n}","ahc005":"#include <bits/stdc++.h>\nusing namespace std;\nint N, si, sj;\nvector<string> grid;\nbool isRoad(int r, int c) { return r>=0&&r<N&&c>=0&&c<N&&grid[r][c]!='#'; }\nconst int INF=1e9;\npair<vector<int>,vector<int>> dijkstra(int src) {\n    vector<int> dist(N*N,INF),par(N*N,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;\n    dist[src]=0; pq.push({0,src});\n    const int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\n    while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>dist[u])continue;int r=u/N,c=u%N;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!isRoad(nr,nc))continue;int v=nr*N+nc,nd=dd+(grid[nr][nc]-'0');if(nd<dist[v]){dist[v]=nd;par[v]=u;pq.push({nd,v});}}}\n    return{dist,par};\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>si>>sj;grid.resize(N);for(int i=0;i<N;i++)cin>>grid[i];\n    vector<int> roads;vector<int> rIdx(N*N,-1);\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)if(isRoad(r,c)){rIdx[r*N+c]=roads.size();roads.push_back(r*N+c);}\n    int R=roads.size();\n    vector<vector<int>> vis(R);\n    for(int i=0;i<R;i++){int r=roads[i]/N,c=roads[i]%N;vis[i].push_back(i);for(int dd=1;c+dd<N&&isRoad(r,c+dd);dd++)vis[i].push_back(rIdx[r*N+(c+dd)]);for(int dd=1;c-dd>=0&&isRoad(r,c-dd);dd++)vis[i].push_back(rIdx[r*N+(c-dd)]);for(int dd=1;r+dd<N&&isRoad(r+dd,c);dd++)vis[i].push_back(rIdx[(r+dd)*N+c]);for(int dd=1;r-dd>=0&&isRoad(r-dd,c);dd++)vis[i].push_back(rIdx[(r-dd)*N+c]);}\n    vector<bool> covered(R,false);int uncov=R;vector<int> cnt(R);for(int i=0;i<R;i++)cnt[i]=vis[i].size();\n    priority_queue<pair<int,int>> pqsc;for(int i=0;i<R;i++)pqsc.push({cnt[i],i});\n    vector<int> sents;\n    while(uncov>0){int best=-1;while(!pqsc.empty()){auto[cv,id]=pqsc.top();pqsc.pop();if(cv==cnt[id]){best=id;break;}}if(best<0)break;sents.push_back(roads[best]);for(int j:vis[best])if(!covered[j]){covered[j]=true;uncov--;for(int k:vis[j]){cnt[k]--;pqsc.push({cnt[k],k});}}}\n    int stSq=si*N+sj;{auto it=find(sents.begin(),sents.end(),stSq);if(it==sents.end())sents.insert(sents.begin(),stSq);else swap(*it,sents[0]);}\n    int S=sents.size();\n    {vector<int> covCnt(R,0);for(int sq:sents)for(int j:vis[rIdx[sq]])covCnt[j]++;bool changed=true;while(changed){changed=false;for(int i=S-1;i>=1;i--){if(sents[i]<0)continue;int ridx=rIdx[sents[i]];bool red=true;for(int j:vis[ridx])if(covCnt[j]<=1){red=false;break;}if(red){for(int j:vis[ridx])covCnt[j]--;sents[i]=-1;changed=true;}}}sents.erase(remove(sents.begin(),sents.end(),-1),sents.end());S=sents.size();}\n    vector<vector<int>> allDist(S),allPar(S);\n    for(int i=0;i<S;i++){auto[d,p]=dijkstra(sents[i]);allDist[i]=move(d);allPar[i]=move(p);}\n    vector<vector<int>> dm(S,vector<int>(S,INF));for(int i=0;i<S;i++)for(int j=0;j<S;j++)dm[i][j]=allDist[i][sents[j]];\n    vector<bool> tvis(S,false);vector<int> tour={0};tvis[0]=true;\n    for(int s=1;s<S;s++){int cur=tour.back(),best=-1,bd=INF;for(int j=0;j<S;j++)if(!tvis[j]&&dm[cur][j]<bd){bd=dm[cur][j];best=j;}tour.push_back(best);tvis[best]=true;}\n    for(bool imp=true;imp;){imp=false;for(int i=0;i<S-1;i++)for(int j=i+2;j<S;j++){if(i==0&&j==S-1)continue;int ta=tour[i],tb=tour[i+1],tc=tour[j],td=tour[(j+1)%S];if(dm[ta][tc]+dm[tb][td]<dm[ta][tb]+dm[tc][td]){reverse(tour.begin()+i+1,tour.begin()+j+1);imp=true;}}}\n    string res;\n    for(int i=0;i<S;i++){int fi=tour[i],toSq=sents[tour[(i+1)%S]],srcSq=sents[fi];vector<int> path;for(int cur=toSq;cur!=srcSq;cur=allPar[fi][cur])path.push_back(cur);reverse(path.begin(),path.end());int pp=srcSq;for(int nx:path){int pr=pp/N,pc=pp%N,nr=nx/N,nc=nx%N;if(nr<pr)res+='U';else if(nr>pr)res+='D';else if(nc<pc)res+='L';else res+='R';pp=nx;}}\n    cout<<res<<\"\\n\";return 0;\n}","future-contest-2022-qual":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,K,R;\nvector<vector<int>> d,succs;\nvector<int> task_st,task_pre,task_w,worker_t,task_sd;\nvector<vector<double>> sk,et;\nvector<vector<int>> lb;\nvector<vector<pair<int,int>>> obs;\nvector<double> cp;\nint cur_day; double prior_sk;\nvoid upd_et(int w){for(int i=0;i<N;i++){double ww=0;for(int k=0;k<K;k++){double df=d[i][k]-sk[w][k];if(df>0)ww+=df;}et[i][w]=ww<0.5?1.0:ww;}}\nvoid calc_cp(){cp.assign(N,0.0);for(int i=N-1;i>=0;i--){if(task_st[i]==2)continue;double mn;if(task_st[i]==1){double rem=task_sd[i]+et[i][task_w[i]]-cur_day;mn=max(1.0,rem);}else{mn=et[i][0];for(int j=1;j<M;j++)mn=min(mn,et[i][j]);}double mx=0;for(int v:succs[i])mx=max(mx,cp[v]);cp[i]=mn+mx;}}\nvoid refit(int w){int n=(int)obs[w].size();double decay=exp(-0.1*n);for(int k=0;k<K;k++)sk[w][k]=max((double)lb[w][k],prior_sk*decay);double lr=1.0;for(int it=0;it<200;it++){double delta[20]={};double loss=0;for(auto&[ti,to]:obs[w]){double wh=0;for(int k=0;k<K;k++){double df=d[ti][k]-sk[w][k];if(df>0)wh+=df;}double tgt=to==1?0.0:(double)to,err=wh-tgt;loss+=err*err;for(int k=0;k<K;k++){if(d[ti][k]>sk[w][k])delta[k]+=err;else if(err<-0.5&&d[ti][k]>0)delta[k]+=0.3*err;}}bool ch=false;for(int k=0;k<K;k++){double ns=max((double)lb[w][k],max(0.0,sk[w][k]+lr*delta[k]/n));if(ns!=sk[w][k]){sk[w][k]=ns;ch=true;}}if(!ch||loss/n<0.1)break;lr*=0.95;}upd_et(w);}\nint main(){\nios::sync_with_stdio(false);cin.tie(nullptr);\ncin>>N>>M>>K>>R;d.assign(N,vector<int>(K));for(int i=0;i<N;i++)for(int k=0;k<K;k++)cin>>d[i][k];\nsuccs.assign(N,{});task_pre.assign(N,0);for(int r=0;r<R;r++){int u,v;cin>>u>>v;u--;v--;succs[u].push_back(v);task_pre[v]++;}\ntask_st.assign(N,0);task_w.assign(N,-1);worker_t.assign(M,-1);task_sd.assign(N,0);\nprior_sk=40.0/sqrt((double)K);sk.assign(M,vector<double>(K,prior_sk));lb.assign(M,vector<int>(K,0));obs.resize(M);\net.assign(N,vector<double>(M));for(int j=0;j<M;j++)upd_et(j);\nset<int>avail,idle;for(int i=0;i<N;i++)if(!task_pre[i])avail.insert(i);for(int j=0;j<M;j++)idle.insert(j);\ncur_day=0;\nwhile(true){cur_day++;calc_cp();\nvector<int>av(avail.begin(),avail.end());sort(av.begin(),av.end(),[](int a,int b){return cp[a]>cp[b];});\nvector<pair<int,int>>asgn;set<int>id=idle;\nfor(int t:av){if(id.empty())break;int bw=-1;double bt=1e18;for(int j:id)if(et[t][j]<bt){bt=et[t][j];bw=j;}asgn.push_back({bw,t});id.erase(bw);}\nint na=(int)asgn.size();\nif(na>=2){vector<double>rcp_a(na,0.0);for(int i=0;i<na;i++)for(int v:succs[asgn[i].second])rcp_a[i]=max(rcp_a[i],cp[v]);\nbool impr=true;while(impr){impr=false;for(int i=0;i<na;i++){for(int j=i+1;j<na;j++){int wi=asgn[i].first,ti=asgn[i].second,wj=asgn[j].first,tj=asgn[j].second;double ci=et[ti][wi]+rcp_a[i],cj=et[tj][wj]+rcp_a[j];double cs=max(et[ti][wj]+rcp_a[i],et[tj][wi]+rcp_a[j]);if(cs<max(ci,cj)-1e-9){swap(asgn[i].first,asgn[j].first);impr=true;}}}}}\ncout<<asgn.size();for(auto[w,t]:asgn){cout<<' '<<w+1<<' '<<t+1;task_w[t]=w;worker_t[w]=t;task_sd[t]=cur_day;task_st[t]=1;avail.erase(t);idle.erase(w);}\ncout<<'\\n';cout.flush();\nint nc;cin>>nc;if(nc==-1)break;\nfor(int i=0;i<nc;i++){int w;cin>>w;w--;int t=worker_t[w];int tk=cur_day-task_sd[t]+1;\nobs[w].push_back({t,tk});if(tk==1)for(int k=0;k<K;k++)lb[w][k]=max(lb[w][k],d[t][k]);refit(w);\ntask_st[t]=2;task_w[t]=-1;worker_t[w]=-1;idle.insert(w);for(int v:succs[t])if(!--task_pre[v])avail.insert(v);}}}","ahc006":"#include <bits/stdc++.h>\nusing namespace std;\nconst int OX=400,OY=400,TOT=1000,K=50,NN=2*K+1;\nint A[TOT],B[TOT],C[TOT],D[TOT],sel[K],NX[NN],NY[NN];\nint md(int x1,int y1,int x2,int y2){return abs(x1-x2)+abs(y1-y2);}\nint ec(int u,int v){return md(NX[u],NY[u],NX[v],NY[v]);}\nvoid refresh(){NX[0]=OX;NY[0]=OY;for(int i=0;i<K;i++){NX[i+1]=A[sel[i]];NY[i+1]=B[sel[i]];NX[K+i+1]=C[sel[i]];NY[K+i+1]=D[sel[i]];}}\nint tcost(const vector<int>&r){int s=0;for(int i=0;i+1<(int)r.size();i++)s+=ec(r[i],r[i+1]);return s;}\nbool feasible(const vector<int>&r){bool p[K+1]={};for(int v:r){if(v>=1&&v<=K)p[v]=true;else if(v>K&&!p[v-K])return false;}return true;}\nvector<int> build_nn(){bool vis[NN]={},has[K+1]={};vector<int> r={0};vis[0]=true;for(int s=0;s<2*K;s++){int cur=r.back(),bv=-1,bd=INT_MAX;for(int v=1;v<NN;v++){if(vis[v]||(v>K&&!has[v-K]))continue;int dd=ec(cur,v);if(dd<bd){bd=dd;bv=v;}}r.push_back(bv);vis[bv]=true;if(bv<=K)has[bv]=true;}r.push_back(0);return r;}\nbool two_opt_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++)for(int j=i+1;j<n-1;j++)if(ec(r[i-1],r[j])+ec(r[i],r[j+1])<ec(r[i-1],r[i])+ec(r[j],r[j+1])){reverse(r.begin()+i,r.begin()+j+1);if(feasible(r))any=true;else reverse(r.begin()+i,r.begin()+j+1);}return any;}\nbool or1_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-1;i++){int v=r[i];int rem=ec(r[i-1],v)+ec(v,r[i+1])-ec(r[i-1],r[i+1]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i)continue;int ins=ec(r[j],v)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i)nr.push_back(r[k]);nr.insert(nr.begin()+((bj<i)?bj+1:bj),v);if(feasible(nr)){r=nr;any=true;}}return any;}\nbool or2_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++){int u=r[i],v=r[i+1];int rem=ec(r[i-1],u)+ec(v,r[i+2])-ec(r[i-1],r[i+2]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i||j==i+1)continue;int ins=ec(r[j],u)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i&&k!=i+1)nr.push_back(r[k]);int pos=(bj<i)?bj+1:bj-1;nr.insert(nr.begin()+pos,u);nr.insert(nr.begin()+pos+1,v);if(feasible(nr)){r=nr;any=true;}}return any;}\nvoid full_search(vector<int>&r){for(;;){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvoid quick_search(vector<int>&r,int it=5){for(int i=0;i<it;i++){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvector<int> build_perturbed(const vector<int>&base,int si){int pi=si+1,di=K+si+1;vector<int> r;r.reserve(base.size()-2);for(int v:base)if(v!=pi&&v!=di)r.push_back(v);int n=r.size();int bc=INT_MAX,bp=0,bd2=1;for(int p=0;p<n-1;p++){int cp=md(NX[r[p]],NY[r[p]],NX[pi],NY[pi])+md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]])-md(NX[r[p]],NY[r[p]],NX[r[p+1]],NY[r[p+1]]);{int cd=md(NX[pi],NY[pi],NX[di],NY[di])+md(NX[di],NY[di],NX[r[p+1]],NY[r[p+1]])-md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=p+1;}}for(int d=p+2;d<n;d++){int cd=md(NX[r[d-1]],NY[r[d-1]],NX[di],NY[di])+md(NX[di],NY[di],NX[r[d]],NY[r[d]])-md(NX[r[d-1]],NY[r[d-1]],NX[r[d]],NY[r[d]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=d;}}}vector<int> res=r;res.insert(res.begin()+bp+1,pi);res.insert(res.begin()+bd2+1,di);return res;}\nvector<int> double_bridge(const vector<int>&r,mt19937&rng){int n=r.size();if(n<8)return r;int pos[4];do{for(int i=0;i<4;i++)pos[i]=1+rng()%(n-2);}while(pos[0]==pos[1]||pos[0]==pos[2]||pos[0]==pos[3]||pos[1]==pos[2]||pos[1]==pos[3]||pos[2]==pos[3]);sort(pos,pos+4);int a=pos[0],b=pos[1],c=pos[2],d=pos[3];vector<int> nr;nr.reserve(n);for(int i=0;i<a;i++)nr.push_back(r[i]);for(int i=c;i<d;i++)nr.push_back(r[i]);for(int i=b;i<c;i++)nr.push_back(r[i]);for(int i=a;i<b;i++)nr.push_back(r[i]);for(int i=d;i<n;i++)nr.push_back(r[i]);return nr;}\nvoid emit(const vector<int>&r){cout<<K;for(int i=0;i<K;i++)cout<<\" \"<<(sel[i]+1);cout<<\"\\n\"<<r.size();for(int v:r)cout<<\" \"<<NX[v]<<\" \"<<NY[v];cout<<\"\\n\";cout.flush();}\nusing Clk=chrono::steady_clock;Clk::time_point T0;double esec(){return chrono::duration<double>(Clk::now()-T0).count();}\nint bcost=INT_MAX;vector<int> broute;int bsel[K];bool inS[TOT]={};\nvoid trysel(){refresh();auto r=build_nn();full_search(r);int c=tcost(r);if(c<bcost){bcost=c;broute=r;copy(sel,sel+K,bsel);}}\nbool greedy_step(){int n=broute.size();vector<int> pos(NN,-1);for(int i=0;i<n;i++)pos[broute[i]]=i;vector<int> rem(K);for(int i=0;i<K;i++){int pi=i+1,di=K+i+1,pp=pos[pi],dp=pos[di];rem[i]=ec(broute[pp-1],pi)+ec(pi,broute[pp+1])-ec(broute[pp-1],broute[pp+1])+ec(broute[dp-1],di)+ec(di,broute[dp+1])-ec(broute[dp-1],broute[dp+1]);}\nvector<tuple<int,int,int>> cands;for(int j=0;j<TOT;j++){if(inS[j])continue;int px=A[j],py=B[j],dx=C[j],dy=D[j];int ins=INT_MAX;for(int p=0;p<n-1;p++){int c=md(NX[broute[p]],NY[broute[p]],px,py)+md(px,py,dx,dy)+md(dx,dy,NX[broute[p+1]],NY[broute[p+1]])-ec(broute[p],broute[p+1]);if(c<ins)ins=c;}for(int si=0;si<K;si++){int g=rem[si]-ins;if(g>0)cands.emplace_back(g,si,j);}}\nif(cands.empty())return false;int tk=min(10,(int)cands.size());partial_sort(cands.begin(),cands.begin()+tk,cands.end(),greater<tuple<int,int,int>>());for(int ci=0;ci<tk;ci++){auto&[g,si,j]=cands[ci];if(inS[j])continue;int old=sel[si];sel[si]=j;refresh();auto nr=build_perturbed(broute,si);quick_search(nr,10);int nc=tcost(nr);if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[j]=true;inS[old]=false;return true;}sel[si]=old;refresh();}return false;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);T0=Clk::now();\n    for(int i=0;i<TOT;i++)cin>>A[i]>>B[i]>>C[i]>>D[i];\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(A[i],B[i],C[i],D[i])+md(C[i],D[i],OX,OY),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(OX,OY,C[i],D[i]),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={max(md(OX,OY,A[i],B[i]),md(OX,OY,C[i],D[i])),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    copy(bsel,bsel+K,sel);refresh();memset(inS,false,sizeof(inS));for(int i=0;i<K;i++)inS[sel[i]]=true;\n    emit(broute);\n    while(esec()<0.5)if(!greedy_step())break;\n    mt19937 rng(42);\n    while(esec()<1.80){\n        copy(bsel,bsel+K,sel);refresh();\n        if(rng()%4!=0){\n            auto nr=double_bridge(broute,rng);\n            if(!feasible(nr))continue;\n            full_search(nr);int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;}\n        }else{\n            int si=rng()%K,no;do{no=rng()%TOT;}while(inS[no]);\n            int oo=sel[si];sel[si]=no;refresh();\n            auto nr=build_perturbed(broute,si);quick_search(nr,5);\n            int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[no]=true;inS[oo]=false;}\n        }\n    }\n    copy(bsel,bsel+K,sel);refresh();\n    for(;;){if(esec()>1.95)break;bool a=two_opt_pass(broute),b=or1_pass(broute),c=or2_pass(broute);if(!a&&!b&&!c)break;}\n    emit(broute);\n    return 0;\n}","ahc007":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=400,M=1995;\nint px[N],py[N],eu[M],ev[M];\nlong long ed[M];\nstruct UF{\n    int p[N],r[N];\n    void init(){for(int i=0;i<N;i++)p[i]=i,r[i]=0;}\n    int find(int x){while(p[x]!=x)x=p[x]=p[p[x]];return x;}\n    bool same(int x,int y){return find(x)==find(y);}\n    void unite(int x,int y){x=find(x);y=find(y);if(x==y)return;if(r[x]<r[y])swap(x,y);p[y]=x;if(r[x]==r[y])r[x]++;}\n    int ncomp(){int c=0;for(int i=0;i<N;i++)if(find(i)==i)c++;return c;}\n}uf;\ndouble corrected_dijkstra(int ie,int cu,int cv){\n    int cid[N];fill(cid,cid+N,-1);int nc=0;\n    for(int v=0;v<N;v++){int r=uf.find(v);if(cid[r]==-1)cid[r]=nc++;}\n    vector<vector<pair<int,double>>>cadj(nc);\n    for(int j=ie+1;j<M;j++){\n        int fu=uf.find(eu[j]),fv=uf.find(ev[j]);\n        if(fu!=fv){int a=cid[fu],b=cid[fv];double w=2.0*ed[j];cadj[a].push_back({b,w});cadj[b].push_back({a,w});}\n    }\n    int src=cid[cu],dst=cid[cv];\n    vector<double>dist(nc,1e18);vector<int>hops(nc,0);\n    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>>pq;\n    dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){\n        auto[dv,u]=pq.top();pq.pop();\n        if(dv>dist[u]+1e-9)continue;\n        if(u==dst)break;\n        for(auto[v,w]:cadj[u]){double nd=dist[u]+w;if(nd<dist[v]){dist[v]=nd;hops[v]=hops[u]+1;pq.push({nd,v});}}\n    }\n    if(dist[dst]>1e17)return 2.0*ed[ie];\n    int n=hops[dst];if(n<=0)return 2.0*ed[ie];\n    return dist[dst]*(3.0*n+1.0)/(2.0*n*(n+1.0));\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++)cin>>px[i]>>py[i];\n    for(int i=0;i<M;i++){\n        cin>>eu[i]>>ev[i];\n        double dx=px[eu[i]]-px[ev[i]],dy=py[eu[i]]-py[ev[i]];\n        ed[i]=llround(sqrt(dx*dx+dy*dy));\n    }\n    uf.init();\n    for(int i=0;i<M;i++){\n        long long l;cin>>l;\n        if(uf.same(eu[i],ev[i])){cout<<0<<endl;continue;}\n        {UF tmp=uf;for(int j=i+1;j<M;j++)tmp.unite(eu[j],ev[j]);\n         if(tmp.ncomp()>1){cout<<1<<endl;uf.unite(eu[i],ev[i]);continue;}}\n        int cu=uf.find(eu[i]),cv=uf.find(ev[i]);\n        int k=0;long long mn=LLONG_MAX;\n        for(int j=i+1;j<M;j++){\n            int fu=uf.find(eu[j]),fv=uf.find(ev[j]);\n            if((fu==cu&&fv==cv)||(fu==cv&&fv==cu)){k++;mn=min(mn,ed[j]);}\n        }\n        double thr;\n        if(k>0)thr=(double)mn*(1.0+2.0/(k+1.0));\n        else thr=corrected_dijkstra(i,cu,cv);\n        if((double)l<=thr){cout<<1<<endl;uf.unite(eu[i],ev[i]);}\n        else cout<<0<<endl;\n    }\n}","ahc008":"#include <bits/stdc++.h>\nusing namespace std;\nconst int G=30;\nint N,M,px[20],py[20],hx[10],hy[10];\nbool wall[G+2][G+2];\nint spx[20],spy[20],shx[10],shy[10];\nconst int ddx[]={-1,1,0,0},ddy[]={0,0,-1,1};\nconst char DIRS[]=\"UDLR\",WDIRS[]=\"udlr\";\nbool inb(int x,int y){return x>=1&&x<=G&&y>=1&&y<=G;}\nint dbuf[G+2][G+2];\nvoid bfs(int tx,int ty){\n    for(int i=0;i<=G+1;i++)fill(dbuf[i],dbuf[i]+G+2,-1);\n    dbuf[tx][ty]=0;queue<pair<int,int>>q;q.push({tx,ty});\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int d=0;d<4;d++){int nx=x+ddx[d],ny=y+ddy[d];if(!inb(nx,ny)||wall[nx][ny]||dbuf[nx][ny]!=-1)continue;dbuf[nx][ny]=dbuf[x][y]+1;q.push({nx,ny});}}\n}\nchar gmv(int sx,int sy,int tx,int ty){\n    if(sx==tx&&sy==ty)return '.';bfs(tx,ty);if(dbuf[sx][sy]==-1)return '.';\n    for(int d=0;d<4;d++){int nx=sx+ddx[d],ny=sy+ddy[d];if(!inb(nx,ny)||wall[nx][ny])continue;if(dbuf[nx][ny]==dbuf[sx][sy]-1)return DIRS[d];}return '.';\n}\nbool cpl(int wx,int wy){\n    if(!inb(wx,wy)||wall[wx][wy])return false;\n    for(int i=0;i<N;i++)if(spx[i]==wx&&spy[i]==wy)return false;\n    for(int i=0;i<M;i++)if(shx[i]==wx&&shy[i]==wy)return false;\n    for(int d=0;d<4;d++){int ax=wx+ddx[d],ay=wy+ddy[d];for(int i=0;i<N;i++)if(spx[i]==ax&&spy[i]==ay)return false;}\n    return true;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);memset(wall,false,sizeof(wall));\n    cin>>N;for(int i=0;i<N;i++){int t;cin>>px[i]>>py[i]>>t;}cin>>M;for(int i=0;i<M;i++)cin>>hx[i]>>hy[i];\n    double bv=-1e18;int wt=0,wp=16;bool hp=true;\n    auto ch_cnt=[&](int wtype,int wpos,bool hpos)->int{int c=0;for(int i=0;i<M;i++){bool ok=wtype==0?(hpos?hy[i]<wpos:hy[i]>=wpos):(hpos?hx[i]<wpos:hx[i]>=wpos);if(ok)c++;}return c;};\n    auto ev=[&](int area,int pets,int wtype,int wpos,bool hpos)->double{return (double)area/900.0*pow(2.0,-(double)pets)*(0.7+0.3*ch_cnt(wtype,wpos,hpos)/M);};\n    for(int c=2;c<=G;c++){int lp=0,rp=0;for(int i=0;i<N;i++){if(py[i]<c)lp++;else rp++;}double vl=ev((c-1)*G,lp,0,c,true),vr=ev((G-c+1)*G,rp,0,c,false);if(vl>bv){bv=vl;wt=0;wp=c;hp=true;}if(vr>bv){bv=vr;wt=0;wp=c;hp=false;}}\n    for(int r=2;r<=G;r++){int tp=0,bp=0;for(int i=0;i<N;i++){if(px[i]<r)tp++;else bp++;}double vt=ev((r-1)*G,tp,1,r,true),vb=ev((G-r+1)*G,bp,1,r,false);if(vt>bv){bv=vt;wt=1;wp=r;hp=true;}if(vb>bv){bv=vb;wt=1;wp=r;hp=false;}}\n    struct Task{int wx,wy,sx,sy,wd;};vector<Task> tasks(G);\n    if(wt==0){if(hp)for(int r=1;r<=G;r++)tasks[r-1]={r,wp,r,wp-1,3};else for(int r=1;r<=G;r++)tasks[r-1]={r,wp-1,r,wp,2};}\n    else{if(hp)for(int c=1;c<=G;c++)tasks[c-1]={wp,c,wp-1,c,1};else for(int c=1;c<=G;c++)tasks[c-1]={wp-1,c,wp,c,0};}\n    vector<int> hord(M);iota(hord.begin(),hord.end(),0);\n    if(wt==0)sort(hord.begin(),hord.end(),[&](int a,int b){return hx[a]<hx[b];});else sort(hord.begin(),hord.end(),[&](int a,int b){return hy[a]<hy[b];});\n    vector<int> te(M),ct(M);for(int i=0;i<M;i++){int h=hord[i];ct[h]=i*G/M;te[h]=(i+1)*G/M;}\n    auto ons=[&](int h)->bool{return wt==0?(hp?hy[h]<wp:hy[h]>=wp):(hp?hx[h]<wp:hx[h]>=wp);};\n    for(int turn=0;turn<300;turn++){\n        for(int i=0;i<N;i++){spx[i]=px[i];spy[i]=py[i];}for(int i=0;i<M;i++){shx[i]=hx[i];shy[i]=hy[i];}\n        bool all_safe=true;for(int h=0;h<M;h++)if(!ons(h)){all_safe=false;break;}\n        string acts(M,'.');set<pair<int,int>> pw;vector<bool> isp(M,false);\n        // PASS 1: Wall placements first\n        for(int h=0;h<M;h++){\n            while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n            if(ct[h]>=te[h])continue;\n            Task&t=tasks[ct[h]];bool ig=(ct[h]==G-1)&&!all_safe;\n            if(hx[h]==t.sx&&hy[h]==t.sy&&!ig&&cpl(t.wx,t.wy)&&!pw.count({t.wx,t.wy})){\n                acts[h]=WDIRS[t.wd];pw.insert({t.wx,t.wy});wall[t.wx][t.wy]=true;ct[h]++;isp[h]=true;\n            }\n        }\n        // PASS 2: Movements using updated wall state\n        for(int h=0;h<M;h++){\n            if(isp[h])continue;\n            while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n            if(ct[h]>=te[h]){acts[h]='.';continue;}\n            Task&t=tasks[ct[h]];\n            if(hx[h]==t.sx&&hy[h]==t.sy){acts[h]='.';continue;}\n            char mv=gmv(hx[h],hy[h],t.sx,t.sy);\n            acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}\n        }\n        cout<<acts<<\"\\n\";cout.flush();\n        for(int i=0;i<N;i++){string s;cin>>s;for(char c:s){if(c=='U')px[i]--;else if(c=='D')px[i]++;else if(c=='L')py[i]--;else if(c=='R')py[i]++;}}\n    }\n}","ahc009":"#include <bits/stdc++.h>\nusing namespace std;\nint si,sj,ti,tj; double pf;\nbool H[20][19],V[19][20];\nint nb[400][4],G;\nvoid initNb(){for(int i=0;i<20;i++)for(int j=0;j<20;j++){int c=i*20+j;nb[c][0]=(i>0&&!V[i-1][j])?(i-1)*20+j:c;nb[c][1]=(i<19&&!V[i][j])?(i+1)*20+j:c;nb[c][2]=(j>0&&!H[i][j-1])?i*20+(j-1):c;nb[c][3]=(j<19&&!H[i][j])?i*20+(j+1):c;}}\nint dc(char c){return c=='U'?0:c=='D'?1:c=='L'?2:3;}\ndouble PP[201][400],PE[201];\nvoid buildP(const string&s,int fr){for(int t=fr;t<200;t++){int d=dc(s[t]);double*a=PP[t],*b=PP[t+1];memset(b,0,3200);for(int k=0;k<400;k++){double v=a[k];if(v<1e-15)continue;b[k]+=v*pf;b[nb[k][d]]+=v*(1-pf);}double e=b[G]*(401.-(t+1));b[G]=0;PE[t+1]=PE[t]+e;}}\ndouble evalF(const string&s,int fr){double p[400],q[400];memcpy(p,PP[fr],3200);double E=PE[fr];for(int t=fr;t<200;t++){int d=dc(s[t]);memset(q,0,3200);for(int k=0;k<400;k++){double v=p[k];if(v<1e-15)continue;q[k]+=v*pf;q[nb[k][d]]+=v*(1-pf);}E+=q[G]*(401.-(t+1));q[G]=0;memcpy(p,q,3200);}return E;}\nvoid setP(const string&s){memset(PP[0],0,3200);PP[0][si*20+sj]=1;PE[0]=0;buildP(s,0);}\nchrono::time_point<chrono::steady_clock>T0;\ndouble el(){return chrono::duration<double>(chrono::steady_clock::now()-T0).count();}\ndouble hc(string&s,double E0,double tl){double be=E0;for(;;){if(el()>tl)break;bool imp=false;for(int t=0;t<200;t++){int od=dc(s[t]);for(int d=0;d<4;d++){if(d==od)continue;s[t]=\"UDLR\"[d];double e=evalF(s,t);if(e>be+1e-12){be=e;od=d;buildP(s,t);imp=true;}else s[t]=\"UDLR\"[od];}}if(!imp)break;}return be;}\nstring bfsPath(){int ds[400];fill(ds,ds+400,-1);int pr[400],pd[400];int src=si*20+sj;queue<int>q;q.push(src);ds[src]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||ds[nk]!=-1)continue;ds[nk]=ds[k]+1;pr[nk]=k;pd[nk]=d;q.push(nk);}}string r;for(int c=G;c!=src;c=pr[c])r+=\"UDLR\"[pd[c]];reverse(r.begin(),r.end());return r;}\nstring greedyPath(){int bd[400];fill(bd,bd+400,-1);queue<int>q;q.push(G);bd[G]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||bd[nk]!=-1)continue;bd[nk]=bd[k]+1;q.push(nk);}}double p[400]={},np[400];p[si*20+sj]=1;string s(200,'D');for(int t=0;t<200;t++){double bst=-1e18;int bd2=0;for(int d=0;d<4;d++){double g=0;for(int k=0;k<400;k++){if(p[k]<1e-15)continue;g+=p[k]*(1-pf)*(bd[k]-bd[nb[k][d]]);}if(g>bst){bst=g;bd2=d;}}s[t]=\"UDLR\"[bd2];memset(np,0,3200);for(int k=0;k<400;k++){if(p[k]<1e-15)continue;np[k]+=p[k]*pf;np[nb[k][bd2]]+=p[k]*(1-pf);}np[G]=0;memcpy(p,np,3200);}return s;}\nint main(){\n    ios::sync_with_stdio(0);cin.tie(0);\n    cin>>si>>sj>>ti>>tj>>pf;\n    for(int i=0;i<20;i++){string r;cin>>r;for(int j=0;j<19;j++)H[i][j]=(r[j]=='1');}\n    for(int i=0;i<19;i++){string r;cin>>r;for(int j=0;j<20;j++)V[i][j]=(r[j]=='1');}\n    initNb();G=ti*20+tj;T0=chrono::steady_clock::now();\n    string path=bfsPath();int K=(int)path.size();\n    string s1(200,'D');for(int i=0;i<200;i++)s1[i]=path[i%K];\n    string s2=greedyPath();\n    setP(s1);double e1=hc(s1,PE[200],0.2);\n    setP(s2);double e2=hc(s2,PE[200],0.4);\n    string gb=(e1>=e2)?s1:s2;double gbE=max(e1,e2);\n    setP(gb);\n    mt19937 rng(42);uniform_real_distribution<double>ud(0,1);\n    {\n        string sc=gb;double scE=gbE;double T=2.0;int stp=0;double sa0=el();\n        while(el()<1.2){\n            int t=rng()%200,od=dc(sc[t]),nd=(od+1+(int)(rng()%3))%4;\n            sc[t]=\"UDLR\"[nd];double e=evalF(sc,t),dlt=e-scE;\n            if(dlt>0||ud(rng)<exp(dlt/T)){scE=e;buildP(sc,t);if(e>gbE){gbE=e;gb=sc;}}\n            else sc[t]=\"UDLR\"[od];\n            if(++stp%500==0){double f=min(1.,max(0.,(el()-sa0)/(1.2-sa0)));T=2.*exp(-7.*f);if(scE<gbE-20.){sc=gb;scE=gbE;setP(sc);}}\n        }\n    }\n    setP(gb);\n    while(el()<1.85){\n        string p2=gb;int st=rng()%3;\n        if(st==0){int M=5+(int)(rng()%21);for(int i=0;i<M;i++){int t=rng()%200;p2[t]=\"UDLR\"[(dc(p2[t])+1+(int)(rng()%3))%4];}}\n        else if(st==1){int ts=(int)(rng()%200),sl=10+(int)(rng()%41);for(int i=ts;i<min(200,ts+sl);i++)p2[i]=\"UDLR\"[rng()%4];}\n        else{int ts=(int)(rng()%200),sl=10+(int)(rng()%41),po=rng()%K;for(int i=ts;i<min(200,ts+sl);i++)p2[i]=path[(po+(i-ts))%K];}\n        setP(p2);double e=hc(p2,PE[200],1.85);\n        if(e>gbE+1e-12){gbE=e;gb=p2;}\n    }\n    cout<<gb<<\"\\n\";\n}","ahc010":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30,TOTAL=N*N*4;\nconst int to_t[8][4]={{1,0,-1,-1},{3,-1,-1,0},{-1,-1,3,2},{-1,2,1,-1},{1,0,3,2},{3,2,1,0},{2,-1,0,-1},{-1,3,-1,1}};\nconst int di[4]={0,-1,0,1},dj[4]={-1,0,1,0};\nint tiles[N][N],init_t[N][N],rots[N][N],best_rots[N][N];\nlong long global_best=0;\ninline int apply_rot(int t,int r){if(t<=3)return(t+r)&3;if(t<=5)return 4+((t-4+r)&1);return 6+((t-6+r)&1);}\nint nxt[TOTAL];uint8_t col[TOTAL];\ninline void update_nxt(int i,int j){int base=(i*N+j)*4,t=tiles[i][j];for(int d=0;d<4;d++){int d2=to_t[t][d];if(d2<0){nxt[base+d]=-1;continue;}int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N){nxt[base+d]=-1;continue;}nxt[base+d]=(ni*N+nj)*4+((d2+2)&3);}}\nlong long evaluate(){memset(col,0,TOTAL);int t1=0,t2=0;for(int s=0;s<TOTAL;s++){if(col[s])continue;int c=s;while(c>=0&&!col[c]){col[c]=1;c=nxt[c];}if(c>=0&&col[c]==1){int len=0,cc=c;do{cc=nxt[cc];len++;}while(cc!=c);if(len>t1){t2=t1;t1=len;}else if(len>t2)t2=len;}c=s;while(c>=0&&col[c]==1){col[c]=2;c=nxt[c];}}return(long long)t1*t2;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){init_t[i][j]=s[j]-'0';tiles[i][j]=init_t[i][j];rots[i][j]=0;}}\n    mt19937 rng(42);\n    const auto ts=chrono::steady_clock::now();\n    auto gt=[&](){return chrono::duration<double>(chrono::steady_clock::now()-ts).count();};\n    const double TL=1.85;\n    const double lnr=log(0.005/0.1);\n    memset(best_rots,0,sizeof(best_rots));\n    const int NUM_RESTART=6;\n    double tpr=(TL-0.01)/NUM_RESTART;\n    for(int restart=0;restart<NUM_RESTART;restart++){\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++){\n            int t=init_t[i][j],r=0;\n            if(t==4||t==5){if(restart==1)r=1;else if(restart>=2)r=(rng()%2)?1:0;}\n            rots[i][j]=r;tiles[i][j]=apply_rot(t,r);\n        }\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n        // Connectivity greedy (skip type 4/5)\n        for(int pass=0;pass<20;pass++){bool chg=false;\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++){\n                int t=init_t[i][j]; if(t==4||t==5)continue;\n                int br=rots[i][j],bc=-1;\n                for(int r=0;r<4;r++){int t2=apply_rot(t,r),cnt=0;for(int d=0;d<4;d++){if(to_t[t2][d]<0)continue;int ni=i+di[d],nj=j+dj[d];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;if(to_t[tiles[ni][nj]][(d+2)%4]>=0)cnt++;}if(cnt>bc){bc=cnt;br=r;}}\n                if(br!=rots[i][j]){rots[i][j]=br;tiles[i][j]=apply_rot(t,br);update_nxt(i,j);chg=true;}\n            }\n            if(!chg)break;\n        }\n        long long cur=evaluate();\n        double rs=gt(),re=rs+tpr;\n        // Score greedy\n        for(bool imp=true;imp&&gt()<rs+0.04;){imp=false;\n            for(int i=0;i<N&&gt()<rs+0.04;i++)for(int j=0;j<N;j++){\n                int ti=init_t[i][j],bd=0;long long bl=cur;int st=tiles[i][j];\n                int mdr=(ti<=3)?3:1;\n                for(int dr=1;dr<=mdr;dr++){int nr=(rots[i][j]+dr)&3;tiles[i][j]=apply_rot(ti,nr);update_nxt(i,j);long long ns=evaluate();if(ns>bl){bl=ns;bd=dr;}tiles[i][j]=st;update_nxt(i,j);}\n                if(bd){rots[i][j]=(rots[i][j]+bd)&3;tiles[i][j]=apply_rot(ti,rots[i][j]);update_nxt(i,j);cur=bl;if(bl>global_best){global_best=bl;memcpy(best_rots,rots,sizeof(rots));}imp=true;}\n            }\n        }\n        // SA with adaptive temperature\n        double sa_init=max(100.0,(double)cur);\n        double e=gt(),sa0=e;int cnt=0;\n        while(e<re&&e<TL){\n            if((cnt&255)==0)e=gt();cnt++;\n            double prog=min(1.0,(e-sa0)/max(re-sa0,1e-9));\n            double T=sa_init*0.1*exp(lnr*prog);\n            int i=rng()%N,j=rng()%N,ti=init_t[i][j];\n            int dr=(ti<=3)?(rng()%3)+1:1;\n            int nr=(rots[i][j]+dr)&3,ot=tiles[i][j];\n            tiles[i][j]=apply_rot(ti,nr);update_nxt(i,j);\n            long long ns=evaluate(),delta=ns-cur;\n            if(delta>=0||rng()/4294967296.0<exp((double)delta/T)){\n                rots[i][j]=nr;cur=ns;\n                if(ns>global_best){global_best=ns;memcpy(best_rots,rots,sizeof(rots));}\n            }else{tiles[i][j]=ot;update_nxt(i,j);}\n        }\n    }\n    string out(N*N,'0');\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)out[i*N+j]='0'+best_rots[i][j];\n    cout<<out<<\"\\n\";\n    return 0;\n}","ahc011":"#include <bits/stdc++.h>\nusing namespace std;\nint N,T,board[10][10],board_label[10][10],er,ec,tgt[10][10],avail[16];\nbool fixed_cells[10][10];\nstring out;\nvoid read_input(){cin>>N>>T;for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){char c=s[j];board[i][j]=(c>='0'&&c<='9')?c-'0':c-'a'+10;if(!board[i][j]){er=i;ec=j;}}}}\nbool valid_pos(int v,int i,int j){return!((v&1)&&!j)&&!((v&2)&&!i)&&!((v&4)&&j==N-1)&&!((v&8)&&i==N-1);}\nbool is_tree(){bool vis[10][10]={};int sr=-1,sc=0;for(int i=0;i<N&&sr<0;i++)for(int j=0;j<N;j++)if(tgt[i][j]>0){sr=i;sc=j;break;}if(sr<0)return false;queue<pair<int,int>>q;q.push({sr,sc});vis[sr][sc]=true;int cnt=1,ed=0;int dr[]={0,1,0,-1},dc[]={1,0,-1,0},cb[]={4,8,1,2},nb[]={1,2,4,8};while(!q.empty()){auto[r,c]=q.front();q.pop();for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=N||nc<0||nc>=N||tgt[nr][nc]<=0)continue;if((tgt[r][c]&cb[d])&&(tgt[nr][nc]&nb[d])){ed++;if(!vis[nr][nc]){vis[nr][nc]=true;cnt++;q.push({nr,nc});}}}}return cnt==N*N-1&&ed==2*(N*N-2);}\nbool find_target(int pos){if(pos==N*N)return is_tree();int i=pos/N,j=pos%N;if(i==N-1&&j==N-1){tgt[i][j]=0;return find_target(pos+1);}bool fl=(j>0),nl=fl&&(tgt[i][j-1]&4);bool fu=(i>0),nu=fu&&(tgt[i-1][j]&8);for(int v=1;v<=15;v++){if(!avail[v]||!valid_pos(v,i,j))continue;if(fl&&!!(v&1)!=nl)continue;if(fu&&!!(v&2)!=nu)continue;avail[v]--;tgt[i][j]=v;if(find_target(pos+1))return true;avail[v]++;}tgt[i][j]=-1;return false;}\nvoid init_labels(){vector<pair<int,int>>cp[16],tp[16];for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(board[i][j]>0)cp[board[i][j]].push_back({i,j});if(tgt[i][j]>0)tp[tgt[i][j]].push_back({i,j});}for(int v=1;v<=15;v++){sort(cp[v].begin(),cp[v].end());sort(tp[v].begin(),tp[v].end());for(int k=0;k<(int)cp[v].size();k++){auto[cr,cc]=cp[v][k];auto[tr,tc]=tp[v][k];board_label[cr][cc]=tr*N+tc;}}}\nbool check_solvable(){vector<int>s;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]>=0)s.push_back(board_label[i][j]);int inv=0;for(int a=0;a<(int)s.size();a++)for(int b=a+1;b<(int)s.size();b++)if(s[a]>s[b])inv++;if(N%2)return!(inv%2);return(inv+er)%2==1;}\nvoid fix_parity(){if(check_solvable())return;for(int v=1;v<=15;v++){vector<pair<int,int>>cp;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]==v)cp.push_back({i,j});if(cp.size()>=2){swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);if(check_solvable())return;swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);}}}\nvoid do_move(char m){int tr=er,tc=ec;if(m=='U')tr--;else if(m=='D')tr++;else if(m=='L')tc--;else tc++;board[er][ec]=board[tr][tc];board_label[er][ec]=board_label[tr][tc];board[tr][tc]=0;board_label[tr][tc]=-1;er=tr;ec=tc;out+=m;}\nbool move_empty(int gr,int gc){if(er==gr&&ec==gc)return true;if((int)out.size()>=T||fixed_cells[gr][gc])return false;int NN=N*N;vector<int>prv(NN,-2);int s=er*N+ec,g=gr*N+gc;prv[s]=-1;queue<int>q;q.push(s);int dr[]={-1,1,0,0},dcc[]={0,0,-1,1};while(!q.empty()){int cur=q.front();q.pop();if(cur==g)break;int r=cur/N,c=cur%N;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dcc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int nxt=nr*N+nc;if(prv[nxt]!=-2)continue;prv[nxt]=cur;q.push(nxt);}}if(prv[g]==-2)return false;vector<int>path;int cur=g;while(cur!=s){path.push_back(cur);cur=prv[cur];}reverse(path.begin(),path.end());for(int nxt:path){if((int)out.size()>=T)return false;int nr=nxt/N,nc=nxt%N;char m;if(nr==er-1)m='U';else if(nr==er+1)m='D';else if(nc==ec-1)m='L';else m='R';do_move(m);}return true;}\nbool bfs_tile(int&tr,int&tc,int dr,int dc){if(tr==dr&&tc==dc)return true;if((int)out.size()>=T)return false;int NN=N*N,t0=tr*N+tc,e0=er*N+ec,tg=dr*N+dc,tot=NN*NN;vector<int>prv(tot,-2);vector<char>mv(tot,0);prv[t0*NN+e0]=-1;queue<int>q;q.push(t0*NN+e0);int ddr[]={-1,1,0,0},ddc[]={0,0,-1,1};const char dch[]={'U','D','L','R'};int goal=-1;while(!q.empty()){int cur=q.front();q.pop();int ct=cur/NN,ce=cur%NN;if(ct==tg){goal=cur;break;}int er_=ce/N,ec_=ce%N;for(int d=0;d<4;d++){int nr=er_+ddr[d],nc=ec_+ddc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int np=nr*N+nc,nt=(np==ct)?ce:ct,ne=np;if(nt==ne)continue;int nst=nt*NN+ne;if(nst<0||nst>=tot||prv[nst]!=-2)continue;prv[nst]=cur;mv[nst]=dch[d];q.push(nst);}}if(goal<0){for(int e=0;e<NN&&goal<0;e++){if(e==tg||fixed_cells[e/N][e%N])continue;int s=tg*NN+e;if(s<tot&&prv[s]!=-2)goal=s;}}if(goal<0)return false;vector<char>path;int cur=goal;while(cur!=t0*NN+e0){path.push_back(mv[cur]);cur=prv[cur];}reverse(path.begin(),path.end());for(char m:path){if((int)out.size()>=T)return false;do_move(m);}tr=dr;tc=dc;return true;}\npair<int,int>find_lbl(int lbl){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]==lbl)return{i,j};return{-1,-1};}\nvoid solve_row(int row){if((int)out.size()>=T)return;for(int col=0;col<=N-3&&(int)out.size()<T;col++){auto[cr,cc]=find_lbl(row*N+col);if(cr<0)continue;if(cr==row&&cc==col){fixed_cells[row][col]=true;continue;}bfs_tile(cr,cc,row,col);fixed_cells[row][col]=true;}if((int)out.size()>=T)return;auto[ar,ac]=find_lbl(row*N+(N-2));auto[br,bc]=find_lbl(row*N+(N-1));if(ar<0||br<0)return;if(ar==row&&ac==N-2&&br==row&&bc==N-1){fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;return;}bfs_tile(ar,ac,row,N-1);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl(row*N+(N-1));if(br2<0)return;fixed_cells[row][N-1]=true;bfs_tile(br2,bc2,row+1,N-1);fixed_cells[row][N-1]=false;if((int)out.size()>=T)return;fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=true;move_empty(row,N-2);fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=false;if((int)out.size()<T&&er==row&&ec==N-2){do_move('R');if((int)out.size()<T)do_move('D');}fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;}\nvoid solve_col(int col){if((int)out.size()>=T)return;auto[ar,ac]=find_lbl((N-2)*N+col);auto[br,bc]=find_lbl((N-1)*N+col);if(ar<0||br<0)return;if(ar==N-2&&ac==col&&br==N-1&&bc==col){fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;return;}bfs_tile(ar,ac,N-1,col);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl((N-1)*N+col);if(br2<0)return;fixed_cells[N-1][col]=true;bfs_tile(br2,bc2,N-1,col+1);fixed_cells[N-1][col]=false;if((int)out.size()>=T)return;fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=true;move_empty(N-2,col);fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=false;if((int)out.size()<T&&er==N-2&&ec==col){do_move('D');if((int)out.size()<T)do_move('R');}fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;}\nvoid solve_2x2(){if((int)out.size()>=T)return;int p0=(N-2)*N+(N-2),p1=(N-2)*N+(N-1),p2=(N-1)*N+(N-2);int a=board_label[N-2][N-2],b=board_label[N-2][N-1],c=board_label[N-1][N-2],d=board_label[N-1][N-1];if(a==p0&&b==p1&&c==p2&&d==-1)return;auto el=[&](int l)->int{if(l==p0)return 0;if(l==p1)return 1;if(l==p2)return 2;return 3;};auto enc=[](int v0,int v1,int v2,int v3){return v0*64+v1*16+v2*4+v3;};int gs=enc(0,1,2,3),ss=enc(el(a),el(b),el(c),el(d));if(ss==gs)return;array<int,256>par;par.fill(-2);array<char,256>mfr;mfr.fill(0);queue<int>q;q.push(ss);par[ss]=-1;static const int adj[4][2]={{1,2},{0,3},{0,3},{1,2}};static const char amv[4][2]={{'R','D'},{'L','D'},{'U','R'},{'U','L'}};while(!q.empty()){int cur=q.front();q.pop();if(cur==gs)break;int v[4]={(cur>>6)&3,(cur>>4)&3,(cur>>2)&3,cur&3};int ep=-1;for(int p=0;p<4;p++)if(v[p]==3){ep=p;break;}if(ep<0)continue;for(int k=0;k<2;k++){int np=adj[ep][k];char m=amv[ep][k];int nv[4]={v[0],v[1],v[2],v[3]};nv[ep]=nv[np];nv[np]=3;int nst=enc(nv[0],nv[1],nv[2],nv[3]);if(par[nst]==-2){par[nst]=cur;mfr[nst]=m;q.push(nst);}}}if(par[gs]==-2)return;vector<char>path;int cur=gs;while(cur!=ss){path.push_back(mfr[cur]);cur=par[cur];}reverse(path.begin(),path.end());for(char m:path){if((int)out.size()>=T)break;do_move(m);}}\nvoid solve(){for(int row=0;row<=N-3&&(int)out.size()<T;row++)solve_row(row);for(int col=0;col<=N-3&&(int)out.size()<T;col++)solve_col(col);solve_2x2();}\nint main(){ios::sync_with_stdio(false);cin.tie(nullptr);read_input();memset(avail,0,sizeof(avail));for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]>0)avail[board[i][j]]++;memset(tgt,-1,sizeof(tgt));memset(fixed_cells,0,sizeof(fixed_cells));memset(board_label,-1,sizeof(board_label));if(!find_target(0)){cout<<\"\\n\";return 0;}init_labels();fix_parity();solve();cout<<out<<\"\\n\";return 0;}","ahc012":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef unsigned long long ull;\ntypedef pair<ull,ull> puu;\nstruct PH{size_t operator()(const puu&p)const{size_t h=hash<ull>()(p.first);h^=hash<ull>()(p.second)+0x9e3779b9ULL+(h<<6)+(h>>2);return h;}};\nmt19937 rng(42);\nint N,K,a[11],stx[5501],sty[5501];\nstruct Line{ll px,py,qx,qy;};\nconst int MK=100;\nLine cur_lines[MK],best_lines[MK];\nint8_t sgn_data[5501][MK];\null slo[5501],shi[5501];\nunordered_map<puu,int,PH>grps;\nint b_arr[12],cscore,best_score;\nstruct Change{int idx;puu old_sig,new_sig;int8_t new_sgn;};\nvector<Change>pending;\nvector<pair<puu,int>>dvec;\nll ecross(const Line&l,ll x,ll y){return(l.qx-l.px)*(y-l.py)-(l.qy-l.py)*(x-l.px);}\nvoid upd(int oc,int nc){if(oc>=1&&oc<=10){cscore-=min(a[oc],b_arr[oc]);b_arr[oc]--;cscore+=min(a[oc],b_arr[oc]);}if(nc>=1&&nc<=10){cscore-=min(a[nc],b_arr[nc]);b_arr[nc]++;cscore+=min(a[nc],b_arr[nc]);}}\nvoid build(){grps.clear();grps.reserve(32768);grps.max_load_factor(0.3f);memset(b_arr,0,sizeof(b_arr));cscore=0;for(int i=0;i<N;i++){slo[i]=shi[i]=0;for(int j=0;j<MK;j++){int8_t s=(ecross(cur_lines[j],stx[i],sty[i])>=0)?1:-1;sgn_data[i][j]=s;if(s==1){if(j<64)slo[i]|=(1ULL<<j);else shi[i]|=(1ULL<<(j-64));}}auto[it,ins]=grps.emplace(puu{slo[i],shi[i]},0);upd(it->second,it->second+1);it->second++;}}\nint try_ch(int j,const Line&nl){pending.clear();dvec.clear();for(int i=0;i<N;i++){int8_t ns=(ecross(nl,stx[i],sty[i])>=0)?1:-1;if(ns==sgn_data[i][j])continue;puu os{slo[i],shi[i]};ull nl2=slo[i],nh2=shi[i];if(j<64){if(ns==1)nl2|=(1ULL<<j);else nl2&=~(1ULL<<j);}else{if(ns==1)nh2|=(1ULL<<(j-64));else nh2&=~(1ULL<<(j-64));}puu nsig{nl2,nh2};pending.push_back({i,os,nsig,ns});dvec.push_back({os,-1});dvec.push_back({nsig,+1});}sort(dvec.begin(),dvec.end());int nb[12];memcpy(nb,b_arr,sizeof(nb));int nsc=cscore;for(int i=0;i<(int)dvec.size();){int j2=i,d=0;while(j2<(int)dvec.size()&&dvec[j2].first==dvec[i].first){d+=dvec[j2].second;j2++;}if(d){auto it=grps.find(dvec[i].first);int c=it!=grps.end()?it->second:0,nc=c+d;if(c>=1&&c<=10){nsc-=min(a[c],nb[c]);nb[c]--;nsc+=min(a[c],nb[c]);}if(nc>=1&&nc<=10){nsc-=min(a[nc],nb[nc]);nb[nc]++;nsc+=min(a[nc],nb[nc]);}}i=j2;}return nsc;}\nvoid do_ch(int j,const Line&nl){for(auto&ch:pending){{auto it=grps.find(ch.old_sig);upd(it->second,it->second-1);if(!--it->second)grps.erase(it);}slo[ch.idx]=ch.new_sig.first;shi[ch.idx]=ch.new_sig.second;sgn_data[ch.idx][j]=ch.new_sgn;{auto[it2,ins]=grps.emplace(ch.new_sig,0);upd(it2->second,it2->second+1);it2->second++;}}cur_lines[j]=nl;}\nLine rline(){double th=(rng()%314159)*(M_PI/314159.0);double r=(int)(rng()%18001)-9000;double cx=r*cos(th),cy=r*sin(th),sdx=-sin(th)*9000,sdy=cos(th)*9000;return{llround(cx+sdx),llround(cy+sdy),llround(cx-sdx),llround(cy-sdy)};}\nLine pline(const Line&l,int s){ll dx=(ll)(rng()%(2*s+1))-s,dy=(ll)(rng()%(2*s+1))-s;int t=rng()%3;if(t==0)return{l.px+dx,l.py+dy,l.qx,l.qy};if(t==1)return{l.px,l.py,l.qx+dx,l.qy+dy};return{l.px+dx,l.py+dy,l.qx-dx,l.qy-dy};}\nLine pline_perp(const Line&l,int s){ll ddx=l.qx-l.px,ddy=l.qy-l.py;double len=hypot((double)ddx,(double)ddy);if(len<1.0)return l;ll delta=(ll)(rng()%(2*s+1))-s;ll dx2=llround(delta*(-ddy)/len),dy2=llround(delta*ddx/len);return{l.px+dx2,l.py+dy2,l.qx+dx2,l.qy+dy2};}\nLine pline_rot(const Line&l,int max_mrad){\n    double mx=(l.px+l.qx)*0.5,my=(l.py+l.qy)*0.5;\n    double hdx=(l.qx-l.px)*0.5,hdy=(l.qy-l.py)*0.5;\n    double angle=((int)(rng()%(2*max_mrad+1))-max_mrad)*0.001;\n    double ca=cos(angle),sa=sin(angle);\n    ll ndx=llround(hdx*ca-hdy*sa),ndy=llround(hdx*sa+hdy*ca);\n    return{llround(mx)-ndx,llround(my)-ndy,llround(mx)+ndx,llround(my)+ndy};\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>K;for(int d=1;d<=10;d++)cin>>a[d];for(int i=0;i<N;i++)cin>>stx[i]>>sty[i];\n    for(int i=0;i<50;i++){ll y=llround(-9000.0+18000.0*i/49.0);cur_lines[i]={-10000,y,10000,y};}\n    for(int i=0;i<50;i++){ll x=llround(-9000.0+18000.0*i/49.0);cur_lines[50+i]={x,-10000,x,10000};}\n    build();best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));\n    pending.reserve(N+10);dvec.reserve(2*N+10);\n    auto t0=chrono::steady_clock::now();\n    double T=15.0;int iter=0;\n    while(true){\n        if(!(++iter&511)){\n            double e=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(e>2.90)break;\n            T=max(0.05,15.0*pow(0.05/15.0,e/2.90));\n        }\n        int j=rng()%MK;Line nl;\n        int sel=rng()%100;\n        if(sel<22)nl=pline(cur_lines[j],30);\n        else if(sel<38)nl=pline_perp(cur_lines[j],50);\n        else if(sel<50)nl=pline_rot(cur_lines[j],10);\n        else if(sel<68)nl=pline(cur_lines[j],300);\n        else if(sel<82)nl=pline(cur_lines[j],2000);\n        else nl=rline();\n        if(nl.px==nl.qx&&nl.py==nl.qy)continue;\n        int ns=try_ch(j,nl);int ds=ns-cscore;bool acc=(ds>=0);\n        if(!acc&&T>0.01)acc=((double)(rng()>>8)/(double)(1u<<24))<exp((double)ds/T);\n        if(acc){do_ch(j,nl);if(cscore>best_score){best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));}}\n    }\n    cout<<MK<<\"\\n\";\n    for(int j=0;j<MK;j++)cout<<best_lines[j].px<<\" \"<<best_lines[j].py<<\" \"<<best_lines[j].qx<<\" \"<<best_lines[j].qy<<\"\\n\";\n    return 0;\n}","ahc014":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=65;\nint N,M,cc;\nbool dots[MAXN][MAXN],h_seg[MAXN][MAXN],v_seg[MAXN][MAXN],d1_seg[MAXN][MAXN],d2_seg[MAXN][MAXN],inPQ[MAXN][MAXN];\nvector<int> row_dots[MAXN],col_dots[MAXN],diag_dots[130],ad_dots[130];\nstruct Op{int x1,y1,x2,y2,x3,y3,x4,y4;};\nvector<Op> ops,best_ops;\npriority_queue<pair<int,pair<int,int>>> work_pq;\nlong long best_score=0;\nint init_M; pair<int,int> init_list[400];\nmt19937 rng(0); int run_mode=0;\nvoid ins(vector<int>&v,int x){v.insert(lower_bound(v.begin(),v.end(),x),x);}\nvoid addDot(int x,int y){dots[x][y]=true;ins(row_dots[y],x);ins(col_dots[x],y);ins(diag_dots[x-y+64],x);ins(ad_dots[x+y],x);}\nbool ec(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)if(v_seg[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)if(h_seg[x][y1])return false;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)if(d1_seg[xm+t][ym+t])return false;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)if(d2_seg[xm+t][ymx-t])return false;}}\n    return true;}\nbool en(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2)+1;y<max(y1,y2);y++)if(dots[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2)+1;x<max(x1,x2);x++)if(dots[x][y1])return false;}\n    else{int n=abs(x2-x1),dx=(x2>x1)?1:-1,dy=(y2>y1)?1:-1;for(int t=1;t<n;t++)if(dots[x1+t*dx][y1+t*dy])return false;}\n    return true;}\nvoid de(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)v_seg[x1][y]=true;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)h_seg[x][y1]=true;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)d1_seg[xm+t][ym+t]=true;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)d2_seg[xm+t][ymx-t]=true;}}}\nbool cando(int nx,int ny,int x2,int y2,int x3,int y3,int x4,int y4){\n    if(x2<0||x2>=N||y2<0||y2>=N||x3<0||x3>=N||y3<0||y3>=N||x4<0||x4>=N||y4<0||y4>=N)return false;\n    if(!dots[x2][y2]||!dots[x3][y3]||!dots[x4][y4])return false;\n    if(!en(nx,ny,x2,y2)||!en(x2,y2,x3,y3)||!en(x3,y3,x4,y4)||!en(x4,y4,nx,ny))return false;\n    if(!ec(nx,ny,x2,y2)||!ec(x2,y2,x3,y3)||!ec(x3,y3,x4,y4)||!ec(x4,y4,nx,ny))return false;\n    ops.push_back({nx,ny,x2,y2,x3,y3,x4,y4});addDot(nx,ny);de(nx,ny,x2,y2);de(x2,y2,x3,y3);de(x3,y3,x4,y4);de(x4,y4,nx,ny);return true;}\nbool fap(int nx,int ny){\n    if(dots[nx][ny])return false;\n    vector<tuple<int,int,int,int,int,int,int>> cands;\n    for(int x2:row_dots[ny]){if(x2==nx)continue;for(int y2:col_dots[nx]){if(y2==ny||!dots[x2][y2])continue;int k=(abs(x2-nx)+abs(y2-ny))*2;if(run_mode>=2)k+=rng()%8;cands.emplace_back(k,x2,ny,x2,y2,nx,y2);}}\n    for(int xa:diag_dots[nx-ny+64]){if(xa==nx)continue;int a=xa-nx;for(int xb:ad_dots[nx+ny]){if(xb==nx)continue;int b=xb-nx;int x3=nx+a+b,y3=ny+a-b;if(x3>=0&&x3<N&&y3>=0&&y3<N&&dots[x3][y3]){int k=(abs(a)+abs(b))*2+1;if(run_mode>=2)k+=rng()%8;cands.emplace_back(k,xa,ny+a,x3,y3,xb,ny-b);}}}\n    sort(cands.begin(),cands.end());\n    for(auto&[p,x2,y2,x3,y3,x4,y4]:cands)if(cando(nx,ny,x2,y2,x3,y3,x4,y4))return true;\n    return false;}\nvoid addWork(int x,int y){if(x<0||x>=N||y<0||y>=N||dots[x][y]||inPQ[x][y])return;inPQ[x][y]=true;work_pq.push({(x-cc)*(x-cc)+(y-cc)*(y-cc)+1,{x,y}});}\nvoid afterPlace(int x,int y){\n    for(int i=0;i<N;i++){addWork(i,y);addWork(x,i);}\n    for(int t=1;t<N;t++){addWork(x+t,y+t);addWork(x-t,y-t);addWork(x+t,y-t);addWork(x-t,y+t);}\n    for(int ny2:col_dots[x])for(int nx2:row_dots[y])addWork(nx2,ny2);\n    // KEY: 45-deg P3 trigger - adds P1 when its P3=(x,y) is placed\n    for(int xb:ad_dots[x+y])for(int xa:diag_dots[x-y+64])addWork(xa+xb-x,y+xa-xb);}\nvoid resetRun(){\n    memset(dots,0,sizeof(dots));memset(h_seg,0,sizeof(h_seg));memset(v_seg,0,sizeof(v_seg));\n    memset(d1_seg,0,sizeof(d1_seg));memset(d2_seg,0,sizeof(d2_seg));memset(inPQ,0,sizeof(inPQ));\n    for(int i=0;i<MAXN;i++){row_dots[i].clear();col_dots[i].clear();}\n    for(int i=0;i<130;i++){diag_dots[i].clear();ad_dots[i].clear();}\n    ops.clear();work_pq=priority_queue<pair<int,pair<int,int>>>();\n    for(int i=0;i<init_M;i++)addDot(init_list[i].first,init_list[i].second);\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)addWork(x,y);}\nvoid drainQ(long long lim,chrono::steady_clock::time_point t0){\n    while(!work_pq.empty()){\n        if(chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count()>=lim)return;\n        auto[w,pos]=work_pq.top();work_pq.pop();auto[x,y]=pos;inPQ[x][y]=false;\n        if(dots[x][y])continue;if(fap(x,y))afterPlace(x,y);}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>M;cc=(N-1)/2;init_M=M;\n    for(int i=0;i<M;i++){cin>>init_list[i].first>>init_list[i].second;}\n    vector<pair<int,pair<int,int>>> pts;\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)pts.emplace_back((x-cc)*(x-cc)+(y-cc)*(y-cc)+1,make_pair(x,y));\n    sort(pts.rbegin(),pts.rend());\n    auto t0=chrono::steady_clock::now();\n    auto el=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    long long time_limit=4400;\n    // Run 0 gets most time, subsequent runs get less\n    long long run0_time=3200;\n    long long other_time=300;\n    int run=0;\n    while(el()<time_limit-50){\n        run_mode=run;\n        if(run>=2)rng.seed((long long)run*31337+12345);\n        resetRun();\n        long long run_start=el();\n        long long run_end=(run==0)?min(time_limit-50,run_start+run0_time):min(time_limit-50,run_start+other_time);\n        drainQ(run_end,t0);\n        bool changed=true;\n        while(changed&&el()<run_end){\n            changed=false;\n            for(auto&[w,pos]:pts){\n                if(el()>=run_end)break;\n                auto[x,y]=pos;if(dots[x][y])continue;\n                if(fap(x,y)){changed=true;afterPlace(x,y);drainQ(run_end,t0);}\n            }\n        }\n        long long sc=0;\n        for(int x=0;x<N;x++)for(int y=0;y<N;y++)if(dots[x][y])sc+=(long long)(x-cc)*(x-cc)+(y-cc)*(y-cc)+1;\n        if(sc>best_score){best_score=sc;best_ops=ops;}\n        run++;\n        if(run==1&&el()>=run0_time)continue;\n    }\n    cout<<best_ops.size()<<\"\\n\";\n    for(auto&op:best_ops)cout<<op.x1<<' '<<op.y1<<' '<<op.x2<<' '<<op.y2<<' '<<op.x3<<' '<<op.y3<<' '<<op.x4<<' '<<op.y4<<'\\n';\n    return 0;\n}","ahc015":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef array<array<int,10>,10> Grid;\n\nGrid applyTilt(Grid g, char dir) {\n    if(dir=='L'){for(int i=0;i<10;i++){int p=0;for(int j=0;j<10;j++)if(g[i][j])g[i][p++]=g[i][j];for(;p<10;p++)g[i][p]=0;}}\n    else if(dir=='R'){for(int i=0;i<10;i++){int p=9;for(int j=9;j>=0;j--)if(g[i][j])g[i][p--]=g[i][j];for(;p>=0;p--)g[i][p]=0;}}\n    else if(dir=='F'){for(int j=0;j<10;j++){int p=0;for(int i=0;i<10;i++)if(g[i][j])g[p++][j]=g[i][j];for(;p<10;p++)g[p][j]=0;}}\n    else{for(int j=0;j<10;j++){int p=9;for(int i=9;i>=0;i--)if(g[i][j])g[p--][j]=g[i][j];for(;p>=0;p--)g[p][j]=0;}}\n    return g;\n}\nlong long computeScore(const Grid& g){\n    bool vis[10][10]={};long long sum=0;int stk[100][2];\n    const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\n    for(int si=0;si<10;si++)for(int sj=0;sj<10;sj++){\n        if(!g[si][sj]||vis[si][sj])continue;\n        int f=g[si][sj],sz=0,top=0;stk[top][0]=si;stk[top][1]=sj;top++;vis[si][sj]=true;\n        while(top>0){--top;int x=stk[top][0],y=stk[top][1];sz++;\n            for(int d=0;d<4;d++){int nx=x+dx[d],ny=y+dy[d];\n                if(nx>=0&&nx<10&&ny>=0&&ny<10&&!vis[nx][ny]&&g[nx][ny]==f){vis[nx][ny]=true;stk[top][0]=nx;stk[top][1]=ny;top++;}}}\n        sum+=(long long)sz*sz;}\n    return sum;\n}\nGrid placeCandy(Grid g,int p,int flav){\n    int cnt=0;for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(!g[i][j]&&++cnt==p){g[i][j]=flav;return g;}return g;\n}\nconst char DIRS[]={'F','B','L','R'};\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int fl[100];for(int t=0;t<100;t++)cin>>fl[t];\n    Grid grid={};\n    mt19937 rng(20230101);\n    const int S=5;\n    for(int t=0;t<100;t++){\n        int p;cin>>p;grid=placeCandy(grid,p,fl[t]);\n        char bestDir='F';\n        if(t<99){\n            int nc1=99-t, nc2=98-t;\n            // Pre-sample step t+2 positions (CRN across d1)\n            int s3[S],s_cnt=0;\n            if(t+2<100){\n                s_cnt=min(S,nc2);\n                if(nc2<=S){ for(int s=0;s<nc2;s++) s3[s]=s+1; }\n                else { for(int s=0;s<S;s++) s3[s]=rng()%nc2+1; }\n            }\n            long long best=-1;\n            for(char d1:DIRS){\n                Grid g1=applyTilt(grid,d1);\n                long long total=0;\n                for(int p2=1;p2<=nc1;p2++){\n                    Grid g2=placeCandy(g1,p2,fl[t+1]);\n                    long long mx=0;\n                    for(char d2:DIRS){\n                        Grid g2t=applyTilt(g2,d2);\n                        long long val;\n                        if(s_cnt==0){\n                            val=computeScore(g2t);\n                        } else {\n                            long long sum3=0;\n                            for(int s=0;s<s_cnt;s++){\n                                Grid g3=placeCandy(g2t,s3[s],fl[t+2]);\n                                long long best3=0;\n                                for(char d3:DIRS)\n                                    best3=max(best3,computeScore(applyTilt(g3,d3)));\n                                sum3+=best3;\n                            }\n                            val=sum3;\n                        }\n                        mx=max(mx,val);\n                    }\n                    total+=mx;\n                }\n                if(total>best){best=total;bestDir=d1;}\n            }\n        }\n        cout<<bestDir<<'\\n';cout.flush();\n        grid=applyTilt(grid,bestDir);\n    }\n    return 0;\n}","ahc016":"#include <bits/stdc++.h>\n#include <Eigen/Dense>\nusing namespace std;\nusing namespace Eigen;\nint M, N; double eps;\ndouble normalCDF(double x){return 0.5*erfc(-x*M_SQRT1_2);}\nvector<double> getDeg(const string& s,int n){vector<int> d(n,0);int idx=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1'){d[i]++;d[j]++;}sort(d.begin(),d.end());return{d.begin(),d.end()};}\nvector<double> getEig(const string& s,int n){MatrixXd A(n,n);A.setZero();int idx=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1')A(i,j)=A(j,i)=1.0;SelfAdjointEigenSolver<MatrixXd> sol(A,EigenvaluesOnly);vector<double> ev(n);for(int i=0;i<n;i++)ev[i]=sol.eigenvalues()(i);return ev;}\nstring makeG(int n,int m){int me=n*(n-1)/2;m=max(0,min(m,me));string s(me,'0');auto pos=[&](int a,int b)->int{if(a>b)swap(a,b);return a*(2*n-a-1)/2+(b-a-1);};int cnt=0;for(int d=1;d<n&&cnt<m;d++)for(int i=0;i<n&&cnt<m;i++){int j=(i+d)%n;if(i<j){s[pos(i,j)]='1';cnt++;}}return s;}\nint computeOptimalN(int M,double eps){\n    int Nmin=4;while((long long)Nmin*(Nmin-1)/2<M&&Nmin<100)Nmin++;\n    if(eps<1e-9||M<=1)return Nmin;\n    double bestScore=0;int optN=Nmin;\n    for(int n=Nmin;n<=100;n++){\n        int me=n*(n-1)/2;\n        vector<vector<double>> centers(M);\n        for(int k=0;k<M;k++){int m=(int)round((double)k*me/max(1,M-1));string g=makeG(n,m);centers[k]=getDeg(g,n);}\n        double minL2=1e18;\n        for(int k=1;k<M;k++){double l2=0;for(int i=0;i<n;i++){double diff=(centers[k][i]-centers[k-1][i])*(1.0-2.0*eps);l2+=diff*diff;}minL2=min(minL2,sqrt(l2));}\n        double l2noise=sqrt((double)n*(n-1)*eps*(1-eps));if(l2noise<1e-12)l2noise=1e-12;\n        // FIXED: multiply by sqrt(n) - for L2 classifier in n dimensions, SNR scales as sqrt(n)\n        double snr_eff=(minL2/l2noise)*sqrt((double)n);\n        double p_err=min((double)(M-1)/M,2.0*(1.0-normalCDF(snr_eff/2.0)));\n        double score=(1e9/n)*pow(0.9,100.0*p_err);\n        if(score>bestScore){bestScore=score;optN=n;}\n    }\n    return optN;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>M>>eps;N=computeOptimalN(M,eps);\n    int ME=N*(N-1)/2;vector<string> G(M);\n    for(int k=0;k<M;k++){int m=(int)round((double)k*ME/max(1,M-1));G[k]=makeG(N,m);}\n    cout<<N<<\"\\n\";for(auto&g:G)cout<<g<<\"\\n\";cout<<flush;\n    long long budget=2000000000LL;\n    long long opPS_eig=(long long)N*N+(long long)N*N*N;\n    int NS_eig=max(1,(int)(budget/max(1LL,(long long)M*opPS_eig)));\n    bool useEig=(NS_eig>=20);\n    int NS,FD;\n    if(useEig){NS=min(500,NS_eig);FD=2*N;}\n    else{long long opPS_deg=(long long)N*N;NS=max(30,min(1000,(int)(budget/max(1LL,(long long)M*opPS_deg))));FD=N;}\n    vector<vector<double>> C(M,vector<double>(FD,0.0));\n    if(eps<1e-9){\n        for(int k=0;k<M;k++){auto ds=getDeg(G[k],N);for(int i=0;i<N;i++)C[k][i]=ds[i];if(useEig){auto es=getEig(G[k],N);for(int i=0;i<N;i++)C[k][N+i]=es[i];}}\n    }else{\n        mt19937 rng(42);uniform_real_distribution<double> u(0.0,1.0);\n        for(int k=0;k<M;k++){\n            for(int s=0;s<NS;s++){string t=G[k];for(char&c:t)if(u(rng)<eps)c^=1;auto ds=getDeg(t,N);for(int i=0;i<N;i++)C[k][i]+=ds[i];if(useEig){auto es=getEig(t,N);for(int i=0;i<N;i++)C[k][N+i]+=es[i];}}\n            for(int i=0;i<FD;i++)C[k][i]/=NS;\n        }\n    }\n    for(int q=0;q<100;q++){\n        string h;cin>>h;\n        vector<double> hf(FD);auto dh=getDeg(h,N);for(int i=0;i<N;i++)hf[i]=dh[i];\n        if(useEig){auto eh=getEig(h,N);for(int i=0;i<N;i++)hf[N+i]=eh[i];}\n        int best=0;double bestD=1e18;\n        for(int k=0;k<M;k++){double d=0;for(int i=0;i<FD;i++){double dd=hf[i]-C[k][i];d+=dd*dd;}if(d<bestD){bestD=d;best=k;}}\n        cout<<best<<\"\\n\"<<flush;\n    }\n    return 0;\n}","ahc017":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef pair<ll,int> pli;\nconst ll INF=1e18;\nconst int MXN=1005,MXM=3005,MXD=35,MAXCP=10;\nint N,M,D,K,EU[MXM],EV[MXM];ll EW[MXM];\nvector<pair<int,int>> G[MXN];\nll gd[MXN][MXN];double imp[MXM];int aday[MXM];\ndouble ADJ[MXM][MXD];int cutD[MXM][MXD];\nvector<int> ladj[MXM],cpairs[MXM],dayE[MXD];int dpos[MXM];\nuint64_t rs=0xdeadbeef123ULL;\nuint64_t rng(){rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;}\nint ri(int n){return(int)(rng()%(unsigned)n);}\ndouble rd(){return(rng()>>11)*(1.0/(1ull<<53));}\nvoid dijk(int s){fill(gd[s]+1,gd[s]+N+1,INF);gd[s][s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[d,u]=pq.top();pq.pop();if(d>gd[s][u])continue;for(auto&[v,e]:G[u]){ll nd=d+EW[e];if(nd<gd[s][v]){gd[s][v]=nd;pq.push({nd,v});}}}}\nll dijkS(int s,int t,int sk){static ll d[MXN];fill(d+1,d+N+1,INF);d[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;if(u==t)return d[t];for(auto&[v,e]:G[u]){if(e==sk)continue;ll nd=dd+EW[e];if(nd<d[v]){d[v]=nd;pq.push({nd,v});}}}return d[t];}\nstruct BrFr{int u,pe,ix;};struct BrI{int e,sz;};\nint bdt[MXN],blv[MXN];vector<BrFr> bstk;\nvoid findBr(int sk,vector<BrI>&br){fill(bdt+1,bdt+N+1,-1);int tm=0;bstk.clear();if((int)bstk.capacity()<N+2)bstk.reserve(N+2);bdt[1]=blv[1]=tm++;bstk.push_back({1,-1,0});while(!bstk.empty()){BrFr&c=bstk.back();if(c.ix<(int)G[c.u].size()){auto[v,e]=G[c.u][c.ix++];if(e==sk||e==c.pe){}else if(bdt[v]<0){bdt[v]=blv[v]=tm++;bstk.push_back({v,e,0});}else blv[c.u]=min(blv[c.u],bdt[v]);}else{int u=c.u,pe=c.pe,sz=tm-bdt[u];bstk.pop_back();if(!bstk.empty()){BrFr&p=bstk.back();blv[p.u]=min(blv[p.u],blv[u]);if(blv[u]>bdt[p.u])br.push_back({pe,sz});}}}}\nbool cvis[MXN];int cq[MXN];\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);auto tst=chrono::steady_clock::now();\n    cin>>N>>M>>D>>K;for(int i=0;i<M;i++){cin>>EU[i]>>EV[i]>>EW[i];G[EU[i]].push_back({EV[i],i});G[EV[i]].push_back({EU[i],i});}\n    for(int i=1;i<=N;i++){int x,y;cin>>x>>y;}\n    for(int s=1;s<=N;s++)dijk(s);\n    {vector<int>par(N+1,-1),sv(N);vector<ll>sz(N+1,1);iota(sv.begin(),sv.end(),1);for(int s=1;s<=N;s++){fill(par.begin(),par.end(),-1);fill(sz.begin(),sz.end(),1LL);sort(sv.begin(),sv.end(),[s](int a,int b){return gd[s][a]<gd[s][b];});for(int v:sv){if(v==s)continue;for(auto&[u,e]:G[v])if(gd[s][u]+EW[e]==gd[s][v]){par[v]=e;break;}}for(int i=(int)sv.size()-1;i>=0;i--){int v=sv[i];if(par[v]<0)continue;int p=(EU[par[v]]==v)?EV[par[v]]:EU[par[v]];sz[p]+=sz[v];}for(int v:sv){if(par[v]<0)continue;imp[par[v]]+=(double)sz[v];}}}\n    for(int e=0;e<M;e++){ll dt=dijkS(EU[e],EV[e],e);imp[e]*=(dt<INF)?(double)(dt-EW[e]):0.0;}\n    {vector<BrI>br;for(int e=0;e<M;e++){for(int ep:{EU[e],EV[e]}){if((int)G[ep].size()==2){for(auto&[w,oe]:G[ep])if(oe!=e)cpairs[e].push_back(oe);}}sort(cpairs[e].begin(),cpairs[e].end());cpairs[e].erase(unique(cpairs[e].begin(),cpairs[e].end()),cpairs[e].end());br.clear();findBr(e,br);sort(br.begin(),br.end(),[](const BrI&a,const BrI&b){return min(a.sz,N-a.sz)>min(b.sz,N-b.sz);});for(auto&bi:br){if((int)cpairs[e].size()>=MAXCP)break;auto it=lower_bound(cpairs[e].begin(),cpairs[e].end(),bi.e);if(it==cpairs[e].end()||*it!=bi.e)cpairs[e].insert(it,bi.e);}}}\n    for(int u=1;u<=N;u++){int dg=G[u].size();for(int i=0;i<dg;i++)for(int j=i+1;j<dg;j++){int e1=G[u][i].second,e2=G[u][j].second;ladj[e1].push_back(e2);ladj[e2].push_back(e1);}}\n    for(int e=0;e<M;e++){sort(ladj[e].begin(),ladj[e].end());ladj[e].erase(unique(ladj[e].begin(),ladj[e].end()),ladj[e].end());}\n    auto isAdj=[](int a,int b){return binary_search(ladj[a].begin(),ladj[a].end(),b);};\n    auto isCut=[](int a,int b){return binary_search(cpairs[a].begin(),cpairs[a].end(),b);};\n    fill(aday,aday+M,-1);int dc[MXD]={};\n    {vector<int>eo(M);iota(eo.begin(),eo.end(),0);sort(eo.begin(),eo.end(),[](int a,int b){return imp[a]>imp[b];});for(int e:eo){int best=-1;double bs=1e18;int bc=INT_MAX;for(int d=0;d<D;d++){if(dc[d]>=K)continue;int cuts=0;for(int f:cpairs[e])if(aday[f]==d)cuts++;double cf=0;for(int e2:ladj[e])if(aday[e2]==d)cf+=imp[e2];double sc=cf+1e-12*dc[d];if(cuts<bc||(cuts==bc&&sc<bs)){bc=cuts;bs=sc;best=d;}}if(best<0)best=0;aday[e]=best;dc[best]++;}}\n    memset(cutD,0,sizeof(cutD));for(int e=0;e<M;e++)for(int f:cpairs[e])cutD[e][aday[f]]++;\n    memset(ADJ,0,sizeof(ADJ));for(int e=0;e<M;e++)for(int e2:ladj[e])ADJ[e][aday[e2]]+=imp[e2];\n    for(int e=0;e<M;e++){dpos[e]=dayE[aday[e]].size();dayE[aday[e]].push_back(e);}\n    const double BIG=1e30;double T=1.0;\n    {double sm=0;int c=0;for(int tr=0;tr<100000&&c<3000;tr++){int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];if(dlc>0)continue;double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];sm+=fabs(dl);c++;}if(c>0)T=sm/c;if(T<1e-9)T=1.0;}\n    double T0=T;\n    for(long long step=0;;step++){\n        if(step%200000==0){double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>5.3)break;T=T0*exp(-10.*el/5.3);}\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        int ic=isCut(e1,e2)?1:0;\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];\n        int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];\n        double dtot=dl+BIG*dlc;\n        if(dtot<=0||(T>1e-9&&rd()<exp(-dtot/T))){\n            for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}\n            for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n            for(int f:cpairs[e1]){cutD[f][d1]--;cutD[f][d2]++;}\n            for(int f:cpairs[e2]){cutD[f][d2]--;cutD[f][d1]++;}\n            {int p=dpos[e1],L=dayE[d1].back();dayE[d1][p]=L;dpos[L]=p;dayE[d1].pop_back();}\n            {int p=dpos[e2],L=dayE[d2].back();dayE[d2][p]=L;dpos[L]=p;dayE[d2].pop_back();}\n            dpos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;\n            dpos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n        }\n    }\n    for(int d=0;d<D;d++){int mr=(int)dayE[d].size()+5;while(mr-->0){fill(cvis+1,cvis+N+1,false);int h=0,t=0;cvis[1]=true;cq[t++]=1;while(h<t){int u=cq[h++];for(auto&[v,e]:G[u])if(aday[e]!=d&&!cvis[v]){cvis[v]=true;cq[t++]=v;}}bool disc=false;for(int v=1;v<=N;v++)if(!cvis[v]){disc=true;break;}if(!disc)break;bool fx=false;for(int i=0;i<(int)dayE[d].size()&&!fx;i++){int e=dayE[d][i];if(cvis[EU[e]]==cvis[EV[e]])continue;for(int dd=0;dd<D&&!fx;dd++){if(dd==d||(int)dayE[dd].size()>=K)continue;for(int ef:ladj[e]){ADJ[ef][d]-=imp[e];ADJ[ef][dd]+=imp[e];}for(int f:cpairs[e]){cutD[f][d]--;cutD[f][dd]++;}int p=dpos[e],L=dayE[d].back();dayE[d][p]=L;dpos[L]=p;dayE[d].pop_back();dpos[e]=dayE[dd].size();dayE[dd].push_back(e);aday[e]=dd;fx=true;}}if(!fx)break;}}\n    for(int i=0;i<M;i++){if(i)cout<<' ';cout<<aday[i]+1;}cout<<'\\n';\n}","ahc019":"#include <bits/stdc++.h>\nusing namespace std;\nint D;string Fs[2][14],Rs[2][14];int bid,B[2][2744];bool occ[2][2744];\nstruct Box{int x,y,z,a,b,c;};\nbool bf(int r,int x0,int y0,int z0,int a,int b,int c){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++)if(occ[r][(x0+i)*D*D+(y0+j)*D+z0+k])return false;return true;}\nvoid fB(int r,int x0,int y0,int z0,int a,int b,int c,int id){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++){int q=(x0+i)*D*D+(y0+j)*D+z0+k;B[r][q]=id;occ[r][q]=true;}}\nvoid fL(int r,int x,int y,int z,int l,int ax,int id){for(int k=0;k<l;k++){int q=(x+(ax==0?k:0))*D*D+(y+(ax==1?k:0))*D+z+(ax==2?k:0);B[r][q]=id;occ[r][q]=true;}}\nvector<Box> eB(int arr){vector<Box>v;uint16_t fz[14]={},rz[14]={};for(int z=0;z<D;z++)for(int x=0;x<D;x++)if(Fs[arr][z][x]=='1')fz[x]|=1u<<z;for(int z=0;z<D;z++)for(int y=0;y<D;y++)if(Rs[arr][z][y]=='1')rz[y]|=1u<<z;uint16_t am=(uint16_t)((1u<<D)-1);for(int x0=0;x0<D;x0++){uint16_t xm=am;for(int a=1;x0+a<=D;a++){xm&=fz[x0+a-1];if(!xm)break;for(int y0=0;y0<D;y0++){uint16_t ym=am;for(int b=1;y0+b<=D;b++){ym&=rz[y0+b-1];if(!ym)break;uint16_t zm=xm&ym;if(!zm)continue;for(int z=0;z<D;z++){if(!(zm&(1u<<z)))continue;int cm=0;while(z+cm<D&&(zm&(1u<<(z+cm))))cm++;for(int c=1;c<=cm;c++)v.push_back({x0,y0,z,a,b,c});}}}}};return v;}\nstruct Ln{int x,y,z,len,ax;};\nvector<Ln> gRL(int arr,int ax){vector<Ln>L;if(ax==0){for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,s=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=x;else if(!v&&s>=0){L.push_back({s,y,z,x-s,0});s=-1;}}}}else if(ax==1){for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,s=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=y;else if(!v&&s>=0){L.push_back({x,s,z,y-s,1});s=-1;}}}}else{for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,s=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=z;else if(!v&&s>=0){L.push_back({x,y,s,z-s,2});s=-1;}}}}return L;}\ndouble mS(const vector<Ln>&L0,const vector<Ln>&L1){map<int,int>c0,c1;for(auto&l:L0)c0[l.len]++;for(auto&l:L1)c1[l.len]++;double sc=0;int v0=0,v1=0;for(auto&[l,c]:c0){int cl=c1.count(l)?c1[l]:0;sc+=min(c,cl)*1.0/l;v0+=(c-min(c,cl))*l;}for(auto&[l,c]:c1){int cl=c0.count(l)?c0[l]:0;if(c>cl)v1+=(c-cl)*l;}return sc+max(v0,v1);}\nvoid doBox(){auto bx0=eB(0),bx1=eB(1);typedef array<int,3>Key;auto gk=[](const Box&b)->Key{Key k={b.a,b.b,b.c};sort(k.begin(),k.end());return k;};map<Key,vector<int>>g0,g1;for(int i=0;i<(int)bx0.size();i++)g0[gk(bx0[i])].push_back(i);for(int i=0;i<(int)bx1.size();i++)g1[gk(bx1[i])].push_back(i);vector<pair<int,Key>>grps;for(auto&[k,v]:g0)if(g1.count(k))grps.push_back({k[0]*k[1]*k[2],k});sort(grps.rbegin(),grps.rend());for(auto&[vol,key]:grps){auto&v0=g0[key];auto&v1=g1[key];int p1=0;for(int i0:v0){auto&B0=bx0[i0];if(!bf(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c))continue;while(p1<(int)v1.size()&&!bf(1,bx1[v1[p1]].x,bx1[v1[p1]].y,bx1[v1[p1]].z,bx1[v1[p1]].a,bx1[v1[p1]].b,bx1[v1[p1]].c))p1++;if(p1>=(int)v1.size())break;auto&B1=bx1[v1[p1++]];bid++;fB(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c,bid);fB(1,B1.x,B1.y,B1.z,B1.a,B1.b,B1.c,bid);}}int bax0=1,bax1=1;double bsc=1e18;for(int a0=0;a0<3;a0++){auto Lt0=gRL(0,a0);for(int a1=0;a1<3;a1++){auto Lt1=gRL(1,a1);double sc=mS(Lt0,Lt1);if(sc<bsc){bsc=sc;bax0=a0;bax1=a1;}}}auto L0=gRL(0,bax0),L1=gRL(1,bax1);map<int,vector<int>>gl0,gl1;for(int i=0;i<(int)L0.size();i++)gl0[L0[i].len].push_back(i);for(int i=0;i<(int)L1.size();i++)gl1[L1[i].len].push_back(i);vector<bool>lu0(L0.size(),false),lu1(L1.size(),false);for(auto&[l,v0]:gl0){auto it=gl1.find(l);if(it==gl1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;fL(0,L0[v0[j]].x,L0[v0[j]].y,L0[v0[j]].z,l,L0[v0[j]].ax,bid);fL(1,L1[v1[j]].x,L1[v1[j]].y,L1[v1[j]].z,l,L1[v1[j]].ax,bid);lu0[v0[j]]=lu1[v1[j]]=true;}}vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)L0.size();i++)if(!lu0[i])rv0.push_back({L0[i].len,i});for(int i=0;i<(int)L1.size();i++)if(!lu1[i])rv1.push_back({L1[i].len,i});sort(rv0.rbegin(),rv0.rend());sort(rv1.begin(),rv1.end());struct SO{int idx,off;};deque<SO>r0,r1;for(auto&[l,i]:rv0)r0.push_back({i,0});for(auto&[l,i]:rv1)r1.push_back({i,0});auto gp=[&](const Ln&s,int off)->tuple<int,int,int>{return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};};while(!r0.empty()&&!r1.empty()){auto&[i0,o0]=r0.front();auto&[i1,o1]=r1.front();int ml=min(L0[i0].len-o0,L1[i1].len-o1);bid++;auto[x0,y0,z0]=gp(L0[i0],o0);auto[x1,y1,z1]=gp(L1[i1],o1);fL(0,x0,y0,z0,ml,L0[i0].ax,bid);fL(1,x1,y1,z1,ml,L1[i1].ax,bid);o0+=ml;o1+=ml;if(o0==L0[i0].len)r0.pop_front();if(o1==L1[i1].len)r1.pop_front();}while(!r0.empty()){auto[i0,o0]=r0.front();r0.pop_front();bid++;auto[x,y,z]=gp(L0[i0],o0);fL(0,x,y,z,L0[i0].len-o0,L0[i0].ax,bid);}while(!r1.empty()){auto[i1,o1]=r1.front();r1.pop_front();bid++;auto[x,y,z]=gp(L1[i1],o1);fL(1,x,y,z,L1[i1].len-o1,L1[i1].ax,bid);}}\nstruct Seg{int x,y,z,len,ax;};\nvector<Seg> mF(int arr,int ax){vector<Seg>c;if(ax==2)for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,zs=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1';if(v&&zs<0)zs=z;else if(!v&&zs>=0){c.push_back({x,y,zs,z-zs,2});zs=-1;}}}else if(ax==1)for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,ys=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1';if(v&&ys<0)ys=y;else if(!v&&ys>=0){c.push_back({x,ys,z,y-ys,1});ys=-1;}}}else for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,xs=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1';if(v&&xs<0)xs=x;else if(!v&&xs>=0){c.push_back({xs,y,z,x-xs,0});xs=-1;}}}sort(c.begin(),c.end(),[](auto&a,auto&b){return a.len>b.len;});bool cx[14][14]={},cy[14][14]={};vector<Seg>sel;for(auto&s:c){bool u=false;for(int k=0;k<s.len&&!u;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);if(!cx[z][x]||!cy[z][y])u=true;}if(!u)continue;sel.push_back(s);for(int k=0;k<s.len;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);cx[z][x]=cy[z][y]=true;}}return sel;}\ndouble eS(const vector<Seg>&S0,const vector<Seg>&S1){map<int,int>c0,c1;for(auto&s:S0)c0[s.len]++;for(auto&s:S1)c1[s.len]++;double sc=0;int v0=0,v1=0;for(auto&[l,n]:c0){int m=c1.count(l)?c1[l]:0;sc+=min(n,m)*1.0/l;v0+=(n-min(n,m))*l;}for(auto&[l,n]:c1){int m=c0.count(l)?c0[l]:0;if(n>m)v1+=(n-m)*l;}return sc+max(v0,v1);}\nvoid fS(int arr,const Seg&s,int id,int off,int len){for(int k=0;k<len;k++){int z=s.z+(s.ax==2?off+k:0),x=s.x+(s.ax==0?off+k:0),y=s.y+(s.ax==1?off+k:0);B[arr][x*D*D+y*D+z]=id;}}\nvoid doMF(const vector<Seg>&F0,const vector<Seg>&F1){map<int,vector<int>>g0,g1;for(int i=0;i<(int)F0.size();i++)g0[F0[i].len].push_back(i);for(int i=0;i<(int)F1.size();i++)g1[F1[i].len].push_back(i);vector<bool>u0(F0.size(),false),u1(F1.size(),false);for(auto&[l,v0]:g0){auto it=g1.find(l);if(it==g1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;fS(0,F0[v0[j]],bid,0,l);fS(1,F1[v1[j]],bid,0,l);u0[v0[j]]=u1[v1[j]]=true;}}vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)F0.size();i++)if(!u0[i])rv0.push_back({F0[i].len,i});for(int i=0;i<(int)F1.size();i++)if(!u1[i])rv1.push_back({F1[i].len,i});sort(rv0.rbegin(),rv0.rend());sort(rv1.begin(),rv1.end());deque<pair<int,int>>r0,r1;for(auto&[l,i]:rv0)r0.push_back({i,0});for(auto&[l,i]:rv1)r1.push_back({i,0});while(!r0.empty()&&!r1.empty()){auto&[i0,o0]=r0.front();auto&[i1,o1]=r1.front();int ml=min(F0[i0].len-o0,F1[i1].len-o1);bid++;fS(0,F0[i0],bid,o0,ml);fS(1,F1[i1],bid,o1,ml);o0+=ml;o1+=ml;if(o0==F0[i0].len)r0.pop_front();if(o1==F1[i1].len)r1.pop_front();}while(!r0.empty()){auto[i0,o0]=r0.front();r0.pop_front();bid++;fS(0,F0[i0],bid,o0,F0[i0].len-o0);}while(!r1.empty()){auto[i1,o1]=r1.front();r1.pop_front();bid++;fS(1,F1[i1],bid,o1,F1[i1].len-o1);}}\ndouble cScore(int mb){vector<int>v0(mb+1,0),v1(mb+1,0);for(int i=0;i<D*D*D;i++){if(B[0][i])v0[B[0][i]]++;if(B[1][i])v1[B[1][i]]++;}double sc=0;for(int k=1;k<=mb;k++){if(v0[k]>0&&v1[k]>0)sc+=1.0/v0[k];else if(v0[k]>0)sc+=v0[k];else sc+=v1[k];}return sc;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>D;for(int i=0;i<2;i++){for(int z=0;z<D;z++)cin>>Fs[i][z];for(int z=0;z<D;z++)cin>>Rs[i][z];}\n    int bax0=2,bax1=2;double bscMF=1e18;vector<Seg>bF0,bF1;\n    for(int a0=0;a0<3;a0++){auto F0=mF(0,a0);for(int a1=0;a1<3;a1++){auto F1=mF(1,a1);double sc=eS(F0,F1);if(sc<bscMF){bscMF=sc;bax0=a0;bax1=a1;bF0=F0;bF1=F1;}}}\n    memset(B,0,sizeof(B));bid=0;doMF(bF0,bF1);\n    int bidMF=bid;int BMF[2][2744];memcpy(BMF,B,sizeof(B));double sMF=cScore(bidMF);\n    memset(B,0,sizeof(B));memset(occ,0,sizeof(occ));bid=0;doBox();\n    double sBox=cScore(bid);\n    if(sMF<=sBox){bid=bidMF;memcpy(B,BMF,sizeof(B));}\n    cout<<bid<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[0][i];}cout<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[1][i];}cout<<\"\\n\";\n    return 0;}","ahc020":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint main() {\n    auto tStart = chrono::steady_clock::now();\n    auto msElapsed = [&]() {\n        return (int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-tStart).count();\n    };\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,K; cin>>N>>M>>K;\n    vector<ll> X(N),Y(N);\n    for(int i=0;i<N;i++) cin>>X[i]>>Y[i];\n    vector<int> EU(M),EV(M); vector<ll> EW(M);\n    for(int j=0;j<M;j++){cin>>EU[j]>>EV[j]>>EW[j];EU[j]--;EV[j]--;}\n    vector<ll> A(K),B(K);\n    for(int k=0;k<K;k++) cin>>A[k]>>B[k];\n    const ll MAXP=5000,MAXP2=MAXP*MAXP,INF=(ll)4e18;\n    // D2[i][k] and D2T[k][i] (transposed, cache-efficient for fixed k, varying i)\n    vector<vector<ll>> D2(N,vector<ll>(K)),D2T(K,vector<ll>(N));\n    for(int i=0;i<N;i++)\n        for(int k=0;k<K;k++){ll dx=A[k]-X[i],dy=B[k]-Y[i];D2[i][k]=D2T[k][i]=dx*dx+dy*dy;}\n    vector<vector<pair<int,int>>> adj(N);\n    for(int j=0;j<M;j++){adj[EU[j]].push_back({EV[j],j});adj[EV[j]].push_back({EU[j],j});}\n    auto pVal=[&](ll d2)->ll{if(!d2)return 0;ll p=(ll)sqrt((double)d2);while(p*p<d2)p++;return min(p,MAXP);};\n    // APSP\n    vector<vector<ll>> spD(N,vector<ll>(N,INF));\n    vector<vector<int>> spE(N,vector<int>(N,-1)),spPr(N,vector<int>(N,-1));\n    for(int s=0;s<N;s++){\n        spD[s][s]=0;\n        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> pq;pq.push({0,s});\n        while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(d>spD[s][v])continue;\n            for(auto&[u,j]:adj[v]){ll nd=d+EW[j];if(nd<spD[s][u]){spD[s][u]=nd;spPr[s][u]=v;spE[s][u]=j;pq.push({nd,u});}}}\n    }\n    auto buildSteiner=[&](vector<bool> term)->vector<bool>{\n        term[0]=true;vector<int>T;for(int i=0;i<N;i++)if(term[i])T.push_back(i);int TN=T.size();\n        vector<bool>in(TN,false);vector<ll>key(TN,INF);vector<int>par(TN,-1);key[0]=0;\n        for(int it=0;it<TN;it++){int u=-1;for(int i=0;i<TN;i++)if(!in[i]&&(u<0||key[i]<key[u]))u=i;\n            if(u<0||key[u]>=INF)break;in[u]=true;\n            for(int w=0;w<TN;w++)if(!in[w]&&spD[T[u]][T[w]]<key[w]){key[w]=spD[T[u]][T[w]];par[w]=u;}}\n        vector<bool>eo(M,false);\n        for(int i=0;i<TN;i++){if(par[i]<0)continue;int src=T[par[i]],dst=T[i];for(int v=dst;v!=src;v=spPr[src][v])eo[spE[src][v]]=true;}\n        return eo;\n    };\n    // Enhanced optimizeP: 1-opt + bulk-2 + bulk-3 + 2-opt swap (using D2T for cache efficiency)\n    auto optimizeP=[&](const vector<bool>&reach)->pair<vector<int>,ll>{\n        vector<vector<int>>vR(N);vector<ll>vMx(N,0);\n        for(int k=0;k<K;k++){\n            ll best=INF;int bv=-1;\n            for(int i=0;i<N;i++)if(reach[i]&&D2T[k][i]<best){best=D2T[k][i];bv=i;}\n            if(bv<0||best>MAXP2)return{{},INF};\n            vR[bv].push_back(k);vMx[bv]=max(vMx[bv],best);\n        }\n        vector<ll>Pv(N,0);for(int i=0;i<N;i++)Pv[i]=pVal(vMx[i]);\n        bool imp=true;int it=0;\n        while(imp&&it++<500){\n            imp=false;\n            struct T4{int k[4];ll d[4];};\n            vector<T4>tp(N);\n            for(int u=0;u<N;u++){tp[u]={{-1,-1,-1,-1},{0,0,0,0}};\n                for(int k:vR[u]){ll d=D2T[k][u];\n                    if(d>tp[u].d[0]){tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=tp[u].d[1];tp[u].k[2]=tp[u].k[1];tp[u].d[1]=tp[u].d[0];tp[u].k[1]=tp[u].k[0];tp[u].d[0]=d;tp[u].k[0]=k;}\n                    else if(d>tp[u].d[1]){tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=tp[u].d[1];tp[u].k[2]=tp[u].k[1];tp[u].d[1]=d;tp[u].k[1]=k;}\n                    else if(d>tp[u].d[2]){tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=d;tp[u].k[2]=k;}\n                    else if(d>tp[u].d[3]){tp[u].d[3]=d;tp[u].k[3]=k;}\n                }}\n            ll bD=0;int bU=-1,bV=-1,bT=-1;\n            for(int u=0;u<N;u++){\n                if(!reach[u]||tp[u].k[0]<0)continue;\n                ll Pu2=Pv[u]*Pv[u];\n                for(int v=0;v<N;v++){\n                    if(v==u||!reach[v])continue;\n                    ll Pv2=Pv[v]*Pv[v];\n                    ll d0v=D2T[tp[u].k[0]][v];bool f0=(d0v<=MAXP2);\n                    if(f0){ll nPu=pVal(tp[u].d[1]),nPv=pVal(max(vMx[v],d0v));ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=0;}}\n                    if(f0&&tp[u].k[1]>=0){ll d1v=D2T[tp[u].k[1]][v];if(d1v<=MAXP2){ll nPu=pVal(tp[u].d[2]),nPv=pVal(max({vMx[v],d0v,d1v}));ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=1;}}}\n                    if(f0&&tp[u].k[2]>=0){ll d1v=D2T[tp[u].k[1]][v],d2v=D2T[tp[u].k[2]][v];if(d1v<=MAXP2&&d2v<=MAXP2){ll nPu=pVal(tp[u].d[3]),nPv=pVal(max({vMx[v],d0v,d1v,d2v}));ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=2;}}}\n                    if(v>u&&f0&&tp[v].k[0]>=0){ll d0u=D2T[tp[v].k[0]][u];if(d0u<=MAXP2){ll nMxU=max(tp[u].d[1],d0u),nMxV=max(tp[v].d[1],d0v);ll nPu=pVal(nMxU),nPv=pVal(nMxV);ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=3;}}}\n                }\n            }\n            if(bU<0)break;\n            int u=bU,v=bV;\n            if(bT==0){int ku=tp[u].k[0];auto&ru=vR[u];ru.erase(find(ru.begin(),ru.end(),ku));vR[v].push_back(ku);vMx[u]=tp[u].d[1];Pv[u]=pVal(vMx[u]);vMx[v]=max(vMx[v],D2T[ku][v]);Pv[v]=pVal(vMx[v]);}\n            else if(bT==1){int k0=tp[u].k[0],k1=tp[u].k[1];auto&ru=vR[u];ru.erase(find(ru.begin(),ru.end(),k0));ru.erase(find(ru.begin(),ru.end(),k1));vR[v].push_back(k0);vR[v].push_back(k1);vMx[u]=tp[u].d[2];Pv[u]=pVal(vMx[u]);vMx[v]=max({vMx[v],D2T[k0][v],D2T[k1][v]});Pv[v]=pVal(vMx[v]);}\n            else if(bT==2){int k0=tp[u].k[0],k1=tp[u].k[1],k2=tp[u].k[2];auto&ru=vR[u];ru.erase(find(ru.begin(),ru.end(),k0));ru.erase(find(ru.begin(),ru.end(),k1));ru.erase(find(ru.begin(),ru.end(),k2));vR[v].push_back(k0);vR[v].push_back(k1);vR[v].push_back(k2);vMx[u]=tp[u].d[3];Pv[u]=pVal(vMx[u]);vMx[v]=max({vMx[v],D2T[k0][v],D2T[k1][v],D2T[k2][v]});Pv[v]=pVal(vMx[v]);}\n            else{int ku=tp[u].k[0],kv=tp[v].k[0];auto&ru=vR[u];auto&rv=vR[v];ru.erase(find(ru.begin(),ru.end(),ku));rv.erase(find(rv.begin(),rv.end(),kv));ru.push_back(kv);rv.push_back(ku);vMx[u]=max(tp[u].d[1],D2T[kv][u]);Pv[u]=pVal(vMx[u]);vMx[v]=max(tp[v].d[1],D2T[ku][v]);Pv[v]=pVal(vMx[v]);}\n            imp=true;\n        }\n        vector<int>P(N,0);ll pc=0;for(int i=0;i<N;i++){P[i]=(int)Pv[i];pc+=Pv[i]*Pv[i];}\n        return{P,pc};\n    };\n    auto evalEO=[&](const vector<bool>&eo)->tuple<vector<int>,ll,bool>{\n        vector<bool>reach(N,false);queue<int>q;q.push(0);reach[0]=true;\n        while(!q.empty()){int v=q.front();q.pop();for(auto&[u,j]:adj[v])if(eo[j]&&!reach[u]){reach[u]=true;q.push(u);}}\n        ll ec=0;for(int j=0;j<M;j++)if(eo[j])ec+=EW[j];\n        auto[P,pc]=optimizeP(reach);if(pc==INF)return{{},INF,false};\n        return{P,ec+pc,true};\n    };\n    // MST\n    vector<int>mstPar(N,-1),mstPE(N,-1);vector<vector<int>>mstCh(N);\n    {vector<bool>vis(N,false);vector<ll>key(N,INF);key[0]=0;\n    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>>pq;pq.push({0,0});\n    while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(vis[v])continue;vis[v]=true;for(auto&[u,j]:adj[v])if(!vis[u]&&EW[j]<key[u]){key[u]=EW[j];mstPar[u]=v;mstPE[u]=j;pq.push({EW[j],u});}}\n    for(int v=1;v<N;v++)mstCh[mstPar[v]].push_back(v);}\n    // Leaf pruning (using D2T)\n    vector<bool>act(N,true);vector<vector<int>>vRes(N);vector<ll>vmx(N,0),Pv(N,0);\n    for(int k=0;k<K;k++){ll best=INF;int bv=-1;for(int i=0;i<N;i++)if(D2T[k][i]<best){best=D2T[k][i];bv=i;}vRes[bv].push_back(k);vmx[bv]=max(vmx[bv],best);}\n    for(int i=0;i<N;i++)Pv[i]=pVal(vmx[i]);\n    ll ec0=0,pc0=0;for(int v=1;v<N;v++)ec0+=EW[mstPE[v]];for(int i=0;i<N;i++)pc0+=Pv[i]*Pv[i];\n    auto isLeaf=[&](int v){for(int c:mstCh[v])if(act[c])return false;return true;};\n    for(bool imp2=true;imp2;){\n        imp2=false;ll bD=0;int bV=-1;vector<pair<int,int>>bAs;vector<pair<int,ll>>bAf;\n        for(int v=1;v<N;v++){\n            if(!act[v]||!isLeaf(v))continue;\n            ll delta=-(EW[mstPE[v]]+Pv[v]*Pv[v]);\n            map<int,ll>tmp;vector<pair<int,int>>ta;bool ok=true;\n            for(int k:vRes[v]){ll best=INF;int bu=-1;for(int u=0;u<N;u++){if(u==v||!act[u])continue;if(D2T[k][u]<best){best=D2T[k][u];bu=u;}}\n                if(bu<0||best>MAXP2){ok=false;break;}ta.push_back({k,bu});if(!tmp.count(bu))tmp[bu]=vmx[bu];tmp[bu]=max(tmp[bu],best);}\n            if(!ok)continue;\n            for(auto&[u,nd]:tmp){ll np=pVal(nd);delta+=np*np-Pv[u]*Pv[u];}\n            if(delta<bD){bD=delta;bV=v;bAs=ta;bAf.clear();for(auto&[u,nd]:tmp)bAf.push_back({u,nd});}\n        }\n        if(bV>=0){act[bV]=false;ec0-=EW[mstPE[bV]];pc0-=Pv[bV]*Pv[bV];Pv[bV]=0;vmx[bV]=0;vRes[bV].clear();\n            for(auto&[k,u]:bAs)vRes[u].push_back(k);\n            for(auto&[u,nd]:bAf){pc0-=Pv[u]*Pv[u];vmx[u]=nd;Pv[u]=pVal(nd);pc0+=Pv[u]*Pv[u];}imp2=true;}\n    }\n    ll bestCost=INF;vector<bool>bestEO(M,false);vector<int>bestP(N,0);\n    auto updateBest=[&](const vector<bool>&eo,const vector<int>&P,ll cost){if(cost<bestCost){bestCost=cost;bestEO=eo;bestP=P;}};\n    {vector<bool>eo(M,false);for(int v=1;v<N;v++)if(act[v])eo[mstPE[v]]=true;auto[P,sc,sf]=evalEO(eo);if(sf)updateBest(eo,P,sc);}\n    auto runSteiner=[&](vector<bool>term,int maxIter=20){\n        term[0]=true;\n        for(int sit=0;sit<maxIter&&msElapsed()<1600;sit++){\n            auto eo=buildSteiner(term);auto[sp,sc,sf]=evalEO(eo);if(!sf)break;\n            updateBest(eo,sp,sc);\n            vector<bool>nt(N,false);nt[0]=true;for(int i=0;i<N;i++)if(sp[i]>0)nt[i]=true;\n            if(nt==term)break;term=nt;\n        }\n    };\n    {vector<bool>t(N,false);for(int i=0;i<N;i++)if(Pv[i]>0)t[i]=true;runSteiner(t);}\n    {vector<bool>t(N,true);runSteiner(t);}\n    // Time-based systematic terminal set search\n    auto getTerms=[&]()->vector<bool>{\n        vector<bool>t(N,false);t[0]=true;for(int i=0;i<N;i++)if(bestP[i]>0)t[i]=true;return t;\n    };\n    bool sysImp=true;\n    while(sysImp&&msElapsed()<1850){\n        sysImp=false;\n        vector<bool>curT=getTerms();\n        // Try adding each non-terminal\n        for(int v=1;v<N&&msElapsed()<1850;v++){\n            if(curT[v])continue;\n            vector<bool>t=curT;t[v]=true;\n            auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);\n            if(sf&&sc<bestCost){updateBest(eo,sp,sc);sysImp=true;curT=getTerms();}\n        }\n        // Try removing each terminal\n        for(int v=1;v<N&&msElapsed()<1850;v++){\n            if(!curT[v])continue;\n            vector<bool>t=curT;t[v]=false;\n            auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);\n            if(sf&&sc<bestCost){updateBest(eo,sp,sc);sysImp=true;curT=getTerms();}\n        }\n    }\n    for(int i=0;i<N;i++)cout<<bestP[i]<<\" \\n\"[i==N-1];\n    for(int j=0;j<M;j++)cout<<(int)bestEO[j]<<\" \\n\"[j==M-1];\n    return 0;\n}","ahc021":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int N = 30;\nint init_board[N][N];\n\nint main() {\n    ios::sync_with_stdio(false);\n    cin.tie(nullptr);\n    \n    for (int x = 0; x < N; x++)\n        for (int y = 0; y <= x; y++)\n            cin >> init_board[x][y];\n    \n    mt19937 rng(42);\n    vector<array<int,4>> best;\n    \n    auto do_heapify = [&](bool shuffle_within) -> vector<array<int,4>> {\n        int board[N][N];\n        memcpy(board, init_board, sizeof(board));\n        vector<array<int,4>> ops;\n        ops.reserve(5000);\n        \n        int ys[N];\n        for (int x = N-2; x >= 0; x--) {\n            for (int y = 0; y <= x; y++) ys[y] = y;\n            if (shuffle_within) {\n                for (int i = x; i > 0; i--) {\n                    int j = rng() % (i + 1);\n                    swap(ys[i], ys[j]);\n                }\n            }\n            for (int i = 0; i <= x; i++) {\n                int y = ys[i];\n                int cx = x, cy = y;\n                while (cx < N-1) {\n                    int ny = (board[cx+1][cy] <= board[cx+1][cy+1]) ? cy : cy+1;\n                    if (board[cx][cy] <= board[cx+1][ny]) break;\n                    swap(board[cx][cy], board[cx+1][ny]);\n                    ops.push_back({cx, cy, cx+1, ny});\n                    cy = ny;\n                    cx++;\n                }\n            }\n        }\n        return ops;\n    };\n    \n    // Standard left-to-right\n    best = do_heapify(false);\n    \n    // Right-to-left\n    {\n        int board[N][N];\n        memcpy(board, init_board, sizeof(board));\n        vector<array<int,4>> ops;\n        ops.reserve(5000);\n        for (int x = N-2; x >= 0; x--) {\n            for (int y = x; y >= 0; y--) {\n                int cx = x, cy = y;\n                while (cx < N-1) {\n                    int ny = (board[cx+1][cy] <= board[cx+1][cy+1]) ? cy : cy+1;\n                    if (board[cx][cy] <= board[cx+1][ny]) break;\n                    swap(board[cx][cy], board[cx+1][ny]);\n                    ops.push_back({cx, cy, cx+1, ny});\n                    cy = ny;\n                    cx++;\n                }\n            }\n        }\n        if (ops.size() < best.size()) best = move(ops);\n    }\n    \n    // Many random orderings - explore different valid heap targets\n    for (int t = 0; t < 2000; t++) {\n        auto ops = do_heapify(true);\n        if (ops.size() < best.size())\n            best = move(ops);\n    }\n    \n    cout << best.size() << \"\\n\";\n    for (auto& op : best)\n        cout << op[0] << \" \" << op[1] << \" \" << op[2] << \" \" << op[3] << \"\\n\";\n}","toyota2023summer-final":"#include <bits/stdc++.h>\nusing namespace std;\nconst int D9=9;\nint D,N,M;\nbool obs[D9][D9],hasc[D9][D9];\nint cnum[D9][D9],sr[D9*D9],sc[D9*D9],prank[D9][D9];\nint er,ec;\nconst int dr[4]={-1,1,0,0},dc[4]={0,0,-1,1};\nbool in_(int r,int c){return r>=0&&r<D&&c>=0&&c<D;}\nvoid build_sigma(){\n    int dist[D9][D9];memset(dist,-1,sizeof dist);\n    queue<pair<int,int>>q;q.push({er,ec});dist[er][ec]=0;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||dist[nx][ny]>=0||obs[nx][ny])continue;dist[nx][ny]=dist[x][y]+1;q.push({nx,ny});}}\n    vector<pair<int,int>>pos;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(!obs[r][c]&&!(r==er&&c==ec))pos.emplace_back(r,c);\n    sort(pos.begin(),pos.end(),[&](const pair<int,int>&a,const pair<int,int>&b){if(dist[a.first][a.second]!=dist[b.first][b.second])return dist[a.first][a.second]<dist[b.first][b.second];if(a.first!=b.first)return a.first<b.first;return a.second<b.second;});\n    M=(int)pos.size();\n    for(int k=0;k<M;k++){sr[k]=pos[k].first;sc[k]=pos[k].second;prank[pos[k].first][pos[k].second]=k;}\n}\nvoid bfs_emp(bool vis[D9][D9]){\n    memset(vis,0,D9*D9*sizeof(bool));\n    queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny]||hasc[nx][ny])continue;vis[nx][ny]=1;q.push({nx,ny});}}\n}\nbool safe_place(int r,int c,const vector<pair<int,int>>&reach){\n    bool vis[D9][D9];memset(vis,0,sizeof vis);\n    queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny]||hasc[nx][ny])continue;if(nx==r&&ny==c)continue;vis[nx][ny]=1;q.push({nx,ny});}}\n    for(auto[pr,pc]:reach){if(pr==r&&pc==c)continue;if(!vis[pr][pc])return false;}\n    return true;\n}\npair<int,int>pick_place(int t){\n    bool vis[D9][D9];bfs_emp(vis);\n    int ir=sr[t],ic=sc[t];\n    vector<pair<int,int>>reach;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(vis[r][c]&&!(r==er&&c==ec))reach.emplace_back(r,c);\n    if(vis[ir][ic]&&safe_place(ir,ic,reach))return{ir,ic};\n    pair<int,int>best{-1,-1};int bd=INT_MAX,brk=-1;bool gots=false;\n    for(auto[r,c]:reach){\n        if(r==ir&&c==ic)continue;\n        bool s=safe_place(r,c,reach);\n        int d=abs(prank[r][c]-t),rk=prank[r][c];\n        bool better=(!gots&&s)||(gots==s&&(d<bd||(d==bd&&rk>brk)));\n        if(better){best={r,c};bd=d;brk=rk;gots=s;}\n    }\n    return best;\n}\nvector<pair<int,int>>transport(){\n    bool h[D9][D9];memcpy(h,hasc,sizeof h);\n    vector<pair<int,int>>ord;ord.reserve(M);\n    for(int s=0;s<M;s++){\n        bool vis[D9][D9];memset(vis,0,sizeof vis);\n        queue<pair<int,int>>q;q.push({er,ec});vis[er][ec]=1;\n        int bn=INT_MAX,br=-1,bc=-1;\n        while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+dr[i],ny=y+dc[i];if(!in_(nx,ny)||vis[nx][ny]||obs[nx][ny])continue;vis[nx][ny]=1;if(h[nx][ny]){if(cnum[nx][ny]<bn){bn=cnum[nx][ny];br=nx;bc=ny;}}else q.push({nx,ny});}}\n        ord.emplace_back(br,bc);h[br][bc]=0;\n    }\n    return ord;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>D>>N;\n    memset(obs,0,sizeof obs);memset(hasc,0,sizeof hasc);memset(cnum,-1,sizeof cnum);\n    er=0;ec=(D-1)/2;\n    for(int i=0;i<N;i++){int r,c;cin>>r>>c;obs[r][c]=1;}\n    build_sigma();\n    for(int d=0;d<M;d++){\n        int t;cin>>t;\n        auto[r,c]=pick_place(t);\n        hasc[r][c]=1;cnum[r][c]=t;\n        cout<<r<<' '<<c<<'\\n';cout.flush();\n    }\n    auto ord=transport();\n    for(auto[r,c]:ord)cout<<r<<' '<<c<<'\\n';\n    cout.flush();\n}","ahc024":"#include <bits/stdc++.h>\nusing namespace std;\nusing namespace chrono;\nint n,m,g[50][50],og[50][50];\nbool adj[102][102];\nint ac[102][102],cc[102],dp[102];\nconst int dr[]={0,0,1,-1},dc[]={1,-1,0,0};\nauto t0=steady_clock::now();\nbool tok(){return duration_cast<milliseconds>(steady_clock::now()-t0).count()<1700;}\nint gc(int r,int c){return(r<0||r>=n||c<0||c>=n)?0:g[r][c];}\nvoid cajad(){memset(adj,0,sizeof(adj));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int c=g[i][j];for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=c)adj[c][nc]=adj[nc][c]=1;}}}\nvoid cdep(){fill(dp,dp+102,100);queue<int>q;for(int c=0;c<=m;c++)if(adj[c][0]){dp[c]=0;q.push(c);}dp[0]=0;while(!q.empty()){int u=q.front();q.pop();for(int v=1;v<=m;v++)if(adj[u][v]&&dp[v]>dp[u]+1){dp[v]=dp[u]+1;q.push(v);}}}\nvoid rcp(){memset(ac,0,sizeof(ac));memset(cc,0,sizeof(cc));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int c=g[i][j];cc[c]++;bool s[102]={};for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=c&&!s[nc]){ac[c][nc]++;s[nc]=1;}}}}\nbool cok(int r,int c,int col){if(cc[col]<=1)return 0;int sr=-1,sc=-1;for(int i=0;i<n&&sr<0;i++)for(int j=0;j<n;j++)if(g[i][j]==col&&!(i==r&&j==c)){sr=i;sc=j;break;}if(sr<0)return 0;bool v[50][50]={};queue<pair<int,int>>q;q.push({sr,sc});v[sr][sc]=1;int cnt=1;while(!q.empty()){auto[cr,cc2]=q.front();q.pop();for(int d=0;d<4;d++){int nr=cr+dr[d],nc=cc2+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==col&&!(nr==r&&nc==c)&&!v[nr][nc]){v[nr][nc]=1;cnt++;q.push({nr,nc});}}}return cnt==cc[col]-1;}\nbool ctr(int r,int c){int col=g[r][c];if(!col||!adj[col][0])return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&!adj[nc][0])return 0;}bool za=(r==0||r==n-1||c==0||c==n-1);if(!za)for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&!g[nr][nc]){za=1;break;}}if(!za)return 0;if(!cok(r,c,col))return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&ac[col][nc]<=1)return 0;}return 1;}\nvoid dtr(int r,int c){int col=g[r][c];bool s[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!s[nc]){ac[col][nc]--;s[nc]=1;}}g[r][c]=0;cc[col]--;cc[0]++;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;bool hz=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2<0||nr2>=n||nc2<0||nc2>=n){hz=1;break;}if(!g[nr2][nc2]){hz=1;break;}}if(!hz)ac[ncol][0]++;if(ncol==col)continue;bool s2=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){s2=1;break;}}if(!s2)ac[ncol][col]--;}}\nvoid gtrim(){bool ch=1;while(ch){ch=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(g[i][j]&&ctr(i,j)){dtr(i,j);ch=1;}}}\nvoid dra(int r,int c,int col,int c2){bool s1[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!s1[nc]){ac[col][nc]--;s1[nc]=1;}}g[r][c]=c2;cc[col]--;cc[c2]++;bool s2[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=c2&&!s2[nc]){ac[c2][nc]++;s2[nc]=1;}}for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;if(ncol!=col){bool st=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){st=1;break;}}if(!st)ac[ncol][col]--;}if(ncol!=c2){bool hd=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==c2){hd=1;break;}}if(!hd)ac[ncol][c2]++;}}}\nbool cra(int r,int c,int&co){int col=g[r][c];if(!col||adj[col][0])return 0;bool any=0;for(int d=0;d<4;d++){int c2=gc(r+dr[d],c+dc[d]);if(c2&&c2!=col&&dp[c2]<=dp[col]){any=1;break;}}if(!any)return 0;if(!cok(r,c,col))return 0;int best=-1,bd=dp[col]+1;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int c2=g[nr][nc];if(!c2||c2==col||dp[c2]>dp[col])continue;bool ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&!adj[c2][dc2]){ok=0;break;}}if(!ok)continue;ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&ac[col][dc2]<=1){ok=0;break;}}if(!ok)continue;if(dp[c2]<bd){best=c2;bd=dp[c2];}}if(best>=0){co=best;return 1;}return 0;}\nint czero(){int c=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)c+=!g[i][j];return c;}\nvoid run(const vector<int>&ord){rcp();gtrim();int pz=czero();while(tok()){rcp();for(int p=0;p<10;p++){bool a=0;for(int idx:ord){int i=idx/n,j=idx%n,col=g[i][j],co;if(cra(i,j,co)){dra(i,j,col,co);a=1;}}if(!a)break;}gtrim();int z=czero();if(z<=pz)break;pz=z;}}\nstatic int bg[50][50];int bz=-1;\nvoid sv(){int z=czero();if(z>bz){bz=z;memcpy(bg,g,sizeof(g));}}\nint main(){\n    t0=steady_clock::now();ios_base::sync_with_stdio(0);cin.tie(0);\n    cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<n;j++){cin>>g[i][j];og[i][j]=g[i][j];}\n    cajad();cdep();\n    vector<int>ord(n*n);iota(ord.begin(),ord.end(),0);\n    mt19937 rng(42);\n    for(int t=0;t==0||tok();t++){memcpy(g,og,sizeof(g));if(t>0)shuffle(ord.begin(),ord.end(),rng);run(ord);sv();}\n    for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j)cout<<' ';cout<<bg[i][j];}cout<<'\\n';}\n}","ahc025":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N, D, Q, q_used = 0;\n\nchar bq(const vector<int>& L, const vector<int>& R) {\n    cout << L.size() << \" \" << R.size();\n    for (int x : L) cout << \" \" << x;\n    for (int x : R) cout << \" \" << x;\n    cout << \"\\n\";\n    cout.flush();\n    q_used++;\n    char c; cin >> c; return c;\n}\n\nint slm;\nvector<int> ms(vector<int> a) {\n    if ((int)a.size() <= 1 || q_used >= slm) return a;\n    int m = a.size() / 2;\n    auto L = ms(vector<int>(a.begin(), a.begin() + m));\n    auto R = ms(vector<int>(a.begin() + m, a.end()));\n    vector<int> r; int i = 0, j = 0;\n    while (i < (int)L.size() && j < (int)R.size()) {\n        if (q_used >= slm) break;\n        if (bq({L[i]}, {R[j]}) != '>') r.push_back(L[i++]);\n        else r.push_back(R[j++]);\n    }\n    while (i < (int)L.size()) r.push_back(L[i++]);\n    while (j < (int)R.size()) r.push_back(R[j++]);\n    return r;\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n    cin >> N >> D >> Q;\n\n    auto t0 = chrono::high_resolution_clock::now();\n    auto el = [&]() {\n        return chrono::duration<double>(chrono::high_resolution_clock::now() - t0).count();\n    };\n\n    // Phase 1: Sort\n    slm = Q / 2;\n    vector<int> ini(N); iota(ini.begin(), ini.end(), 0);\n    vector<int> ord = ms(ini);\n\n    vector<int> pos(N);\n    for (int i = 0; i < N; i++) pos[ord[i]] = i;\n\n    // Phase 2: Weight estimation via binary search on prefix sums\n    int est_end = Q * 4 / 5;\n    vector<double> w(N, 1.0), ps(N + 1, 0.0);\n    w[ord[0]] = 1.0; ps[1] = 1.0;\n\n    for (int i = 1; i < N; i++) {\n        int lo = 0, hi = i;\n        while (lo < hi && q_used < est_end) {\n            int mid = (lo + hi) / 2;\n            if (bq({ord[i]}, vector<int>(ord.begin(), ord.begin() + mid + 1)) == '>')\n                lo = mid + 1;\n            else hi = mid;\n        }\n        double wlo = ps[lo];\n        double whi = (lo < i) ? ps[lo + 1] : ps[i] * 2.0;\n        w[ord[i]] = max(w[ord[i-1]], (wlo + whi) / 2.0);\n        ps[i+1] = ps[i] + w[ord[i]];\n    }\n\n    // Phase 3: LPT partition\n    vector<int> oi(N); iota(oi.begin(), oi.end(), 0);\n    sort(oi.begin(), oi.end(), [&](int a, int b) {\n        if (fabs(w[a]-w[b]) > 1e-12) return w[a] > w[b];\n        return pos[a] > pos[b];\n    });\n    vector<double> gw(D, 0.0);\n    vector<int> asgn(N, 0);\n    for (int x : oi) {\n        int g = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        asgn[x] = g; gw[g] += w[x];\n    }\n\n    // Phase 4: Local search with estimated weights\n    double total = 0; for (double x : gw) total += x;\n    double mean = total / D;\n\n    for (int p = 0; p < 5000 && el() < 1.5; p++) {\n        bool imp = false;\n        // Single moves\n        for (int x = 0; x < N; x++) {\n            int g0 = asgn[x]; int bg = g0; double bd = 0;\n            double d0 = gw[g0] - mean;\n            for (int g = 0; g < D; g++) {\n                if (g == g0) continue;\n                double d1 = gw[g] - mean;\n                double dc = d0*d0 + d1*d1 - (d0-w[x])*(d0-w[x]) - (d1+w[x])*(d1+w[x]);\n                if (dc > bd) { bd = dc; bg = g; }\n            }\n            if (bg != g0) { gw[g0] -= w[x]; gw[bg] += w[x]; asgn[x] = bg; imp = true; }\n        }\n        // Swaps\n        for (int i = 0; i < N && el() < 1.4; i++) {\n            for (int j = i+1; j < N; j++) {\n                if (asgn[i] == asgn[j]) continue;\n                int gi = asgn[i], gj = asgn[j];\n                double di = gw[gi]-mean, dj = gw[gj]-mean;\n                double di2 = di-w[i]+w[j], dj2 = dj+w[i]-w[j];\n                if (di*di + dj*dj > di2*di2 + dj2*dj2 + 1e-9) {\n                    gw[gi] += w[j]-w[i]; gw[gj] += w[i]-w[j];\n                    asgn[i] = gj; asgn[j] = gi; imp = true;\n                }\n            }\n        }\n        if (!imp) break;\n    }\n\n    // Phase 5: Actual balance improvement using remaining queries\n    vector<vector<int>> gi(D);\n    for (int x = 0; x < N; x++) gi[asgn[x]].push_back(x);\n    for (int g = 0; g < D; g++)\n        sort(gi[g].begin(), gi[g].end(), [&](int a, int b){ return pos[a] < pos[b]; });\n\n    while (q_used + 2 <= Q && el() < 1.9) {\n        int gh = (int)(max_element(gw.begin(), gw.end()) - gw.begin());\n        int gl = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        if (gw[gh] <= gw[gl] + 1e-9 || gi[gh].empty() || gi[gl].empty()) break;\n\n        char cmp = bq(gi[gh], gi[gl]);\n        if (cmp == '=') { gw[gh] = gw[gl] = (gw[gh]+gw[gl])/2; continue; }\n        if (cmp == '<') { swap(gh, gl); swap(gw[gh], gw[gl]); }\n\n        auto& hv = gi[gh]; auto& lt = gi[gl];\n        if ((int)hv.size() <= 1) continue;\n\n        int lo = 0, hi = (int)hv.size() - 1;\n        while (lo < hi && q_used + 1 <= Q && el() < 1.85) {\n            int mid = (lo + hi) / 2;\n            vector<int> L2, R2 = lt;\n            for (int k = 0; k < (int)hv.size(); k++) if (k != mid) L2.push_back(hv[k]);\n            R2.push_back(hv[mid]);\n            char r = bq(L2, R2);\n            if (r == '=') { lo = hi = mid; break; }\n            else if (r == '>') lo = mid + 1;\n            else hi = mid;\n        }\n        lo = min(lo, (int)hv.size() - 1);\n        if (lo > 0) {\n            double da = fabs((gw[gh]-w[hv[lo]]) - (gw[gl]+w[hv[lo]]));\n            double db = fabs((gw[gh]-w[hv[lo-1]]) - (gw[gl]+w[hv[lo-1]]));\n            if (db < da) lo--;\n        }\n\n        int mv = hv[lo];\n        asgn[mv] = gl;\n        gw[gh] -= w[mv]; gw[gl] += w[mv];\n        hv.erase(hv.begin() + lo);\n        lt.insert(lower_bound(lt.begin(), lt.end(), mv,\n            [&](int a, int b){ return pos[a] < pos[b]; }), mv);\n    }\n\n    while (q_used < Q) bq({0}, {1});\n\n    for (int i = 0; i < N; i++) cout << asgn[i] << \" \\n\"[i==N-1];\n    cout.flush();\n    return 0;\n}","ahc026":"#include <bits/stdc++.h>\nusing namespace std;\nint n, m;\nlong long run_algo(int mode, long long noise, vector<vector<int>> stacks, vector<int> stk, vector<int> pidx, vector<int> sm, vector<pair<int,int>>& ops, mt19937_64& rng) {\n    bool psfx = (mode <= 1), pat = (mode==1||mode==3);\n    ops.clear(); long long energy = 0;\n    auto recomp = [&](int t){ sm[t]=stacks[t].empty()?n+1:*min_element(stacks[t].begin(),stacks[t].end()); };\n    for (int v = 1; v <= n; v++) {\n        int s = stk[v], j = pidx[v];\n        while ((int)stacks[s].size() > j+1) {\n            int re=(int)stacks[s].size()-1, rs=re;\n            while (rs>j+1&&stacks[s][rs-1]>stacks[s][rs]) rs--;\n            int fu1=stacks[s][rs], ars=rs, bt=-1;\n            if (psfx) {\n                for (int sp=rs; sp<=re&&bt==-1; sp++) {\n                    int u1c=stacks[s][sp]; long long bs=LLONG_MIN; int bk=-1;\n                    for (int t=0;t<m;t++) { if(t==s)continue;\n                        long long tt=stacks[t].empty()?(n+1):(long long)stacks[t].back();\n                        long long mt=stacks[t].empty()?(n+1):(long long)sm[t];\n                        if(tt>u1c&&mt>u1c){ long long sc=(long long)n-tt; if(noise>0)sc+=(long long)(rng()%(2*noise+1))-noise; if(sc>bs){bs=sc;bk=t;} } }\n                    if(bk!=-1){ars=sp;bt=bk;}\n                }\n            }\n            if (bt==-1) {\n                long long best=LLONG_MIN;\n                for (int t=0;t<m;t++) { if(t==s)continue;\n                    bool emp=stacks[t].empty(); long long tt=emp?0:stacks[t].back(), mt=emp?(n+1):sm[t]; long long sc;\n                    if(!pat){ if(emp)sc=2LL*n*n; else if(tt>fu1)sc=(mt>fu1)?3LL*n*n+(n-tt):n*n+mt; else sc=mt-(long long)n*n; }\n                    else{ if(emp)sc=(long long)n; else if(tt>fu1)sc=2LL*n*n+(n-tt); else sc=tt-(long long)n*n; }\n                    if(noise>0)sc+=(long long)(rng()%(2*noise+1))-noise;\n                    if(sc>best){best=sc;bt=t;} }\n            }\n            energy+=(re-ars+1)+1; ops.push_back({stacks[s][ars],bt+1});\n            int nb=(int)stacks[bt].size(), oz=(int)stacks[s].size();\n            for(int p=ars;p<oz;p++){ int b=stacks[s][p]; stacks[bt].push_back(b); stk[b]=bt; pidx[b]=nb+(p-ars); sm[bt]=min(sm[bt],b); }\n            stacks[s].resize(ars); recomp(s);\n        }\n        ops.push_back({v,0}); stacks[s].pop_back(); recomp(s);\n    }\n    return energy;\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    cin>>n>>m; int h=n/m;\n    vector<vector<int>> is(m,vector<int>(h)); vector<int> ist(n+1),ip(n+1),ism(m,n+1);\n    for(int i=0;i<m;i++){ for(int j=0;j<h;j++){cin>>is[i][j];ist[is[i][j]]=i;ip[is[i][j]]=j;} ism[i]=*min_element(is[i].begin(),is[i].end()); }\n    long long be=LLONG_MAX; vector<pair<int,int>> bops; mt19937_64 rng(0);\n    for(int mode=0;mode<4;mode++){ mt19937_64 d(0); vector<pair<int,int>> ops; long long e=run_algo(mode,0,is,ist,ip,ism,ops,d); if(e<be){be=e;bops=ops;} }\n    for(int mode=0;mode<4;mode++){ for(int seed=0;seed<24;seed++){\n        rng.seed((uint64_t)(mode*1000+seed)*6364136223846793005ULL+1442695040888963407ULL);\n        vector<pair<int,int>> ops; long long e=run_algo(mode,2000,is,ist,ip,ism,ops,rng);\n        if(e<be){be=e;bops=ops;} } }\n    for(auto[v,i]:bops) cout<<v<<\" \"<<i<<\"\\n\";\n    return 0;\n}","ahc027":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=41,MAXC=1601,BUD=100000;\nint N,n;bool hw[MAXN][MAXN],vw[MAXN][MAXN];int dv[MAXN][MAXN];\nconst int DI[]={0,1,0,-1},DJ[]={1,0,-1,0};const char DC[]=\"RDLU\";\nint C(int i,int j){return i*N+j;}int RI(int c){return c/N;}int RJ(int c){return c%N;}\nbool OK(int i,int j,int d){int ni=i+DI[d],nj=j+DJ[d];if(ni<0||ni>=N||nj<0||nj>=N)return false;if(d==0)return !vw[i][j];if(d==1)return !hw[i][j];if(d==2)return !vw[i][nj];return !hw[ni][j];}\nshort AP[MAXC][MAXC];int AF[MAXC][MAXC];\nvoid bfs(int s){memset(AP[s],0xFF,n*sizeof(short));int fs[MAXC];AP[s][s]=0;fs[s]=s;static int q[MAXC];int h=0,tail=0;q[tail++]=s;while(h<tail){int u=q[h++];for(int d=0;d<4;d++)if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(AP[s][v]<0){AP[s][v]=AP[s][u]+1;fs[v]=(u==s)?v:fs[u];q[tail++]=v;}}}for(int i=0;i<n;i++)AF[s][i]=(i==s)?s:fs[i];}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N;n=N*N;\n    for(int i=0;i<N-1;i++){string s;cin>>s;for(int j=0;j<N;j++)hw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N-1;j++)vw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>dv[i][j];\n    for(int s=0;s<n;s++)bfs(s);\n    short D_home[MAXC];for(int c=0;c<n;c++)D_home[c]=AP[c][0];\n    string route;route.reserve(BUD+10);\n    vector<int> lv(n,0);int pos=0,t=0;\n    {vector<bool> vis(n,false);vis[0]=true;vector<pair<int,int>> stk;stk.reserve(n);stk.push_back({0,0});\n    while(!stk.empty()){int u=stk.back().first;int& nd=stk.back().second;bool found=false;\n    while(nd<4){int d=nd++;if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(!vis[v]){route+=DC[d];t++;pos=v;lv[v]=t;vis[v]=true;stk.push_back({v,0});found=true;break;}}}\n    if(!found){stk.pop_back();if(!stk.empty()){int par=stk.back().first;for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==par){route+=DC[d];t++;pos=par;lv[par]=t;break;}}}}}\n    for(int c=0;c<n;c++)lv[c]=t;\n    float sqd[MAXC];for(int c=0;c<n;c++)sqd[c]=sqrtf((float)dv[RI(c)][RJ(c)]);\n    int committed=-1;\n    while(t+(int)D_home[pos]+2<=BUD){\n        bool rrt=(committed<0)||(pos==committed);\n        if(!rrt&&t+(int)AP[pos][committed]+(int)D_home[committed]+2>BUD)rrt=true;\n        if(rrt){const short* Ap=AP[pos];int best=-1;float bu=0.0f;\n            for(int c=0;c<n;c++){if(c==pos)continue;int dc=(int)Ap[c];if(t+dc+(int)D_home[c]+2>BUD)continue;\n                float u=sqd[c]*(float)(t-lv[c]+1)/(float)(dc+1);if(u>bu){bu=u;best=c;}}\n            committed=best;if(committed<0)break;}\n        int nx=AF[pos][committed];bool moved=false;\n        for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;lv[pos]=t;moved=true;break;}\n        if(!moved)break;}\n    while(pos!=0){int nx=AF[pos][0];for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;break;}}\n    cout<<route<<\"\\n\";return 0;}","ahc028":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,si,sj;\nvector<string> targets;\nvector<pair<int,int>> charPos[26];\nint ovM[200][200];\nfloat amd[26][26],tC[200][200];\nvoid computeOvMatrix(){for(int i=0;i<M;i++)for(int j=0;j<M;j++){if(i==j){ovM[i][j]=0;continue;}ovM[i][j]=0;for(int k=4;k>=1;k--){bool ok=true;for(int l=0;l<k&&ok;l++)if(targets[i][5-k+l]!=targets[j][l])ok=false;if(ok){ovM[i][j]=k;break;}}}}\nvoid computeAMD(){for(int c1=0;c1<26;c1++)for(int c2=0;c2<26;c2++){if(charPos[c1].empty()){amd[c1][c2]=0;continue;}float tot=0;for(auto&[r1,cc1]:charPos[c1]){int md=28;for(auto&[r2,cc2]:charPos[c2])md=min(md,abs(r1-r2)+abs(cc1-cc2));tot+=md;}amd[c1][c2]=tot/charPos[c1].size();}}\nvoid computeTC(){for(int i=0;i<M;i++)for(int j=0;j<M;j++){int ov=ovM[i][j],prev=targets[i][4]-'A';float cost=0;for(int k=ov;k<5;k++){int next=targets[j][k]-'A';cost+=amd[prev][next]+1;prev=next;}tC[i][j]=cost;}}\nvector<int> greedyPerm(int start){vector<bool> used(M,false);vector<int> perm;perm.reserve(M);perm.push_back(start);used[start]=true;while((int)perm.size()<M){int last=perm.back(),best=-1,bov=-1;float btc=1e18f;for(int j=0;j<M;j++)if(!used[j]){int ov=ovM[last][j];float tc=tC[last][j];if(ov>bov||(ov==bov&&tc<btc)){bov=ov;btc=tc;best=j;}}perm.push_back(best);used[best]=true;}return perm;}\nvector<int> greedyPermTC(int start){vector<bool> used(M,false);vector<int> perm;perm.reserve(M);perm.push_back(start);used[start]=true;while((int)perm.size()<M){int last=perm.back(),best=-1;float btc=1e18f;for(int j=0;j<M;j++)if(!used[j]&&tC[last][j]<btc){btc=tC[last][j];best=j;}perm.push_back(best);used[best]=true;}return perm;}\nint permOv(const vector<int>&p){int s=0;for(int i=1;i<(int)p.size();i++)s+=ovM[p[i-1]][p[i]];return s;}\nfloat totalTCf(const vector<int>&p){float s=0;for(int i=1;i<(int)p.size();i++)s+=tC[p[i-1]][p[i]];return s;}\nfloat combineScore(const vector<int>&p){return permOv(p)*2.0f-totalTCf(p);}\nint swapGain(const vector<int>&perm,int i,int j){int m=perm.size(),a=perm[i],b=perm[j],og=0,ng=0;if(i>0){og+=ovM[perm[i-1]][a];ng+=ovM[perm[i-1]][b];}if(j<m-1){og+=ovM[b][perm[j+1]];ng+=ovM[a][perm[j+1]];}if(j==i+1){og+=ovM[a][b];ng+=ovM[b][a];}else{if(i<m-1){og+=ovM[a][perm[i+1]];ng+=ovM[b][perm[i+1]];}if(j>0){og+=ovM[perm[j-1]][b];ng+=ovM[perm[j-1]][a];}}return ng-og;}\nfloat swapDeltaTC(const vector<int>&perm,int i,int j){int m=perm.size();int a=perm[i],b=perm[j];float oc=0,nc=0;if(i>0){oc+=tC[perm[i-1]][a];nc+=tC[perm[i-1]][b];}if(j<m-1){oc+=tC[b][perm[j+1]];nc+=tC[a][perm[j+1]];}if(j==i+1){oc+=tC[a][b];nc+=tC[b][a];}else{if(i<m-1){oc+=tC[a][perm[i+1]];nc+=tC[b][perm[i+1]];}if(j>0){oc+=tC[perm[j-1]][b];nc+=tC[perm[j-1]][a];}}return nc-oc;}\nfloat combinedGain(const vector<int>&perm,int i,int j){return swapGain(perm,i,j)*2.0f-swapDeltaTC(perm,i,j);}\nbool swapOpt(vector<int>&perm){int m=perm.size(),bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=swapGain(perm,i,j);if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;swap(perm[bi],perm[bj]);return true;}\nbool orOpt(vector<int>&perm){int m=perm.size(),bg=0,bk=-1,bp=-1;for(int k=0;k<m;k++){int e=perm[k];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=k)rest.push_back(perm[i]);int lo=(k>0)?ovM[perm[k-1]][e]:0,ro=(k<m-1)?ovM[e][perm[k+1]]:0,bov=(k>0&&k<m-1)?ovM[perm[k-1]][perm[k+1]]:0,rc=lo+ro-bov;for(int p=0;p<=(int)rest.size();p++){int nl=(p>0)?ovM[rest[p-1]][e]:0,nr=(p<(int)rest.size())?ovM[e][rest[p]]:0,nb=(p>0&&p<(int)rest.size())?ovM[rest[p-1]][rest[p]]:0,g=nl+nr-nb-rc;if(g>bg){bg=g;bk=k;bp=p;}}}if(bk==-1)return false;int e=perm[bk];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=bk)rest.push_back(perm[i]);rest.insert(rest.begin()+bp,e);perm=rest;return true;}\nbool reverseOpt(vector<int>&perm){int m=perm.size();if(m<2)return false;vector<int> diff(m-1),pref(m,0);for(int k=0;k<m-1;k++)diff[k]=ovM[perm[k+1]][perm[k]]-ovM[perm[k]][perm[k+1]];for(int k=0;k<m-1;k++)pref[k+1]=pref[k]+diff[k];int bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=pref[j]-pref[i];if(i>0)g+=ovM[perm[i-1]][perm[j]]-ovM[perm[i-1]][perm[i]];if(j<m-1)g+=ovM[perm[i]][perm[j+1]]-ovM[perm[j]][perm[j+1]];if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;reverse(perm.begin()+bi,perm.begin()+bj+1);return true;}\nvoid localSearch(vector<int>&perm,int maxP=500){bool imp=true;int pass=0;while(imp&&pass<maxP){imp=false;pass++;if(swapOpt(perm))imp=true;if(orOpt(perm))imp=true;if(reverseOpt(perm))imp=true;}}\nstring buildString(const vector<int>&perm){string s=targets[perm[0]];for(int i=1;i<(int)perm.size();i++)s+=targets[perm[i]].substr(ovM[perm[i-1]][perm[i]]);return s;}\nvector<pair<int,int>> findPath(const string&s){int L=s.size(),G=N*N;const int INF=1e9;vector<int> dp((L+1)*G,INF),prv((L+1)*G,-1);dp[si*N+sj]=0;for(int i=0;i<L;i++){int c=s[i]-'A',base=i*G,nb=(i+1)*G;for(int p=0;p<G;p++){int val=dp[base+p];if(val==INF)continue;int r=p/N,cc=p%N;for(auto&[nr,nc]:charPos[c]){int np=nr*N+nc,cost=val+abs(r-nr)+abs(cc-nc)+1;if(cost<dp[nb+np]){dp[nb+np]=cost;prv[nb+np]=p;}}}}int bc=INF,bp=-1,lb=L*G;for(int p=0;p<G;p++)if(dp[lb+p]<bc){bc=dp[lb+p];bp=p;}vector<pair<int,int>> path(L);int pos=bp;for(int i=L;i>=1;i--){path[i-1]={pos/N,pos%N};pos=prv[i*G+pos];}return path;}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    auto t0=chrono::steady_clock::now();\n    auto ms_el=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    cin>>N>>M>>si>>sj;\n    for(int i=0;i<N;i++){string row;cin>>row;for(int j=0;j<N;j++)charPos[row[j]-'A'].push_back({i,j});}\n    targets.resize(M);for(int i=0;i<M;i++)cin>>targets[i];\n    computeOvMatrix();computeAMD();computeTC();\n    vector<int> best;float bestScore=-1e18f;\n    for(int s=0;s<M;s++){auto p=greedyPerm(s);float sc=combineScore(p);if(sc>bestScore){bestScore=sc;best=p;}}\n    for(int s=0;s<M;s++){auto p=greedyPermTC(s);float sc=combineScore(p);if(sc>bestScore){bestScore=sc;best=p;}}\n    localSearch(best);bestScore=combineScore(best);\n    {\n        mt19937 rng(42);uniform_real_distribution<double> ud(0.0,1.0);\n        vector<int> cur=best;float curScore=bestScore;double T=1.5;\n        for(long long it=0;;it++){\n            if(it%50000==0&&ms_el()>=1700)break;\n            T=max(0.05,T*0.9999998);\n            int i=rng()%M,j=rng()%M;if(i==j)continue;if(i>j)swap(i,j);\n            float cg=combinedGain(cur,i,j);\n            if(cg>0||ud(rng)<exp((double)cg/T)){swap(cur[i],cur[j]);curScore+=cg;if(curScore>bestScore){bestScore=curScore;best=cur;}}\n            if(it%1000000==999999)curScore=combineScore(cur);\n        }\n    }\n    if(ms_el()<1800)localSearch(best,200);\n    string ss=buildString(best);\n    auto path=findPath(ss);\n    for(auto&[r,c]:path)cout<<r<<\" \"<<c<<\"\\n\";\n    return 0;\n}","ahc030":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,MAX_OPS;double eps,coef;int ops=0;\nstruct Field{int d,hi,hj;vector<pair<int,int>>cells;vector<int>rp,cp;vector<pair<int,int>>pos;};\nvector<Field>F;vector<vector<int>>drld;vector<vector<double>>prob,ell;\nvector<double>robs,cobs;int nrr=0,nrc=0;\ndouble qdiv(const vector<pair<int,int>>&c){ops++;cout<<\"q \"<<c.size();for(auto[i,j]:c)cout<<' '<<i<<' '<<j;cout<<'\\n';cout.flush();int v;cin>>v;return v;}\nint qdrl(int i,int j){ops++;cout<<\"q 1 \"<<i<<' '<<j<<'\\n';cout.flush();int v;cin>>v;drld[i][j]=v;return v;}\nbool qans(const vector<pair<int,int>>&o){ops++;cout<<\"a \"<<o.size();for(auto[i,j]:o)cout<<' '<<i<<' '<<j;cout<<'\\n';cout.flush();int r;cin>>r;return r==1;}\nvoid do_row_col(int reps){for(int rep=0;rep<reps;rep++){for(int i=0;i<N;i++){vector<pair<int,int>>c;for(int j=0;j<N;j++)c.push_back({i,j});robs[i]+=qdiv(c);}nrr++;for(int j=0;j<N;j++){vector<pair<int,int>>c;for(int i=0;i<N;i++)c.push_back({i,j});cobs[j]+=qdiv(c);}nrc++;}}\nvoid run_mf(int nit){\n  if(!nrr&&!nrc)return;\n  double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n  vector<double>tmr(N,0),tmc(N,0);\n  for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)tmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)tmc[dj+c]+=pp*F[k].cp[c];}}\n  for(int it=0;it<nit;it++)for(int k=0;k<M;k++){\n    int np=(int)F[k].pos.size();\n    vector<double>kmr(N,0),kmc(N,0);\n    for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)kmc[dj+c]+=pp*F[k].cp[c];}\n    for(int i=0;i<N;i++)tmr[i]-=kmr[i];for(int j=0;j<N;j++)tmc[j]-=kmc[j];\n    vector<vector<double>>drow(N,vector<double>(F[k].hi+1)),dcol(N,vector<double>(F[k].hj+1));\n    for(int i=0;i<N;i++){double be=nrr*(N*eps+tmr[i]*coef),bd=robs[i]-be;for(int r=0;r<=F[k].hi;r++){double e=nrr*(N*eps+(F[k].rp[r]+tmr[i])*coef),d=robs[i]-e;drow[i][r]=(-d*d+bd*bd)/(2*vr);}}\n    for(int j=0;j<N;j++){double be=nrc*(N*eps+tmc[j]*coef),bd=cobs[j]-be;for(int c=0;c<=F[k].hj;c++){double e=nrc*(N*eps+(F[k].cp[c]+tmc[j])*coef),d=cobs[j]-e;dcol[j][c]=(-d*d+bd*bd)/(2*vc);}}\n    vector<double>ll(np,-1e300);double mx=-1e300;\n    for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];double lp=ell[k][p];for(int r=0;r<=F[k].hi;r++)lp+=drow[di+r][r];for(int c=0;c<=F[k].hj;c++)lp+=dcol[dj+c][c];ll[p]=lp;mx=max(mx,lp);}\n    double s=0;for(int p=0;p<np;p++){prob[k][p]=(ll[p]>-1e250)?exp(ll[p]-mx):0.0;s+=prob[k][p];}\n    if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;\n    fill(kmr.begin(),kmr.end(),0);fill(kmc.begin(),kmc.end(),0);\n    for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;auto[di,dj]=F[k].pos[p];for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c=0;c<=F[k].hj;c++)kmc[dj+c]+=pp*F[k].cp[c];}\n    for(int i=0;i<N;i++)tmr[i]+=kmr[i];for(int j=0;j<N;j++)tmc[j]+=kmc[j];\n  }\n}\nvoid apply_constraints(){\n  for(int k=0;k<M;k++){int np=(int)F[k].pos.size();bool ch=false;\n    for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells){if(drld[di+ci][dj+cj]==0){ell[k][p]=-1e30;prob[k][p]=0;ch=true;break;}}}\n    if(ch){double s=0;for(double pp:prob[k])s+=pp;\n      if(s>1e-15){for(auto&pp:prob[k])pp/=s;}\n      else{int cnt=0;for(int p=0;p<np;p++)if(ell[k][p]>-1e29)cnt++;\n        for(int p=0;p<np;p++)prob[k][p]=(ell[k][p]>-1e29&&cnt>0)?1.0/cnt:0;\n        if(cnt==0){fill(ell[k].begin(),ell[k].end(),0);fill(prob[k].begin(),prob[k].end(),1.0/np);}}}\n  }\n}\ndouble field_entropy(int k){double H=0;for(double p:prob[k])if(p>1e-12)H-=p*log(p);return H;}\nvoid do_shape_query(int k){\n  if(ops>=MAX_OPS-5)return;int np=(int)F[k].pos.size();\n  int p1=-1,p2=-1;for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;if(p1<0||prob[k][p]>prob[k][p1]){p2=p1;p1=p;}else if(p2<0||prob[k][p]>prob[k][p2])p2=p;}\n  if(p1<0||prob[k][p1]>0.98)return;\n  auto[di1,dj1]=F[k].pos[p1];\n  vector<pair<int,int>>S;\n  if(p2>=0){auto[di2,dj2]=F[k].pos[p2];set<pair<int,int>>c2;for(auto[ci,cj]:F[k].cells)c2.insert({di2+ci,dj2+cj});for(auto[ci,cj]:F[k].cells){pair<int,int>c={di1+ci,dj1+cj};if(!c2.count(c))S.push_back(c);}if((int)S.size()<2){S.clear();for(auto[ci,cj]:F[k].cells)S.push_back({di1+ci,dj1+cj});}}\n  else{for(auto[ci,cj]:F[k].cells)S.push_back({di1+ci,dj1+cj});}\n  if((int)S.size()<2)return;\n  vector<bool>Smap(N*N,false);for(auto[i,j]:S)Smap[i*N+j]=true;\n  vector<int>ovl(np,0);for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells)if(Smap[(di+ci)*N+(dj+cj)])ovl[p]++;}\n  double omega=0;for(int m=0;m<M;m++){if(m==k)continue;for(int p=0;p<(int)F[m].pos.size();p++){double pp=prob[m][p];if(pp<1e-12)continue;auto[di,dj]=F[m].pos[p];for(auto[ci,cj]:F[m].cells)if(Smap[(di+ci)*N+(dj+cj)])omega+=pp;}}\n  double y=qdiv(S),sz=(double)S.size(),varq=max(1e-9,sz*eps*(1-eps));\n  double newmax=-1e300;\n  for(int p=0;p<np;p++){if(ell[k][p]<-1e29)continue;double mu=sz*eps+((double)ovl[p]+omega)*coef,d=y-mu;ell[k][p]-=d*d/(2*varq);newmax=max(newmax,ell[k][p]);}\n  if(newmax>-1e29)for(int p=0;p<np;p++)if(ell[k][p]>-1e29)ell[k][p]-=newmax;\n}\nvector<vector<double>>get_oil_prob(){\n  vector<vector<double>>noc(N,vector<double>(N,1.0));\n  for(int k=0;k<M;k++){vector<vector<double>>cvk(N,vector<double>(N,0));for(int p=0;p<(int)F[k].pos.size();p++){double pp=prob[k][p];if(pp<1e-12)continue;auto[di,dj]=F[k].pos[p];for(auto[ci,cj]:F[k].cells)cvk[di+ci][dj+cj]+=pp;}for(int i=0;i<N;i++)for(int j=0;j<N;j++)noc[i][j]*=max(0.0,1.0-cvk[i][j]);}\n  vector<vector<double>>op(N,vector<double>(N));for(int i=0;i<N;i++)for(int j=0;j<N;j++)op[i][j]=1.0-noc[i][j];return op;\n}\nvector<pair<int,int>>make_guess(const vector<vector<double>>&op,double thr=0.5){\n  vector<pair<int,int>>res;for(int i=0;i<N;i++)for(int j=0;j<N;j++){bool oil=(drld[i][j]>0)||(drld[i][j]<0&&op[i][j]>thr);if(oil)res.push_back({i,j});}return res;\n}\nint main(){\n  ios_base::sync_with_stdio(false);cin.tie(NULL);\n  cin>>N>>M>>eps;MAX_OPS=2*N*N;coef=1.0-2.0*eps;\n  drld.assign(N,vector<int>(N,-1));robs.assign(N,0.0);cobs.assign(N,0.0);\n  F.resize(M);\n  for(int k=0;k<M;k++){cin>>F[k].d;F[k].cells.resize(F[k].d);F[k].hi=F[k].hj=0;\n    for(int t=0;t<F[k].d;t++){cin>>F[k].cells[t].first>>F[k].cells[t].second;F[k].hi=max(F[k].hi,F[k].cells[t].first);F[k].hj=max(F[k].hj,F[k].cells[t].second);}\n    F[k].rp.assign(F[k].hi+1,0);F[k].cp.assign(F[k].hj+1,0);for(auto[ci,cj]:F[k].cells){F[k].rp[ci]++;F[k].cp[cj]++;}\n    for(int di=0;di+F[k].hi<N;di++)for(int dj=0;dj+F[k].hj<N;dj++)F[k].pos.push_back({di,dj});}\n  prob.resize(M);ell.resize(M);\n  for(int k=0;k<M;k++){int sz=(int)F[k].pos.size();prob[k].assign(sz,1.0/sz);ell[k].assign(sz,0.0);}\n  int n_reps=(eps>=0.15)?3:(eps>=0.08)?2:1;\n  do_row_col(n_reps);\n  run_mf(200);\n  {int qb=min(60,MAX_OPS-ops-20);\n   for(int q=0;q<qb&&ops<MAX_OPS-15;q++){\n     int bk=0;double be=field_entropy(0);for(int k=1;k<M;k++){double h=field_entropy(k);if(h>be){be=h;bk=k;}}\n     if(be<0.1)break;do_shape_query(bk);run_mf(15);}}\n  apply_constraints();run_mf(100);\n  while(ops<MAX_OPS-1){\n    auto op=get_oil_prob();auto g=make_guess(op);if(qans(g))return 0;\n    int bi=-1,bj=-1;double bunc=0;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(drld[i][j]>=0)continue;double pu=min(op[i][j],1.0-op[i][j]);if(pu>bunc){bunc=pu;bi=i;bj=j;}}\n    if(bunc<0.05||bi<0){for(int i=0;i<N&&ops<MAX_OPS-2;i++)for(int j=0;j<N&&ops<MAX_OPS-2;j++)if(drld[i][j]<0&&op[i][j]>0.05&&op[i][j]<0.95)qdrl(i,j);break;}\n    qdrl(bi,bj);apply_constraints();run_mf(20);}\n  {auto op=get_oil_prob();auto g=make_guess(op);if(ops<MAX_OPS)qans(g);}\n  return 0;\n}","ahc031":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef tuple<ll,int,int> T3;\nint W,D,N;\nvector<vector<int>>a;\nstruct CS{\nint s0,st,nc,cw;\nint r(int d,int k)const{return a[d][s0+k*st];}\nvector<int>ch(const vector<int>&days)const{\n    vector<int>h(nc,1);\n    auto be=[&](int k,int cur)->ll{ll b=0;for(int d:days){int df=r(d,k)-cur*cw;if(df>0)b+=(ll)min(cw,df);}return b;};\n    priority_queue<T3>pq;\n    for(int k=0;k<nc;k++){ll b=be(k,1);if(b>0)pq.push({b,k,1});}\n    for(int rem=W-nc;rem>0&&!pq.empty();){auto[b,kk,cu]=pq.top();pq.pop();if(b<=0)break;h[kk]++;rem--;ll nb=be(kk,h[kk]);if(nb>0)pq.push({nb,kk,h[kk]});}\n    sort(h.begin(),h.end());return h;\n}\nll ac(int d,const vector<int>&h)const{ll c=0;for(int k=0;k<nc;k++){int df=r(d,k)-h[k]*cw;if(df>0)c+=(ll)df*100;}return c;}\nset<int>gb(const vector<int>&arr)const{set<int>S;int y=0;for(int i=0;i+1<(int)arr.size();i++){y+=arr[i];S.insert(y);}return S;}\nll bd(const set<int>&A,const set<int>&B)const{ll c=0;for(int x:A)if(!B.count(x))c++;for(int x:B)if(!A.count(x))c++;return c*(ll)cw;}\nvector<int>ag(const vector<int>&h,const set<int>&t)const{\n    vector<int>tg(t.begin(),t.end());multiset<int>av(h.begin(),h.end());\n    vector<int>arr;int S=0,j=0,nt=(int)tg.size();\n    while(!av.empty()){while(j<nt&&S>=tg[j])j++;if(j>=nt){for(int x:av)arr.push_back(x);break;}\n        int nd=tg[j]-S;auto it=av.find(nd);\n        if(it!=av.end()){arr.push_back(nd);S+=nd;av.erase(it);j++;}\n        else{auto ub=av.upper_bound(nd);\n            if(ub!=av.begin()){--ub;arr.push_back(*ub);S+=*ub;av.erase(ub);while(j<nt&&S>=tg[j])j++;}\n            else{it=av.begin();arr.push_back(*it);S+=*it;av.erase(it);while(j<nt&&S>=tg[j])j++;}\n        }\n    }return arr;\n}\nvector<int>hc(vector<int>arr,const set<int>&t)const{\n    if(t.empty()||(int)arr.size()<=1)return arr;\n    int n2=arr.size();vector<int>ps(n2+1,0);for(int i=0;i<n2;i++)ps[i+1]=ps[i]+arr[i];\n    bool im=true;\n    while(im){im=false;for(int i=0;i<n2-1;i++)for(int j=i+1;j<n2;j++){\n        if(arr[i]==arr[j])continue;int dl=arr[j]-arr[i],g=0;\n        for(int k=i+1;k<=j;k++){g-=(int)t.count(ps[k]);g+=(int)t.count(ps[k]+dl);}\n        if(g>0){swap(arr[i],arr[j]);for(int k=i+1;k<=j;k++)ps[k]+=dl;im=true;}\n    }}return arr;\n}\npair<ll,vector<vector<int>>>solve()const{\n    vector<vector<int>>C;vector<int>ai(D);iota(ai.begin(),ai.end(),0);\n    C.push_back(ch(ai));\n    for(int d=0;d<D;d++)C.push_back(ch({d}));\n    for(int d=0;d+1<D;d++)C.push_back(ch({d,d+1}));\n    for(int d=0;d+2<D;d++)C.push_back(ch({d,d+1,d+2}));\n    int NC=(int)C.size();\n    vector<set<int>>SS(NC);for(int L=0;L<NC;L++)SS[L]=gb(C[L]);\n    vector<vector<ll>>AR(D,vector<ll>(NC));\n    for(int d=0;d<D;d++)for(int L=0;L<NC;L++)AR[d][L]=ac(d,C[L]);\n    vector<vector<ll>>pcg(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++){if(L1==L2)continue;pcg[L1][L2]=bd(SS[L1],gb(ag(C[L2],SS[L1])));}\n    const ll INF=2e18;\n    vector<vector<ll>>dp(D,vector<ll>(NC,INF));vector<vector<int>>frm(D,vector<int>(NC,-1));\n    for(int L=0;L<NC;L++)dp[0][L]=AR[0][L];\n    for(int d=1;d<D;d++)for(int L=0;L<NC;L++)for(int pL=0;pL<NC;pL++){\n        if(dp[d-1][pL]==INF)continue;ll cv=dp[d-1][pL]+pcg[pL][L]+AR[d][L];\n        if(cv<dp[d][L]){dp[d][L]=cv;frm[d][L]=pL;}}\n    int bL=(int)(min_element(dp[D-1].begin(),dp[D-1].end())-dp[D-1].begin());\n    vector<int>dpseq(D);dpseq[D-1]=bL;for(int d=D-2;d>=0;d--)dpseq[d]=frm[d+1][dpseq[d+1]];\n    auto dls=[&](vector<int>s)->vector<int>{\n        vector<set<int>>Sv(D);vector<ll>dc(D,0);\n        auto rb=[&](int from){for(int d=from;d<D;d++){set<int>pv=(d>0)?Sv[d-1]:set<int>();\n            if(d>0&&s[d]==s[d-1]){Sv[d]=Sv[d-1];dc[d]=AR[d][s[d]];}\n            else{auto a2=ag(C[s[d]],pv);Sv[d]=gb(a2);dc[d]=AR[d][s[d]]+(d>0?bd(pv,Sv[d]):0LL);}}};\n        rb(0);\n        for(int it=0;it<15;it++){bool any=false;\n            for(int d=0;d<D;d++){int bL2=s[d];ll bDl=0;ll od=dc[d],od1=(d+1<D?dc[d+1]:0LL);\n                for(int L=0;L<NC;L++){if(L==s[d])continue;\n                    set<int>pv=(d>0)?Sv[d-1]:set<int>();auto na=ag(C[L],pv);auto nSd=gb(na);\n                    ll nd2=AR[d][L]+(d>0?bd(pv,nSd):0LL);ll nd21=0;\n                    if(d+1<D){nd21=AR[d+1][s[d+1]];if(s[d+1]!=L)nd21+=bd(nSd,gb(ag(C[s[d+1]],nSd)));}\n                    ll dl=(nd2+nd21)-(od+od1);if(dl<bDl){bDl=dl;bL2=L;}}\n                if(bL2!=s[d]){s[d]=bL2;rb(d);any=true;}}\n            if(!any)break;}\n        return s;\n    };\n    auto fs=[&](const vector<int>&s)->pair<ll,vector<vector<int>>>{\n        vector<vector<int>>arrs(D);ll cost=0;\n        arrs[0]=C[s[0]];cost+=AR[0][s[0]];set<int>cur=gb(arrs[0]);\n        for(int d=1;d<D;d++){if(s[d]==s[d-1]){arrs[d]=arrs[d-1];cost+=AR[d][s[d]];}\n            else{arrs[d]=hc(ag(C[s[d]],cur),cur);set<int>ns=gb(arrs[d]);cost+=AR[d][s[d]]+bd(cur,ns);cur=ns;}}\n        return{cost,arrs};\n    };\n    auto[c1,a1]=fs(dls(dpseq));\n    vector<int>gseq(D);{\n        vector<set<int>>Sv(D);int L0=0;for(int L=0;L<NC;L++)if(AR[0][L]<AR[0][L0])L0=L;\n        gseq[0]=L0;Sv[0]=gb(C[gseq[0]]);\n        for(int d=1;d<D;d++){ll bc=INF;int bL2=gseq[d-1];\n            for(int L=0;L<NC;L++){ll cv=AR[d][L];if(L!=gseq[d-1])cv+=bd(Sv[d-1],gb(ag(C[L],Sv[d-1])));if(cv<bc){bc=cv;bL2=L;}}\n            gseq[d]=bL2;Sv[d]=(bL2==gseq[d-1])?Sv[d-1]:gb(ag(C[bL2],Sv[d-1]));}}\n    auto[c2,a2]=fs(dls(gseq));\n    vector<int>apseq(D);for(int d=0;d<D;d++)apseq[d]=d+1;\n    auto[c3,a3]=fs(dls(apseq));\n    ll bc2=min({c1,c2,c3});\n    if(bc2==c1)return{c1,a1};else if(bc2==c2)return{c2,a2};else return{c3,a3};\n}\n};\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>W>>D>>N;a.resize(D,vector<int>(N));\n    for(int d=0;d<D;d++)for(int k=0;k<N;k++)cin>>a[d][k];\n    ll best=2e18;int bK=1;\n    vector<pair<ll,vector<vector<int>>>>bcr;\n    for(int K=1;K<=N&&K<=10;K++){\n        if(N%K!=0||W%K!=0)continue;\n        int npc=N/K,cw=W/K;\n        vector<pair<ll,vector<vector<int>>>>cr(K);ll tc=0;\n        for(int c=0;c<K;c++){CS cs{c,K,npc,cw};cr[c]=cs.solve();tc+=cr[c].first;}\n        if(tc<best){best=tc;bK=K;bcr=cr;}\n    }\n    int npc=N/bK,cw=W/bK;\n    for(int d=0;d<D;d++){\n        vector<array<int,4>>rects(N);\n        for(int c=0;c<bK;c++){int x0=c*cw,x1=x0+cw;const auto&arr=bcr[c].second[d];\n            vector<int>y(npc+1);y[0]=0;for(int j=0;j<npc;j++)y[j+1]=y[j]+arr[j];\n            vector<pair<int,int>>strips(npc);for(int j=0;j<npc;j++)strips[j]={arr[j],y[j]};\n            sort(strips.begin(),strips.end());\n            for(int j=0;j<npc;j++){int k=c+j*bK;rects[k]={strips[j].second,x0,strips[j].second+strips[j].first,x1};}\n        }\n        for(int k=0;k<N;k++)cout<<rects[k][0]<<\" \"<<rects[k][1]<<\" \"<<rects[k][2]<<\" \"<<rects[k][3]<<\"\\n\";\n    }\n    return 0;\n}","ahc032":"#include <bits/stdc++.h>\nusing namespace std;\nusing namespace chrono;\nconstexpr long long MOD=998244353;\nint N,M,K;long long sv[20][3][3],b[9][9],cur_score;\ninline long long add_mod(long long a,long long c){long long s=a+c;return s>=MOD?s-MOD:s;}\ninline long long sub_mod(long long a,long long c){return a>=c?a-c:a-c+MOD;}\nvoid apply_s(int m,int p,int q){for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long&c=b[p+i][q+j];long long nv=add_mod(c,sv[m][i][j]);cur_score+=nv-c;c=nv;}}\nvoid undo_s(int m,int p,int q){for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long&c=b[p+i][q+j];long long nv=sub_mod(c,sv[m][i][j]);cur_score+=nv-c;c=nv;}}\nstruct Op{int m,p,q;};\nconst int TK=15;\nlong long gdtv[3][3],gdts,gdtbest;int gdbs[9],gdcs[9],gdord[20],gdfl;bool gdto;steady_clock::time_point gddl;\nvoid tile_dfs(int dep,int mi){\n    if(gdto)return;\n    if(dep==9){if(++gdfl%200000==0&&steady_clock::now()>=gddl){gdto=true;return;}if(gdts>gdtbest){gdtbest=gdts;for(int d=0;d<9;d++)gdbs[d]=gdord[gdcs[d]];}return;}\n    long long ub=gdts;for(int i=0;i<3;i++)for(int j=0;j<3;j++)ub+=(MOD-1)-gdtv[i][j];if(ub<=gdtbest)return;\n    for(int idx=mi;idx<TK;idx++){int m=gdord[idx];gdcs[dep]=idx;\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(gdtv[i][j],sv[m][i][j]);gdts+=nv-gdtv[i][j];gdtv[i][j]=nv;}\n        tile_dfs(dep+1,idx);\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=sub_mod(gdtv[i][j],sv[m][i][j]);gdts+=nv-gdtv[i][j];gdtv[i][j]=nv;}\n        if(gdto)return;}\n}\nlong long compute_tile(int s[9],long long itv[3][3]){long long ts=0;long long tv[3][3];for(int i=0;i<3;i++)for(int j=0;j<3;j++){tv[i][j]=itv[i][j];ts+=itv[i][j];}for(int d=0;d<9;d++)for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(tv[i][j],sv[s[d]][i][j]);ts+=nv-tv[i][j];tv[i][j]=nv;}return ts;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N>>M>>K;cur_score=0;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){cin>>b[i][j];b[i][j]%=MOD;cur_score+=b[i][j];}\n    for(int m=0;m<M;m++)for(int i=0;i<3;i++)for(int j=0;j<3;j++)cin>>sv[m][i][j];\n    auto t0=steady_clock::now();const long long TL_US=1850000;\n    vector<Op>ops;ops.reserve(K);\n    const int tpos[9][2]={{0,0},{0,3},{0,6},{3,0},{3,3},{3,6},{6,0},{6,3},{6,6}};\n    gdfl=0;gdto=false;gddl=t0+milliseconds(1300);\n    for(int tile=0;tile<9;tile++){\n        int p=tpos[tile][0],q=tpos[tile][1];long long itv[3][3];long long its=0;\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){itv[i][j]=b[p+i][q+j];its+=itv[i][j];}\n        long long gn[20];int ord[20];iota(ord,ord+20,0);\n        for(int m=0;m<M;m++){gn[m]=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)gn[m]+=add_mod(itv[i][j],sv[m][i][j])-itv[i][j];}\n        sort(ord,ord+20,[&](int a,int b_){return gn[a]>gn[b_];});\n        long long grtv[3][3];memcpy(grtv,itv,sizeof(itv));long long grts=its;int grs[9];\n        for(int d=0;d<9;d++){long long bg=0;int bm=0;for(int m=0;m<M;m++){long long g=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)g+=add_mod(grtv[i][j],sv[m][i][j])-grtv[i][j];if(g>bg){bg=g;bm=m;}}grs[d]=bm;for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(grtv[i][j],sv[bm][i][j]);grts+=nv-grtv[i][j];grtv[i][j]=nv;}}\n        memcpy(gdtv,itv,sizeof(itv));gdts=its;gdtbest=grts;for(int d=0;d<9;d++)gdbs[d]=grs[d];for(int m=0;m<20;m++)gdord[m]=ord[m];\n        tile_dfs(0,0);\n        int best_s[9];memcpy(best_s,gdbs,sizeof(gdbs));long long best_ts=gdtbest;\n        bool imp=true;\n        while(imp){imp=false;for(int d=0;d<9;d++){int om=best_s[d];for(int m=0;m<M;m++){if(m==om)continue;int tmp[9];memcpy(tmp,best_s,sizeof(best_s));tmp[d]=m;long long ts=compute_tile(tmp,itv);if(ts>best_ts){best_ts=ts;memcpy(best_s,tmp,sizeof(tmp));imp=true;}}}}\n        // 2-opt refinement\n        bool imp2=true;\n        while(imp2){\n            imp2=false;long long b2ts=best_ts;int bd1=-1,bd2=-1,bm1=-1,bm2=-1;\n            for(int d1=0;d1<9;d1++)for(int d2=d1+1;d2<9;d2++)for(int m1=0;m1<M;m1++)for(int m2=0;m2<M;m2++){\n                if(m1==best_s[d1]&&m2==best_s[d2])continue;\n                int tmp[9];memcpy(tmp,best_s,sizeof(best_s));tmp[d1]=m1;tmp[d2]=m2;\n                long long ts=compute_tile(tmp,itv);\n                if(ts>b2ts){b2ts=ts;bd1=d1;bd2=d2;bm1=m1;bm2=m2;}\n            }\n            if(bd1>=0){best_ts=b2ts;best_s[bd1]=bm1;best_s[bd2]=bm2;imp2=true;}\n        }\n        for(int d=0;d<9;d++){apply_s(best_s[d],p,q);ops.push_back({best_s[d],p,q});}\n    }\n    long long best_score=cur_score;vector<Op>best_ops=ops;\n    mt19937 rng(42);const int POS=N-2;\n    auto rand_op=[&]()->Op{return{(int)(rng()%M),(int)(rng()%POS),(int)(rng()%POS)};};\n    double T_start=1e8;\n    if(!ops.empty()){long long sumd=0;int cnt=0;for(int i=0;i<3000;i++){int L=ops.size();if(!L)break;int idx=rng()%L;Op oo=ops[idx],no=rand_op();long long s0=cur_score;undo_s(oo.m,oo.p,oo.q);apply_s(no.m,no.p,no.q);long long d=cur_score-s0;sumd+=(d<0?-d:d);cnt++;undo_s(no.m,no.p,no.q);apply_s(oo.m,oo.p,oo.q);}if(cnt>0)T_start=max(1.0,(double)sumd/cnt);}\n    double T=T_start,T_end=max(T_start*1e-7,1.0);\n    for(long long it=0;;it++){\n        if(it%50000==0){long long el=duration_cast<microseconds>(steady_clock::now()-t0).count();if(el>=TL_US)break;T=T_start*pow(T_end/T_start,(double)el/TL_US);}\n        int L=ops.size();Op n1=rand_op(),o1{},o2{},n2{};int i1=-1,i2=-1,mt;\n        if(L==0){mt=0;}else{int r=rng()%10;if(L==K)mt=(r<2)?1:(r<7)?2:3;else mt=(r<2)?0:(r<3)?1:(r<7)?2:3;if(mt==3&&L<2)mt=2;}\n        if(mt==1||mt==2){i1=rng()%L;o1=ops[i1];}\n        if(mt==3){i1=rng()%L;do{i2=rng()%L;}while(i2==i1);o1=ops[i1];o2=ops[i2];n2=rand_op();}\n        long long s0=cur_score;\n        switch(mt){case 0:apply_s(n1.m,n1.p,n1.q);break;case 1:undo_s(o1.m,o1.p,o1.q);break;case 2:undo_s(o1.m,o1.p,o1.q);apply_s(n1.m,n1.p,n1.q);break;case 3:undo_s(o1.m,o1.p,o1.q);undo_s(o2.m,o2.p,o2.q);apply_s(n1.m,n1.p,n1.q);apply_s(n2.m,n2.p,n2.q);break;}\n        long long delta=cur_score-s0;bool acc=(delta>=0)||(T>0.5&&(double)(rng()%1000000)<exp((double)delta/T)*1e6);\n        if(acc){switch(mt){case 0:ops.push_back(n1);break;case 1:ops[i1]=ops.back();ops.pop_back();break;case 2:ops[i1]=n1;break;case 3:ops[i1]=n1;ops[i2]=n2;break;}if(cur_score>best_score){best_score=cur_score;best_ops=ops;}}\n        else{switch(mt){case 0:undo_s(n1.m,n1.p,n1.q);break;case 1:apply_s(o1.m,o1.p,o1.q);break;case 2:undo_s(n1.m,n1.p,n1.q);apply_s(o1.m,o1.p,o1.q);break;case 3:undo_s(n2.m,n2.p,n2.q);undo_s(n1.m,n1.p,n1.q);apply_s(o2.m,o2.p,o2.q);apply_s(o1.m,o1.p,o1.q);break;}}\n    }\n    cout<<best_ops.size()<<'\\n';for(auto&op:best_ops)cout<<op.m<<' '<<op.p<<' '<<op.q<<'\\n';\n    return 0;\n}","ahc033":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=5;\nint A[N][N],posR[N*N],posP[N*N],grid[N][N];\nint craneR,craneC,craneContainer;\nbool craneHolding;\nint recvSent[N],recvPickedUp[N],dispatchCount[N];\nmap<int,pair<int,int>> bufPos;\nset<pair<int,int>> usedBufs;\nbool done_[N*N];\nstring result;\nvoid sRecv(){for(int r=0;r<N;r++){bool bl=craneHolding&&craneR==r&&craneC==0;if(!bl&&grid[r][0]==-1&&recvSent[r]<N)grid[r][0]=A[r][recvSent[r]++];}}\nvoid sDisp(){for(int r=0;r<N;r++)if(grid[r][N-1]!=-1){dispatchCount[r]++;grid[r][N-1]=-1;}}\nvoid act(char c){result+=c;if(c=='P'){craneContainer=grid[craneR][craneC];grid[craneR][craneC]=-1;craneHolding=true;}else if(c=='Q'){grid[craneR][craneC]=craneContainer;craneHolding=false;craneContainer=-1;}else if(c=='U')craneR--;else if(c=='D')craneR++;else if(c=='L')craneC--;else if(c=='R')craneC++;}\nvoid turn_(char c){sRecv();act(c);sDisp();}\nvoid goto_(int tr,int tc){while(craneR!=tr||craneC!=tc){if(craneR<tr)turn_('D');else if(craneR>tr)turn_('U');else if(craneC<tc)turn_('R');else turn_('L');}}\nvoid pickup_(int r,int c,bool ig){while(grid[r][c]==-1){if(ig&&recvSent[r]<N){turn_('P');return;}turn_('.');}turn_('P');}\npair<int,int> freeBuf(int tR=-1){\n    if(tR>=0)for(int c=N-2;c>=1;c--){auto p=make_pair(tR,c);if(!usedBufs.count(p)&&grid[tR][c]==-1)return p;}\n    for(int c=N-2;c>=1;c--)for(int r=0;r<N;r++){auto p=make_pair(r,c);if(!usedBufs.count(p)&&grid[r][c]==-1)return p;}\n    for(int r=0;r<N;r++)if(recvSent[r]==N){auto p=make_pair(r,0);if(!usedBufs.count(p)&&grid[r][0]==-1)return p;}\n    return{-1,-1};\n}\nint nNext(int g){return dispatchCount[g]<N?N*g+dispatchCount[g]:-1;}\nvoid deliver_(int sR,int sC,bool ib,bool ig,int d){goto_(sR,sC);pickup_(sR,sC,ig);int c=craneContainer;if(ib){usedBufs.erase({sR,sC});bufPos.erase(c);}else if(ig)recvPickedUp[sR]++;done_[c]=true;goto_(d,N-1);turn_('Q');}\nvoid bufGate_(int r,int dR,int dC){goto_(r,0);pickup_(r,0,true);int c=craneContainer;recvPickedUp[r]++;usedBufs.insert({dR,dC});bufPos[c]={dR,dC};goto_(dR,dC);turn_('Q');}\nvoid clearB_(int r){int bl=A[r][recvPickedUp[r]],gb=bl/N;if(nNext(gb)==bl)deliver_(r,0,false,true,gb);else{auto[br,bc]=freeBuf(gb);if(br!=-1)bufGate_(r,br,bc);else deliver_(r,0,false,true,gb);}}\nvoid delGate(int g){int k=nNext(g);if(k<0||done_[k])return;if(bufPos.count(k)){auto[br,bc]=bufPos[k];deliver_(br,bc,true,false,g);}else{int r=posR[k],p=posP[k];while(recvPickedUp[r]<p)clearB_(r);deliver_(r,0,false,true,g);}}\nvector<int> plan(){\n    const int ND=N+1;int DB=1;for(int i=0;i<N;i++)DB*=ND;const int NS=DB*N*N;\n    auto enc=[&](array<int,N>d,int r,int c)->int{int s=0;for(int i=0;i<N;i++)s=s*ND+d[i];return s*N*N+r*N+c;};\n    auto dec=[&](int s,array<int,N>&d,int&r,int&c){c=s%N;s/=N;r=s%N;s/=N;for(int i=N-1;i>=0;i--){d[i]=s%ND;s/=ND;}};\n    vector<int>dist(NS,INT_MAX/2),pS(NS,-1),pG(NS,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;\n    array<int,N>d0{};int s0=enc(d0,0,0);dist[s0]=0;pq.push({0,s0});\n    while(!pq.empty()){auto[w,s]=pq.top();pq.pop();if(w>dist[s])continue;array<int,N>d;int r,c;dec(s,d,r,c);\n        for(int g=0;g<N;g++){if(d[g]>=N)continue;int k=N*g+d[g],sR=posR[k];\n            int tc=abs(r-sR)+c+abs(sR-g)+(N-1)+2+posP[k]*5;\n            auto nd=d;nd[g]++;int ns=enc(nd,g,N-1);\n            if(dist[s]+tc<dist[ns]){dist[ns]=dist[s]+tc;pS[ns]=s;pG[ns]=g;pq.push({dist[ns],ns});}}}\n    array<int,N>gD;gD.fill(N);int best=-1,bd=INT_MAX;\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int gs=enc(gD,r,c);if(dist[gs]<bd){bd=dist[gs];best=gs;}}\n    vector<int>ord;if(best!=-1)for(int s=best;pS[s]!=-1;s=pS[s])ord.push_back(pG[s]);\n    reverse(ord.begin(),ord.end());return ord;\n}\nvoid solve(){\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)grid[r][c]=-1;\n    craneR=craneC=0;craneHolding=false;craneContainer=-1;\n    fill(recvSent,recvSent+N,0);fill(recvPickedUp,recvPickedUp+N,0);\n    fill(dispatchCount,dispatchCount+N,0);fill(done_,done_+N*N,false);\n    bufPos.clear();usedBufs.clear();result.clear();\n    for(int r=0;r<N;r++)for(int p=0;p<N;p++){posR[A[r][p]]=r;posP[A[r][p]]=p;}\n    auto ord=plan();for(int g:ord)delGate(g);\n    for(int it=0;it<3000;it++){\n        bool done=true;for(int i=0;i<N;i++)if(dispatchCount[i]<N){done=false;break;}if(done)break;\n        int bK=-1,bSc=INT_MAX,bSR=-1,bSC=-1;bool bBuf=false;\n        for(int g=0;g<N;g++){int k=nNext(g);if(k<0||done_[k])continue;int sR,sC;bool ib;\n            if(bufPos.count(k)){auto&bp=bufPos[k];sR=bp.first;sC=bp.second;ib=true;}\n            else{int r=posR[k],p=posP[k];if(recvPickedUp[r]!=p)continue;sR=r;sC=0;ib=false;}\n            int sc=abs(craneR-sR)+abs(craneC-sC)+abs(sR-g)+abs(sC-(N-1));\n            if(sc<bSc){bSc=sc;bK=k;bSR=sR;bSC=sC;bBuf=ib;}}\n        if(bK>=0)deliver_(bSR,bSC,bBuf,!bBuf,bK/N);\n        else{int bG=-1,bD=INT_MAX;\n            for(int g=0;g<N;g++){int k=nNext(g);if(k<0||done_[k]||bufPos.count(k))continue;\n                int r=posR[k],p=posP[k];if(recvPickedUp[r]==p)continue;\n                int d=abs(craneR-r)+abs(craneC);if(d<bD){bD=d;bG=g;}}\n            if(bG>=0)clearB_(posR[nNext(bG)]);}\n    }\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    int n;cin>>n;for(int r=0;r<N;r++)for(int p=0;p<N;p++)cin>>A[r][p];\n    solve();cout<<result<<\"\\n\";for(int i=1;i<N;i++)cout<<\"B\\n\";return 0;\n}","ahc034":"#include <bits/stdc++.h>\nusing namespace std;\n\nint N;\nint h[20][20];\nint curR, curC, curLoad;\nvector<string> ops;\n\nvoid doLoad(int d) { if (d<=0) return; ops.push_back(\"+\"+to_string(d)); h[curR][curC]-=d; curLoad+=d; }\nvoid doUnload(int d) { d=min(d,curLoad); if(d<=0) return; ops.push_back(\"-\"+to_string(d)); h[curR][curC]+=d; curLoad-=d; }\n\nvoid moveStep(char dir, int dr, int dc) {\n    curR+=dr; curC+=dc; ops.push_back(string(1,dir));\n    if (h[curR][curC]>0) doLoad(h[curR][curC]);\n    else if (h[curR][curC]<0 && curLoad>0) doUnload(min(curLoad,-h[curR][curC]));\n}\n\nvoid moveTo(int tr, int tc) {\n    while (curR!=tr || curC!=tc) {\n        bool canR=(curR!=tr), canC=(curC!=tc);\n        if (canR && canC) {\n            int dr=curR<tr?1:-1, dc=curC<tc?1:-1;\n            int nRh=h[curR+dr][curC], nCh=h[curR][curC+dc];\n            int vR,vC;\n            if (curLoad>0) { vR=abs(nRh); vC=abs(nCh); }\n            else { vR=max(0,nRh); vC=max(0,nCh); if(!vR&&!vC){vR=abs(nRh);vC=abs(nCh);} }\n            if (vR>=vC) moveStep(dr>0?'D':'U',dr,0); else moveStep(dc>0?'R':'L',0,dc);\n        } else if (canR) { int dr=curR<tr?1:-1; moveStep(dr>0?'D':'U',dr,0); }\n        else { int dc=curC<tc?1:-1; moveStep(dc>0?'R':'L',0,dc); }\n    }\n}\n\nbool allZero() { for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(h[i][j]!=0) return false; return true; }\n\nint main() {\n    ios::sync_with_stdio(false); cin.tie(0);\n    cin>>N;\n    for(int i=0;i<N;i++) for(int j=0;j<N;j++) cin>>h[i][j];\n    curR=curC=curLoad=0;\n    if(h[0][0]>0) doLoad(h[0][0]);\n    \n    while (!allZero() && (int)ops.size()<95000) {\n        auto mhdist=[&](int i,int j){return abs(i-curR)+abs(j-curC);};\n        \n        int nearestD=INT_MAX, di=-1, dj=-1;\n        for(int i=0;i<N;i++) for(int j=0;j<N;j++)\n            if(h[i][j]<0){int d=mhdist(i,j); if(d<nearestD){nearestD=d;di=i;dj=j;}}\n        \n        if (curLoad==0) {\n            double bs=-1; int bi=-1,bj=-1;\n            for(int i=0;i<N;i++) for(int j=0;j<N;j++)\n                if(h[i][j]>0){double sc=(double)h[i][j]/(mhdist(i,j)+1); if(sc>bs){bs=sc;bi=i;bj=j;}}\n            if(bi<0) break;\n            moveTo(bi,bj);\n            if(h[bi][bj]>0) doLoad(h[bi][bj]);\n        } else {\n            // Find best economically feasible supply: d*curLoad < nearestD*100\n            double bestFS=-1; int fsi=-1,fsj=-1;\n            for(int i=0;i<N;i++) for(int j=0;j<N;j++) {\n                if(h[i][j]<=0) continue;\n                int d=mhdist(i,j);\n                if((long long)d*curLoad>=(long long)nearestD*100) continue;\n                double sc=(double)h[i][j]/(d+1);\n                if(sc>bestFS){bestFS=sc;fsi=i;fsj=j;}\n            }\n            if(fsi>=0) {\n                moveTo(fsi,fsj);\n                if(h[fsi][fsj]>0) doLoad(h[fsi][fsj]);\n            } else if(di>=0) {\n                moveTo(di,dj);\n                if(h[di][dj]<0 && curLoad>0) doUnload(min(curLoad,-h[di][dj]));\n            } else break;\n        }\n    }\n    \n    for(const auto& op:ops) cout<<op<<\"\\n\";\n    return 0;\n}","ahc035":"#include <bits/stdc++.h>\nusing namespace std;\nint main(){\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,T; cin>>N>>M>>T;\n    const int SC=2*N*(N-1),nn=N*N;\n    vector<vector<int>> X(SC,vector<int>(M));\n    for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    mt19937 rng(42);\n    vector<array<int,4>> nbr(nn); vector<int> ndeg(nn,0);\n    for(int p=0;p<nn;p++){int r=p/N,c=p%N;if(r>0)nbr[p][ndeg[p]++]=p-N;if(r<N-1)nbr[p][ndeg[p]++]=p+N;if(c>0)nbr[p][ndeg[p]++]=p-1;if(c<N-1)nbr[p][ndeg[p]++]=p+1;}\n    for(int turn=0;turn<T;turn++){\n        auto ts=chrono::steady_clock::now();\n        vector<int> vals(SC,0);\n        for(int k=0;k<SC;k++) for(int l=0;l<M;l++) vals[k]+=X[k][l];\n        vector<bool> ins(SC,false); vector<int> sel;\n        for(int l=0;l<M;l++){int bk=0;for(int k=1;k<SC;k++)if(X[k][l]>X[bk][l])bk=k;if(!ins[bk]){ins[bk]=true;sel.push_back(bk);}}\n        {vector<int> ord(SC);iota(ord.begin(),ord.end(),0);sort(ord.begin(),ord.end(),[&](int a,int b){return vals[a]>vals[b];});for(int k:ord){if((int)sel.size()>=nn)break;if(!ins[k]){ins[k]=true;sel.push_back(k);}}}\n        vector<int> pst(nn*nn);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++){int s=0;for(int l=0;l<M;l++)s+=max(X[sel[i]][l],X[sel[j]][l]);pst[i*nn+j]=s;}\n        vector<int> psum(nn,0);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++) psum[i]+=pst[i*nn+j];\n        auto ctrb=[&](const vector<int>&g,int p)->int{int v=0;for(int d=0;d<ndeg[p];d++)v+=pst[g[p]*nn+g[nbr[p][d]]];return v;};\n        auto totsc=[&](const vector<int>&g)->int{int s=0;for(int p=0;p<nn;p++){if((p%N)<N-1)s+=pst[g[p]*nn+g[p+1]];if(p<nn-N)s+=pst[g[p]*nn+g[p+N]];}return s;};\n        auto locsrch=[&](vector<int> g)->vector<int>{bool imp=true;while(imp){imp=false;for(int a=0;a<nn;a++)for(int b=a+1;b<nn;b++){int bef=ctrb(g,a)+ctrb(g,b);swap(g[a],g[b]);int aft=ctrb(g,a)+ctrb(g,b);if(aft>bef)imp=true;else swap(g[a],g[b]);}}return g;};\n        auto grinit=[&]()->vector<int>{vector<int> g(nn,-1);vector<bool> used(nn,false);for(int pos=0;pos<nn;pos++){int r=pos/N,c=pos%N;int bs=-1;int64_t bv=-1;for(int s=0;s<nn;s++){if(used[s])continue;int cv=0;if(r>0)cv+=pst[s*nn+g[pos-N]];if(c>0)cv+=pst[s*nn+g[pos-1]];int64_t ev=(int64_t)cv*1000000LL+psum[s];if(ev>bv){bv=ev;bs=s;}}g[pos]=bs;used[bs]=true;}return g;};\n        int gbest=-1; vector<int> bg;\n        for(int rest=0;rest<3;rest++){\n            double rt0=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n            if(rt0>=0.185) break;\n            double tl=(0.185-rt0)/(3-rest),tend=rt0+tl;\n            vector<int> g(nn); double T0;\n            if(rest==0){g=grinit();T0=200.0;}else{iota(g.begin(),g.end(),0);shuffle(g.begin(),g.end(),rng);T0=1000.0;}\n            int cur=totsc(g),lb=cur; vector<int> lg=g; double temp=T0;\n            for(int it=0;;it++){\n                if((it&0x7FF)==0){double now=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(now>=tend)break;temp=T0*pow(0.1/T0,(now-rt0)/tl);}\n                int p1=rng()%nn,p2=rng()%nn; if(p1==p2)continue;\n                int bef=ctrb(g,p1)+ctrb(g,p2); swap(g[p1],g[p2]); int aft=ctrb(g,p1)+ctrb(g,p2); int d=aft-bef;\n                if(d>=0||(rng()%1000000)<(int)(1e6*exp((double)d/temp))){cur+=d;if(cur>lb){lb=cur;lg=g;}}else swap(g[p1],g[p2]);\n            }\n            lg=locsrch(lg); int sc=totsc(lg); if(sc>gbest){gbest=sc;bg=lg;}\n        }\n        for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(j)cout<<' ';cout<<sel[bg[i*N+j]];}cout<<'\\n';}\n        cout.flush();\n        for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    }\n    return 0;\n}","ahc038":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,V;\nconst int DR[]={0,1,0,-1},DC[]={1,0,-1,0};\nint rx,ry,nfp,Vp,rfp=-1;\nint fpd[4],hld[4];\nstruct Del{int sr,sc,tr,tc;bool done;};\nvector<Del>P;int np;\nvector<vector<int>>g;\nmap<pair<int,int>,int>sm;\nvector<string>ops;\nbool navto(int tr,int tc,int pk,int td){\n    while((rx!=tr||ry!=tc||fpd[pk]!=td)&&(int)ops.size()<99990){\n        char mv='.';\n        if(rx!=tr||ry!=tc){if(rx<tr)mv='D';else if(rx>tr)mv='U';else if(ry<tc)mv='R';else mv='L';}\n        if(mv=='D')rx++;else if(mv=='U')rx--;else if(mv=='R')ry++;else if(mv=='L')ry--;\n        string op(2*Vp,'.');op[0]=mv;\n        if(fpd[pk]!=td){int cw=(td-fpd[pk]+4)%4;if(cw<=2){fpd[pk]=(fpd[pk]+1)%4;op[1+pk]='R';}else{fpd[pk]=(fpd[pk]+3)%4;op[1+pk]='L';}}\n        for(int k=0;k<nfp;k++){\n            int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];\n            if(fr<0||fr>=N||fc<0||fc>=N)continue;\n            if(hld[k]<0){if(k==rfp)continue;auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n            else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n        }\n        ops.push_back(op);\n    }\n    return rx==tr&&ry==tc&&fpd[pk]==td;\n}\nint pickfp(int di,int r,int c){\n    sm.erase({r,c});\n    int bk=-1,br=-1,bc=-1,bdir=-1,bv=INT_MAX;\n    for(int k=0;k<nfp;k++){\n        if(hld[k]>=0)continue;\n        for(int d=0;d<4;d++){\n            int ar=r-DR[d],ac=c-DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;\n            int md=abs(rx-ar)+abs(ry-ac),rot=min((d-fpd[k]+4)%4,(fpd[k]-d+4)%4),v=max(md,rot);\n            if(v<bv){bv=v;bk=k;br=ar;bc=ac;bdir=d;}\n        }\n    }\n    if(bk<0){sm[{r,c}]=di;return -1;}\n    rfp=bk;bool ok=navto(br,bc,bk,bdir);rfp=-1;\n    if(!ok){sm[{r,c}]=di;return -1;}\n    if((int)ops.size()>=99990){sm[{r,c}]=di;return -1;}\n    string op(2*Vp,'.');bool picked=false;\n    for(int k=0;k<nfp;k++){\n        int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k==bk&&fr==r&&fc==c&&g[r][c]==1&&hld[k]<0){hld[k]=di;g[r][c]=0;op[Vp+1+k]='P';picked=true;}\n        else if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n        else if(hld[k]>=0){int di2=hld[k];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n    }\n    ops.push_back(op);if(!picked){sm[{r,c}]=di;return -1;}return bk;\n}\nbool dropfp(int k,int di){\n    if(hld[k]!=di)return true;\n    int r=P[di].tr,c=P[di].tc;\n    int bdir=-1,bar=-1,bac=-1,bv=INT_MAX;\n    for(int d=0;d<4;d++){\n        int ar=r-DR[d],ac=c-DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;\n        int md=abs(rx-ar)+abs(ry-ac),rot=min((d-fpd[k]+4)%4,(fpd[k]-d+4)%4),v=max(md,rot);\n        if(v<bv){bv=v;bdir=d;bar=ar;bac=ac;}\n    }\n    if(bdir<0)return false;\n    navto(bar,bac,k,bdir);if(hld[k]!=di)return true;\n    if((int)ops.size()>=99990)return false;\n    string op(2*Vp,'.');bool ok=false;\n    for(int k2=0;k2<nfp;k2++){\n        int fr=rx+DR[fpd[k2]],fc=ry+DC[fpd[k2]];if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k2==k&&fr==r&&fc==c&&g[r][c]==0&&hld[k2]==di){g[r][c]=1;P[di].done=true;hld[k2]=-1;op[Vp+1+k2]='P';ok=true;}\n        else if(hld[k2]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k2]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k2]='P';}}\n        else if(hld[k2]>=0){int di2=hld[k2];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k2]=-1;op[Vp+1+k2]='P';}}\n    }\n    ops.push_back(op);return ok;\n}\nbool cbh(int bk){\n    if(hld[bk]<0)return false;int di=hld[bk];\n    pair<int,int>tmp={-1,-1};\n    {set<pair<int,int>>ts;for(auto&d:P)if(!d.done)ts.insert({d.tr,d.tc});\n    auto val=[&](int r,int c)->bool{for(int d=0;d<4;d++){int a=r-DR[d],b=c-DC[d];if(a>=0&&a<N&&b>=0&&b<N)return true;}return false;};\n    for(int i=0;i<N&&tmp.first<0;i++)for(int j=0;j<N&&tmp.first<0;j++)if(!g[i][j]&&!ts.count({i,j})&&val(i,j))tmp={i,j};\n    if(tmp.first<0)for(int i=0;i<N&&tmp.first<0;i++)for(int j=0;j<N&&tmp.first<0;j++)if(!g[i][j]&&val(i,j))tmp={i,j};}\n    if(tmp.first<0)return false;\n    int otr=P[di].tr,otc=P[di].tc;P[di].tr=tmp.first;P[di].tc=tmp.second;g[tmp.first][tmp.second]=0;\n    if(dropfp(bk,di)){P[di].done=false;P[di].tr=otr;P[di].tc=otc;P[di].sr=tmp.first;P[di].sc=tmp.second;sm[{tmp.first,tmp.second}]=di;return true;}\n    else{P[di].tr=otr;P[di].tc=otc;if(!g[tmp.first][tmp.second])g[tmp.first][tmp.second]=1;hld[bk]=-1;return false;}\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>V;\n    vector<string>sg(N),tg(N);for(auto&s:sg)cin>>s;for(auto&s:tg)cin>>s;\n    vector<pair<int,int>>S,T;g.assign(N,vector<int>(N,0));\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(sg[i][j]=='1'){S.push_back({i,j});g[i][j]=1;}if(tg[i][j]=='1')T.push_back({i,j});}\n    int m=M;nfp=min(V-1,4);Vp=nfp+1;\n    cout<<Vp<<\"\\n\";for(int k=0;k<nfp;k++)cout<<\"0 1\\n\";cout<<\"0 0\\n\";\n    rx=ry=0;for(int k=0;k<nfp;k++){hld[k]=-1;fpd[k]=0;}\n    vector<int>mt(m,-1);\n    {vector<bool>su(m,false),tu(m,false);\n    for(int i=0;i<m;i++)if(!su[i])for(int j=0;j<m;j++)if(!tu[j]&&S[i]==T[j]){mt[i]=j;su[i]=tu[j]=true;break;}\n    for(int i=0;i<m;i++){if(su[i])continue;int bj=-1,bd=INT_MAX;for(int j=0;j<m;j++){if(tu[j])continue;int d=abs(S[i].first-T[j].first)+abs(S[i].second-T[j].second);if(d<bd){bd=d;bj=j;}}mt[i]=bj;su[i]=tu[bj]=true;}\n    bool imp=true;while(imp){imp=false;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int si0=S[i].first,si1=S[i].second,sj0=S[j].first,sj1=S[j].second,ti0=T[mt[i]].first,ti1=T[mt[i]].second,tj0=T[mt[j]].first,tj1=T[mt[j]].second;if(abs(si0-tj0)+abs(si1-tj1)+abs(sj0-ti0)+abs(sj1-ti1)<abs(si0-ti0)+abs(si1-ti1)+abs(sj0-tj0)+abs(sj1-tj1)){swap(mt[i],mt[j]);imp=true;}}}}\n    P.clear();for(int i=0;i<m;i++)if(S[i]!=T[mt[i]])P.push_back({S[i].first,S[i].second,T[mt[i]].first,T[mt[i]].second,false});\n    np=(int)P.size();sm.clear();for(int i=0;i<np;i++)sm[{P[i].sr,P[i].sc}]=i;\n    auto orient_check=[&](string&op){for(int k=0;k<nfp;k++){int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];if(fr<0||fr>=N||fc<0||fc>=N)continue;if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}}};\n    if(nfp>=2){string op(2*Vp,'.');if(nfp>=2){op[2]='R';fpd[1]=1;}if(nfp>=3){op[3]='R';fpd[2]=1;}if(nfp>=4){op[4]='L';fpd[3]=3;}orient_check(op);ops.push_back(op);}\n    if(nfp>=3){string op(2*Vp,'.');op[3]='R';fpd[2]=2;orient_check(op);ops.push_back(op);}\n    vector<int>tsp(np);\n    if(np>0){\n        {vector<bool>used(np,false);int cr=0,cc=0;for(int s=0;s<np;s++){int best=-1,bd=INT_MAX;for(int i=0;i<np;i++){if(used[i])continue;int d=abs(cr-P[i].sr)+abs(cc-P[i].sc);if(d<bd){bd=d;best=i;}}tsp[s]=best;used[best]=true;cr=P[best].tr;cc=P[best].tc;}}\n        auto dc=[&](int a,int b)->int{if(b<0||b>=np)return 0;int r0=(a<0||a>=np)?0:P[tsp[a]].tr,c0=(a<0||a>=np)?0:P[tsp[a]].tc;return abs(r0-P[tsp[b]].sr)+abs(c0-P[tsp[b]].sc);};\n        {bool imp=true;while(imp){imp=false;for(int i=0;i<np;i++)for(int j=i+1;j<np;j++){int oc,nc;if(j==i+1){oc=dc(i-1,i)+dc(i,j)+dc(j,j+1);swap(tsp[i],tsp[j]);nc=dc(i-1,i)+dc(i,j)+dc(j,j+1);swap(tsp[i],tsp[j]);}else{oc=dc(i-1,i)+dc(i,i+1)+dc(j-1,j)+dc(j,j+1);swap(tsp[i],tsp[j]);nc=dc(i-1,i)+dc(i,i+1)+dc(j-1,j)+dc(j,j+1);swap(tsp[i],tsp[j]);}if(nc<oc){swap(tsp[i],tsp[j]);imp=true;}}}}\n        {bool imp=true;while(imp){imp=false;int bi=-1,bj=-1,bdelta=0;for(int i=0;i<np;i++){int pi=i-1,ni=i+1,rc=dc(pi,i)+dc(i,ni),bridge=dc(pi,ni);for(int j=0;j<np;j++){if(j==pi||j==i)continue;int nj=j+1,rj=dc(j,nj),ic=dc(j,i)+dc(i,nj),delta=bridge+ic-rc-rj;if(delta<bdelta){bdelta=delta;bi=i;bj=j;}}}if(bi>=0){imp=true;int val=tsp[bi];if(bj>bi){tsp.erase(tsp.begin()+bi);tsp.insert(tsp.begin()+bj,val);}else{tsp.erase(tsp.begin()+bi);tsp.insert(tsp.begin()+bj+1,val);}}}}\n    }\n    int stall=0,tsp_idx=0;\n    while((int)ops.size()<97000){\n        int tdone=0;for(auto&d:P)if(d.done)tdone++;if(tdone==np)break;\n        bool prog=false;\n        {int bk=-1,bd=INT_MAX;for(int k=0;k<nfp;k++){if(hld[k]<0)continue;int di=hld[k];if(g[P[di].tr][P[di].tc]!=0)continue;int v=abs(rx-P[di].tr)+abs(ry-P[di].tc);if(v<bd){bd=v;bk=k;}}if(bk>=0){if(!dropfp(bk,hld[bk]))cbh(bk);prog=true;}}\n        if(!prog){\n            while(tsp_idx<np&&P[tsp[tsp_idx]].done)tsp_idx++;\n            int fi=-1,bd=INT_MAX;\n            for(int t=tsp_idx;t<np;t++){int c=tsp[t];if(!P[c].done&&g[P[c].tr][P[c].tc]==0){fi=c;break;}}\n            if(fi<0){for(int i=0;i<np;i++){if(P[i].done||g[P[i].tr][P[i].tc]!=0)continue;int d=abs(rx-P[i].sr)+abs(ry-P[i].sc);if(d<bd){bd=d;fi=i;}}}\n            if(fi>=0){int k=pickfp(fi,P[fi].sr,P[fi].sc);if(k>=0){if(!dropfp(k,fi))cbh(k);prog=true;if(tsp_idx<np&&tsp[tsp_idx]==fi)tsp_idx++;}}\n        }\n        if(!prog){for(int k=0;k<nfp;k++)if(hld[k]>=0){if(cbh(k))prog=true;break;}\n            if(!prog){int ci=-1,bd=INT_MAX;for(auto&[src,di]:sm){int d=abs(rx-src.first)+abs(ry-src.second);if(d<bd){bd=d;ci=di;}}if(ci>=0){int k=pickfp(ci,P[ci].sr,P[ci].sc);if(k>=0&&cbh(k))prog=true;}}}\n        if(prog)stall=0;\n        else{stall++;if(stall>300)break;string op(2*Vp,'.');for(int k=0;k<nfp;k++){int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];if(fr<0||fr>=N||fc<0||fc>=N)continue;if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}}ops.push_back(op);}\n    }\n    for(auto&op:ops)cout<<op<<\"\\n\";\n    return 0;\n}","ahc039":"#include <bits/stdc++.h>\nusing namespace std;\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);\n    using Clock = chrono::steady_clock;\n    auto t0 = Clock::now();\n    auto elapsedMs = [&]() {\n        return (long long)chrono::duration_cast<chrono::milliseconds>(Clock::now()-t0).count();\n    };\n    int N; cin >> N;\n    int M = 2*N;\n    vector<int> X(M), Y(M), W(M);\n    for (int i=0; i<M; i++) { cin>>X[i]>>Y[i]; W[i]=(i<N)?1:-1; }\n    const int CMAX=100000;\n    // Trivial initial output\n    {\n        int x1=X[0],x2=(x1<CMAX)?x1+1:x1-1,y1=Y[0],y2=(y1<CMAX)?y1+1:y1-1;\n        if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n        cout<<4<<\"\\n\"<<x1<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y2<<\"\\n\"<<x1<<\" \"<<y2<<\"\\n\";\n    }\n    struct FE{int key,other,w;};\n    vector<FE> bx(M),by(M);\n    {\n        vector<int> idx(M); iota(idx.begin(),idx.end(),0);\n        sort(idx.begin(),idx.end(),[&](int a,int b){return X[a]<X[b];});\n        for(int i=0;i<M;i++) bx[i]={X[idx[i]],Y[idx[i]],W[idx[i]]};\n        iota(idx.begin(),idx.end(),0);\n        sort(idx.begin(),idx.end(),[&](int a,int b){return Y[a]<Y[b];});\n        for(int i=0;i<M;i++) by[i]={Y[idx[i]],X[idx[i]],W[idx[i]]};\n    }\n    auto kadane=[](const vector<FE>&fish,int lo,int hi)->pair<int,int>{\n        int cur=0,cs=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n        for(int i=0,n=(int)fish.size();i<n;){\n            int xv=fish[i].key,gs=0;\n            while(i<n&&fish[i].key==xv){if(fish[i].other>=lo&&fish[i].other<=hi)gs+=fish[i].w;i++;}\n            if(!ir){if(gs>0){cs=xv;cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs;bhi=xv;}}}\n            else{cur+=gs;if(cur>mx){mx=cur;blo=cs;bhi=xv;}if(cur<0){cur=0;ir=false;}}\n        }\n        return{blo,bhi};\n    };\n    auto evalRect=[&](int x1,int x2,int y1,int y2){\n        int s=0;\n        for(int i=0;i<M;i++) if(X[i]>=x1&&X[i]<=x2&&Y[i]>=y1&&Y[i]<=y2)s+=W[i];\n        return s;\n    };\n    auto coordDescent=[&](int x1,int x2,int y1,int y2)->tuple<int,int,int,int,int>{\n        x1=max(0,min(CMAX,x1));x2=max(0,min(CMAX,x2));\n        y1=max(0,min(CMAX,y1));y2=max(0,min(CMAX,y2));\n        if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n        int px1=-1,px2=-1,py1=-1,py2=-1;\n        for(int it=0;it<20;it++){\n            if(x1==px1&&x2==px2&&y1==py1&&y2==py2)break;\n            px1=x1;px2=x2;py1=y1;py2=y2;\n            auto[nx1,nx2]=kadane(bx,y1,y2);if(nx1>=0){x1=nx1;x2=nx2;}\n            auto[ny1,ny2]=kadane(by,x1,x2);if(ny1>=0){y1=ny1;y2=ny2;}\n        }\n        return make_tuple(evalRect(x1,x2,y1,y2),x1,x2,y1,y2);\n    };\n    // Grid Kadane's\n    const int G=200,step=CMAX/G;\n    vector<vector<int>> grid(G,vector<int>(G,0));\n    for(int i=0;i<M;i++) grid[min(X[i]/step,G-1)][min(Y[i]/step,G-1)]+=W[i];\n    int bgx1=0,bgx2=0,bgy1=0,bgy2=0,bgs=0;\n    for(int gx1=0;gx1<G;gx1++){\n        vector<int> cs(G,0);\n        for(int gx2=gx1;gx2<G;gx2++){\n            for(int gy=0;gy<G;gy++)cs[gy]+=grid[gx2][gy];\n            int cur=0,cst=0,mx=0,ms=0,me=-1;\n            for(int gy=0;gy<G;gy++){cur+=cs[gy];if(cur>mx){mx=cur;ms=cst;me=gy;}if(cur<0){cur=0;cst=gy+1;}}\n            if(me>=0&&mx>bgs){bgs=mx;bgx1=gx1;bgx2=gx2;bgy1=ms;bgy2=me;}\n        }\n    }\n    int ix1=bgx1*step,ix2=min((bgx2+1)*step,CMAX);\n    int iy1=bgy1*step,iy2=min((bgy2+1)*step,CMAX);\n    int gscore=-1,rx1=0,rx2=1,ry1=0,ry2=1;\n    auto tryRun=[&](int x1,int x2,int y1,int y2){\n        auto[s,a,b,c,d]=coordDescent(x1,x2,y1,y2);\n        if(s>gscore){gscore=s;rx1=a;rx2=b;ry1=c;ry2=d;}\n    };\n    tryRun(ix1,ix2,iy1,iy2);\n    tryRun(0,CMAX,0,CMAX);\n    {\n        long long cx=0,cy=0;\n        for(int i=0;i<N;i++){cx+=X[i];cy+=Y[i];}\n        cx/=N;cy/=N;\n        tryRun((int)cx-40000,(int)cx+40000,(int)cy-40000,(int)cy+40000);\n        tryRun((int)cx-15000,(int)cx+15000,(int)cy-15000,(int)cy+15000);\n    }\n    mt19937 rng(42);\n    for(int trial=0;;trial++){\n        if(trial%100==0&&elapsedMs()>1500)break;\n        int seed=rng()%N;\n        int hx=200+(int)(rng()%50000),hy=200+(int)(rng()%50000);\n        tryRun(X[seed]-hx,X[seed]+hx,Y[seed]-hy,Y[seed]+hy);\n    }\n    // ARM SEARCH\n    // findArm: sweep along one direction, Kadane's on cross-section\n    // fish_sorted: (sweep_coord, cross_coord, weight), cross in [clo,chi]\n    // Returns (score, cross1, cross2, sweep_end)\n    auto findArm=[&](const vector<tuple<int,int,int>>&fish_sorted,int clo,int chi)\n        ->tuple<int,int,int,int>{\n        vector<int> xs;\n        for(auto&[sw,cr,w]:fish_sorted)if(cr>=clo&&cr<=chi)xs.push_back(cr);\n        sort(xs.begin(),xs.end());xs.erase(unique(xs.begin(),xs.end()),xs.end());\n        if(xs.empty())return{0,-1,-1,0};\n        int kx=(int)xs.size();\n        vector<int> cum(kx,0);\n        int bsc=0,bc1=-1,bc2=-1,bsw=0;\n        int i=0,n=(int)fish_sorted.size();\n        while(i<n){\n            int csw=get<0>(fish_sorted[i]);\n            while(i<n&&get<0>(fish_sorted[i])==csw){\n                auto&[sw,cr,w]=fish_sorted[i];\n                if(cr>=clo&&cr<=chi){\n                    int idx=(int)(lower_bound(xs.begin(),xs.end(),cr)-xs.begin());\n                    cum[idx]+=w;\n                }\n                i++;\n            }\n            int cur=0,cs=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n            for(int j=0;j<kx;j++){\n                int gs=cum[j];\n                if(!ir){if(gs>0){cs=xs[j];cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs;bhi=xs[j];}}}\n                else{cur+=gs;if(cur>mx){mx=cur;blo=cs;bhi=xs[j];}if(cur<0){cur=0;ir=false;}}\n            }\n            if(mx>bsc){bsc=mx;bc1=blo;bc2=bhi;bsw=csw;}\n        }\n        return{bsc,bc1,bc2,bsw};\n    };\n    // Build sorted fish for 4 arm directions (restricted to base cross-section)\n    vector<tuple<int,int,int>> ft,fb,fright,fl;\n    for(int i=0;i<M;i++){\n        if(Y[i]>ry2&&X[i]>=rx1&&X[i]<=rx2)ft.emplace_back(Y[i],X[i],W[i]);\n        if(Y[i]<ry1&&X[i]>=rx1&&X[i]<=rx2)fb.emplace_back(-Y[i],X[i],W[i]);\n        if(X[i]>rx2&&Y[i]>=ry1&&Y[i]<=ry2)fright.emplace_back(X[i],Y[i],W[i]);\n        if(X[i]<rx1&&Y[i]>=ry1&&Y[i]<=ry2)fl.emplace_back(-X[i],Y[i],W[i]);\n    }\n    sort(ft.begin(),ft.end());sort(fb.begin(),fb.end());\n    sort(fright.begin(),fright.end());sort(fl.begin(),fl.end());\n    auto[ts,tax1,tax2,tay2]=findArm(ft,rx1,rx2);\n    auto[bms,bax1,bax2,neg_bay]=findArm(fb,rx1,rx2); int bay1=-neg_bay;\n    auto[rms,ray1,ray2,rax2]=findArm(fright,ry1,ry2);\n    auto[ls,lay1,lay2,neg_lax]=findArm(fl,ry1,ry2); int lax1=-neg_lax;\n    // Perimeter budget\n    int P_base=2*(rx2-rx1)+2*(ry2-ry1);\n    int budget=400000-P_base;\n    // Arm validity (strict interior to avoid duplicate vertices)\n    bool ht=ts>0&&tax1>rx1&&tax2<rx2&&tax1<tax2&&tay2>ry2;\n    bool hb=bms>0&&bax1>rx1&&bax2<rx2&&bax1<bax2&&bay1<ry1;\n    bool hr=rms>0&&ray1>ry1&&ray2<ry2&&ray1<ray2&&rax2>rx2;\n    bool hl=ls>0&&lay1>ry1&&lay2<ry2&&lay1<lay2&&lax1<rx1;\n    int ct=ht?2*(tay2-ry2):0;\n    int cb=hb?2*(ry1-bay1):0;\n    int cr2=hr?2*(rax2-rx2):0;\n    int cl=hl?2*(rx1-lax1):0;\n    int total_cost=ct+cb+cr2+cl;\n    // If over budget, disable worst arms by score/cost\n    if(total_cost>budget){\n        vector<pair<double,int>> eff;\n        if(ht&&ct>0)eff.push_back({(double)ts/ct,0});\n        if(hb&&cb>0)eff.push_back({(double)bms/cb,1});\n        if(hr&&cr2>0)eff.push_back({(double)rms/cr2,2});\n        if(hl&&cl>0)eff.push_back({(double)ls/cl,3});\n        sort(eff.begin(),eff.end());\n        for(auto&[e,idx]:eff){\n            if(total_cost<=budget)break;\n            if(idx==0){ht=false;total_cost-=ct;}\n            else if(idx==1){hb=false;total_cost-=cb;}\n            else if(idx==2){hr=false;total_cost-=cr2;}\n            else{hl=false;total_cost-=cl;}\n        }\n    }\n    int combined=gscore+(ht?ts:0)+(hb?bms:0)+(hr?rms:0)+(hl?ls:0);\n    if(combined>=1){\n        vector<pair<int,int>> v;\n        // Bottom edge\n        v.push_back({rx1,ry1});\n        if(hb){if(bax1>rx1)v.push_back({bax1,ry1});v.push_back({bax1,bay1});v.push_back({bax2,bay1});if(bax2<rx2)v.push_back({bax2,ry1});}\n        v.push_back({rx2,ry1});\n        // Right edge\n        if(hr){if(ray1>ry1)v.push_back({rx2,ray1});v.push_back({rax2,ray1});v.push_back({rax2,ray2});if(ray2<ry2)v.push_back({rx2,ray2});}\n        v.push_back({rx2,ry2});\n        // Top edge (going left)\n        if(ht){if(tax2<rx2)v.push_back({tax2,ry2});v.push_back({tax2,tay2});v.push_back({tax1,tay2});if(tax1>rx1)v.push_back({tax1,ry2});}\n        v.push_back({rx1,ry2});\n        // Left edge (going down)\n        if(hl){if(lay2<ry2)v.push_back({rx1,lay2});v.push_back({lax1,lay2});v.push_back({lax1,lay1});if(lay1>ry1)v.push_back({rx1,lay1});}\n        // Remove consecutive duplicates\n        vector<pair<int,int>> res;\n        for(auto&p:v){if(res.empty()||res.back()!=p)res.push_back(p);}\n        while(res.size()>1&&res.front()==res.back())res.pop_back();\n        // Check all distinct\n        set<pair<int,int>> vs(res.begin(),res.end());\n        bool ok=(int)vs.size()==(int)res.size()&&(int)res.size()>=4;\n        if(ok){\n            cout<<(int)res.size()<<\"\\n\";\n            for(auto&[x,y]:res)cout<<x<<\" \"<<y<<\"\\n\";\n            return 0;\n        }\n    }\n    // Fallback: output base rectangle\n    if(gscore>=1){\n        if(rx1>=rx2){if(rx2<CMAX)rx2++;else rx1--;}\n        if(ry1>=ry2){if(ry2<CMAX)ry2++;else ry1--;}\n        cout<<4<<\"\\n\"<<rx1<<\" \"<<ry1<<\"\\n\"<<rx2<<\" \"<<ry1<<\"\\n\"<<rx2<<\" \"<<ry2<<\"\\n\"<<rx1<<\" \"<<ry2<<\"\\n\";\n    }\n    return 0;\n}","ahc040":"#pragma GCC optimize(\"O3,unroll-loops\")\n#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint N, T;\nvector<double> W, H;\ndouble sW, sH, mxW, mxH, totA;\n\nstruct Op { int p, r; char d; int b; };\n\npair<ll,ll> simulate(const vector<Op>& ops) {\n    vector<ll> x0(N,0),y0(N,0),x1(N,0),y1(N,0);\n    vector<bool> pl(N,false);\n    for (const auto& o : ops) {\n        int p = o.p;\n        ll w = max(1LL, llround(o.r ? H[p] : W[p]));\n        ll h = max(1LL, llround(o.r ? W[p] : H[p]));\n        if (o.d == 'U') {\n            ll xl = o.b >= 0 ? x1[o.b] : 0LL;\n            ll yt = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && x0[i] < xl+w && x1[i] > xl)\n                    yt = max(yt, y1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        } else {\n            ll yt = o.b >= 0 ? y1[o.b] : 0LL;\n            ll xl = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && y0[i] < yt+h && y1[i] > yt)\n                    xl = max(xl, x1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        }\n        pl[p] = true;\n    }\n    ll rW=0, rH=0;\n    for (int i = 0; i < N; i++)\n        if (pl[i]) { rW=max(rW,x1[i]); rH=max(rH,y1[i]); }\n    return {rW, rH};\n}\n\n// col=false: shelf packing (rows); col=true: column packing\n// For col=false, line0 uses U, rest use L\n// For col=true,  line0 uses L, rest use U\nvector<Op> make_pack(const vector<int>& rot, double tgt, bool col) {\n    vector<Op> ops; ops.reserve(N);\n    int cl = -1; double cm = 0;\n    vector<int> lr; vector<double> lc;\n    int p0 = -1;\n    for (int i = 0; i < N; i++) {\n        double m = col ? (rot[i] ? W[i] : H[i]) : (rot[i] ? H[i] : W[i]);\n        double c = col ? (rot[i] ? H[i] : W[i]) : (rot[i] ? W[i] : H[i]);\n        if (cl < 0 || cm + m > tgt) {\n            cl++; cm = m;\n            lr.push_back(i); lc.push_back(c);\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', -1});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        } else {\n            cm += m;\n            if (c > lc[cl]) { lc[cl]=c; lr[cl]=i; }\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', p0});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        }\n    }\n    return ops;\n}\n\ndouble calc_score(const vector<int>& rot, double tgt, bool col) {\n    auto [a,b] = simulate(make_pack(rot, tgt, col));\n    return (double)(a+b);\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    double sigma;\n    cin >> N >> T >> sigma;\n    W.resize(N); H.resize(N);\n    for (int i = 0; i < N; i++) cin >> W[i] >> H[i];\n\n    sW=sH=mxW=mxH=totA=0;\n    for (int i = 0; i < N; i++) {\n        sW+=W[i]; sH+=H[i];\n        mxW=max(mxW,W[i]); mxH=max(mxH,H[i]);\n        totA+=W[i]*H[i];\n    }\n\n    const double BUDGET = 2600.0;\n    auto t0 = chrono::steady_clock::now();\n    auto now = [&]() {\n        return chrono::duration<double,milli>(chrono::steady_clock::now()-t0).count();\n    };\n\n    vector<int> g_rot;\n    double g_tgt=0, g_score=1e18;\n    bool g_col=false;\n\n    for (int t = 0; t < T; t++) {\n        double ts = now();\n        double per = max(1.0, (BUDGET - ts) / (T - t));\n        double dl = ts + per * 0.95;\n\n        mt19937 rng(t * 1234567891u ^ 987654321u);\n        uniform_real_distribution<double> uni(0,1);\n\n        bool col;\n        double lo, hi, tgt;\n        vector<int> rot(N);\n\n        if (t < (T+1)/2) {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            // Init rotation: minimize cross-dim\n            for (int i = 0; i < N; i++)\n                rot[i] = col ? (H[i]<W[i] ? 1:0) : (W[i]<H[i] ? 1:0);\n            int nf = max(1, (int)sqrt((double)t+0.1));\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.4)));\n        } else if (g_score < 1e17) {\n            rot=g_rot; col=g_col; tgt=g_tgt;\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            int nf = max(1, N/8);\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.12)));\n        } else {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            for (int i = 0; i < N; i++) rot[i] = rng()%2;\n        }\n\n        // Greedy rotation improvement\n        double cur = calc_score(rot, tgt, col);\n        for (int i = 0; i < N; i++) {\n            rot[i] ^= 1;\n            double ns = calc_score(rot, tgt, col);\n            if (ns < cur) cur = ns;\n            else rot[i] ^= 1;\n        }\n\n        vector<int> br=rot;\n        double bt=tgt;\n        bool bc=col;\n        double bs=cur;\n\n        double Th = cur*0.05+1.0;\n        double Tl = max(1.0, cur*1e-5);\n\n        // Simulated Annealing\n        for (int it=0; ; it++) {\n            if ((it&63)==0 && now()>=dl) break;\n            double frac = max(0.0, min(1.0, (now()-ts)/per));\n            double Tc = max(Tl, Th * pow(Tl/Th, frac));\n\n            int mv = rng()%10, fi=-1;\n            double ot=tgt;\n            bool oc=col;\n            double olo=lo, ohi=hi;\n\n            if (mv < 7) {\n                fi = rng()%N;\n                rot[fi] ^= 1;\n            } else if (mv < 9) {\n                tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.35)));\n            } else {\n                col ^= 1;\n                lo = col ? mxH : mxW;\n                hi = col ? sH  : sW;\n                tgt = max(lo, min(hi, ot));\n            }\n\n            double ns = calc_score(rot, tgt, col);\n            double d = ns - cur;\n            if (d <= 0 || uni(rng) < exp(-d/Tc)) {\n                cur = ns;\n                if (ns < bs) { bs=ns; br=rot; bt=tgt; bc=col; }\n            } else {\n                if (fi >= 0) rot[fi] ^= 1;\n                else if (mv < 9) tgt = ot;\n                else { col=oc; lo=olo; hi=ohi; tgt=ot; }\n            }\n        }\n\n        // Final greedy passes\n        for (int pass=0; pass<3; pass++) {\n            bool imp=false;\n            for (int i=0; i<N; i++) {\n                br[i] ^= 1;\n                double ns = calc_score(br, bt, bc);\n                if (ns < bs) { bs=ns; imp=true; }\n                else br[i] ^= 1;\n            }\n            if (!imp) break;\n        }\n\n        if (bs < g_score) { g_score=bs; g_rot=br; g_tgt=bt; g_col=bc; }\n\n        auto ops = make_pack(br, bt, bc);\n        cout << (int)ops.size() << \"\\n\";\n        for (const auto& op : ops)\n            cout << op.p << \" \" << op.r << \" \" << op.d << \" \" << op.b << \"\\n\";\n        cout.flush();\n\n        ll Wf, Hf;\n        cin >> Wf >> Hf;\n    }\n\n    return 0;\n}","ahc041":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\nint N,M,H,A[1000];\nvector<int>G[1000];\nint par[1000],dep[1000],ssm[1000],mdn[1000];\nvector<int>ch[1000];\nvoid dfs_init(int v){ssm[v]=A[v];mdn[v]=0;for(int c:ch[v]){dfs_init(c);ssm[v]+=ssm[c];mdn[v]=max(mdn[v],mdn[c]+1);}}\nvoid push_dep(int v,int d){dep[v]=d;for(int c:ch[v])push_dep(c,d+1);}\nbool in_sub(int w,int v){for(;w!=-1;w=par[w])if(w==v)return true;return false;}\nvoid pull_ssm(int v){for(;v!=-1;v=par[v]){int s=A[v];for(int c:ch[v])s+=ssm[c];ssm[v]=s;}}\nvoid pull_mdn(int v){for(;v!=-1;v=par[v]){int m=0;for(int c:ch[v])m=max(m,mdn[c]+1);mdn[v]=m;}}\nvoid do_move(int v,int np){int op=par[v];if(op!=-1){auto&c=ch[op];c.erase(find(c.begin(),c.end(),v));}par[v]=np;if(np!=-1){ch[np].push_back(v);push_dep(v,dep[np]+1);}else push_dep(v,0);if(op!=-1){pull_ssm(op);pull_mdn(op);}if(np!=-1){pull_ssm(np);pull_mdn(np);}}\nvoid rebuild(){for(int i=0;i<N;i++)ch[i].clear();fill(dep,dep+N,0);for(int v=0;v<N;v++)if(par[v]!=-1)ch[par[v]].push_back(v);for(int v=0;v<N;v++)if(par[v]==-1){queue<int>q;q.push(v);while(!q.empty()){int u=q.front();q.pop();for(int c:ch[u]){dep[c]=dep[u]+1;q.push(c);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nll compute_score(){ll s=0;for(int i=0;i<N;i++)s+=(ll)(dep[i]+1)*A[i];return s;}\nvoid run_greedy(mt19937&rng){for(;;){bool ok=false;vector<int>p(N);iota(p.begin(),p.end(),0);shuffle(p.begin(),p.end(),rng);for(int v:p){int lim=H-1-mdn[v];if(lim<0)continue;int bp=par[v];ll bg=0;for(int w:G[v]){if(dep[w]>lim||in_sub(w,v))continue;ll g=(ll)(dep[w]+1-dep[v])*ssm[v];if(g>bg){bg=g;bp=w;}}if(bg>0){do_move(v,bp);ok=true;}}if(!ok)break;}}\nvoid build_bfs(vector<int>&ord){fill(par,par+N,-1);fill(dep,dep+N,0);for(int i=0;i<N;i++)ch[i].clear();vector<bool>vis(N,false);for(int s:ord){if(vis[s])continue;queue<int>q;q.push(s);vis[s]=true;while(!q.empty()){int v=q.front();q.pop();if(dep[v]>=H)continue;for(int u:G[v])if(!vis[u]){vis[u]=true;par[u]=v;dep[u]=dep[v]+1;ch[v].push_back(u);q.push(u);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>H;for(int i=0;i<N;i++)cin>>A[i];\n    for(int i=0;i<M;i++){int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}\n    for(int i=0;i<N;i++){int x,y;cin>>x>>y;}\n    auto t0=chrono::steady_clock::now();\n    mt19937 rng(42);\n    ll best_sc=-1;vector<int>best_par(N);\n    for(int trial=0;;trial++){\n        if(chrono::duration<double>(chrono::steady_clock::now()-t0).count()>0.3)break;\n        vector<int>ord(N);iota(ord.begin(),ord.end(),0);\n        if(trial==0)sort(ord.begin(),ord.end(),[](int a,int b){return A[a]<A[b];});\n        else shuffle(ord.begin(),ord.end(),rng);\n        build_bfs(ord);run_greedy(rng);\n        ll sc=compute_score();if(sc>best_sc){best_sc=sc;copy(par,par+N,best_par.begin());}\n    }\n    copy(best_par.begin(),best_par.end(),par);rebuild();\n    ll cur=best_sc;\n    uniform_real_distribution<double>uni(0,1);\n    auto ts=chrono::steady_clock::now();\n    double sa_t=1.80-chrono::duration<double>(ts-t0).count();\n    if(sa_t<0.05)sa_t=0.05;\n    double T=1000;\n    for(long long step=0;;step++){\n        if(step%10000==0){double t=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(t>=sa_t)break;T=1000*pow(0.001,t/sa_t);}\n        int v=rng()%N;int lim=H-1-mdn[v];if(lim<0)continue;\n        if(G[v].empty())continue;int w=G[v][rng()%G[v].size()];\n        if(w==par[v]||dep[w]>lim||in_sub(w,v))continue;\n        ll gain=(ll)(dep[w]+1-dep[v])*ssm[v];\n        if(gain>0||(T>0.01&&uni(rng)<exp((double)gain/T))){\n            do_move(v,w);cur+=gain;\n            if(cur>best_sc){best_sc=cur;copy(par,par+N,best_par.begin());}\n        }\n    }\n    for(int v=0;v<N;v++){if(v)cout<<' ';cout<<best_par[v];}cout<<'\\n';\n}","ahc042":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,OR_[42],OC_[42],ctop_[21],cbot_[21],rleft_[21],rright_[21];\nint gcost(int d,int dep){return(d==0||d==2)?2*(dep+1):2*(N-dep);}\nint odep(int k,int d){return(d<=1)?OR_[k]:OC_[k];}\nint ad_[42],ax_[42];\nvector<int>gv[4][21];\nvoid ins(int d,int ax,int v){auto&vec=gv[d][ax];vec.insert(lower_bound(vec.begin(),vec.end(),v),v);}\nvoid del(int d,int ax,int v){auto&vec=gv[d][ax];vec.erase(lower_bound(vec.begin(),vec.end(),v));}\nint gcv(int d,int ax){if(gv[d][ax].empty())return 0;return gcost(d,(d==0||d==2)?gv[d][ax].back():gv[d][ax].front());}\nbool vgrp(int k,int d,int ax){int r=OR_[k],c=OC_[k],kd=(d<=1)?r:c;if(d==0)return ax==c&&kd<ctop_[ax];if(d==1)return ax==c&&kd>cbot_[ax];if(d==2)return ax==r&&kd<rleft_[ax];return ax==r&&kd>rright_[ax];}\nint tc(){int t=0;for(int d=0;d<4;d++)for(int i=0;i<N;i++)t+=gcv(d,i);return t;}\nint g1(int k,int nd,int nx){if((ad_[k]==nd&&ax_[k]==nx)||!vgrp(k,nd,nx))return 0;int od=ad_[k],ox=ax_[k],kdo=odep(k,od),ndo=odep(k,nd);int oc=gcv(od,ox)+gcv(nd,nx);del(od,ox,kdo);ins(nd,nx,ndo);int nc=gcv(od,ox)+gcv(nd,nx);ins(od,ox,kdo);del(nd,nx,ndo);return oc-nc;}\nint g2(int a,int b,int nd,int nx){if(!vgrp(a,nd,nx)||!vgrp(b,nd,nx))return 0;bool at=(ad_[a]==nd&&ax_[a]==nx),bt=(ad_[b]==nd&&ax_[b]==nx);if(at&&bt)return 0;if(at)return g1(b,nd,nx);if(bt)return g1(a,nd,nx);int da=ad_[a],dax=ax_[a],db=ad_[b],dbx=ax_[b];bool sm=(da==db&&dax==dbx);int oc=gcv(da,dax);if(!sm)oc+=gcv(db,dbx);oc+=gcv(nd,nx);int ao=odep(a,da),bo=odep(b,db),an=odep(a,nd),bn=odep(b,nd);del(da,dax,ao);del(db,dbx,bo);ins(nd,nx,an);ins(nd,nx,bn);int nc=gcv(da,dax);if(!sm)nc+=gcv(db,dbx);nc+=gcv(nd,nx);del(nd,nx,an);del(nd,nx,bn);ins(da,dax,ao);ins(db,dbx,bo);return oc-nc;}\nvoid mv1(int k,int nd,int nx){del(ad_[k],ax_[k],odep(k,ad_[k]));ad_[k]=nd;ax_[k]=nx;ins(nd,nx,odep(k,nd));}\nvoid mv2(int a,int b,int nd,int nx){del(ad_[a],ax_[a],odep(a,ad_[a]));del(ad_[b],ax_[b],odep(b,ad_[b]));ad_[a]=nd;ax_[a]=nx;ad_[b]=nd;ax_[b]=nx;ins(nd,nx,odep(a,nd));ins(nd,nx,odep(b,nd));}\nvector<int>co[21],ro[21];\nvoid ls(){bool imp=true;while(imp){imp=false;int bg=0,bt=-1,bk=-1,ba=-1,bb=-1,bd=-1,bx=-1;for(int k=0;k<M;k++){int r=OR_[k],c=OC_[k];auto t=[&](int d,int ax){int gg=g1(k,d,ax);if(gg>bg){bg=gg;bt=1;bk=k;bd=d;bx=ax;}};if(r<ctop_[c])t(0,c);if(r>cbot_[c])t(1,c);if(c<rleft_[r])t(2,r);if(c>rright_[r])t(3,r);}for(int j=0;j<N;j++){int n=co[j].size();for(int ai=0;ai<n;ai++)for(int bi=ai+1;bi<n;bi++){int a=co[j][ai],b=co[j][bi];auto t=[&](int d,int ax){int gg=g2(a,b,d,ax);if(gg>bg){bg=gg;bt=2;ba=a;bb=b;bd=d;bx=ax;}};t(0,j);t(1,j);}}for(int i=0;i<N;i++){int n=ro[i].size();for(int ai=0;ai<n;ai++)for(int bi=ai+1;bi<n;bi++){int a=ro[i][ai],b=ro[i][bi];auto t=[&](int d,int ax){int gg=g2(a,b,d,ax);if(gg>bg){bg=gg;bt=2;ba=a;bb=b;bd=d;bx=ax;}};t(2,i);t(3,i);}}if(bg>0){if(bt==1)mv1(bk,bd,bx);else mv2(ba,bb,bd,bx);imp=true;}}}\nint main(){ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N;vector<string>brd(N);for(int i=0;i<N;i++)cin>>brd[i];M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(brd[i][j]=='x'){OR_[M]=i;OC_[M]=j;M++;}if(!M)return 0;fill(ctop_,ctop_+N,N);fill(cbot_,cbot_+N,-1);fill(rleft_,rleft_+N,N);fill(rright_,rright_+N,-1);for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(brd[i][j]=='o'){ctop_[j]=min(ctop_[j],i);cbot_[j]=max(cbot_[j],i);rleft_[i]=min(rleft_[i],j);rright_[i]=max(rright_[i],j);}for(int k=0;k<M;k++){co[OC_[k]].push_back(k);ro[OR_[k]].push_back(k);}\nmt19937 rng(42);int bc=INT_MAX;int bad[42],bax[42];\nfor(int trial=0;trial<30;trial++){for(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int ki=0;ki<M;ki++){int r=OR_[ki],c=OC_[ki];vector<pair<int,int>>opts;if(r<ctop_[c])opts.push_back({0,c});if(r>cbot_[c])opts.push_back({1,c});if(c<rleft_[r])opts.push_back({2,r});if(c>rright_[r])opts.push_back({3,r});int gd,gax;if(trial==0){int bcc=INT_MAX;gd=-1;gax=-1;for(auto[d,ax]:opts){int cc=gcost(d,odep(ki,d));if(cc<bcc){bcc=cc;gd=d;gax=ax;}}}else{auto[d,ax]=opts[rng()%opts.size()];gd=d;gax=ax;}ad_[ki]=gd;ax_[ki]=gax;ins(gd,gax,odep(ki,gd));}ls();int t=tc();if(t<bc){bc=t;for(int k=0;k<M;k++){bad[k]=ad_[k];bax[k]=ax_[k];}}}\nfor(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int k=0;k<M;k++){ad_[k]=bad[k];ax_[k]=bax[k];ins(ad_[k],ax_[k],odep(k,ad_[k]));}\nconst char dirs[]=\"UDLR\",revs[]=\"DURL\";for(int d=0;d<4;d++)for(int ax=0;ax<N;ax++){if(gv[d][ax].empty())continue;int rep=(d==0||d==2)?gv[d][ax].back():gv[d][ax].front();int s=(d==0||d==2)?rep+1:N-rep;for(int k=0;k<s;k++)cout<<dirs[d]<<' '<<ax<<'\\n';for(int k=0;k<s;k++)cout<<revs[d]<<' '<<ax<<'\\n';}return 0;}","ahc044":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=100;\nint N,L,T[MAXN],a[MAXN],b[MAXN],cv[MAXN],fv[MAXN],flow[MAXN];\nvoid computeFlow(){fill(flow,flow+N,0);for(int i=0;i<N;i++){flow[a[i]]+=cv[i];flow[b[i]]+=fv[i];}flow[0]++;}\nlong long flowErr(){long long e=0;for(int j=0;j<N;j++)e+=abs(flow[j]-T[j]);return e;}\nbool checkFwd(){bool vis[MAXN]={};int q[MAXN],qh=0,qt=0;vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];if(!vis[a[x]]){vis[a[x]]=true;q[qt++]=a[x];}if(!vis[b[x]]){vis[b[x]]=true;q[qt++]=b[x];}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nbool checkBwd(){if(T[0]==0)return true;static int rl[MAXN][2*MAXN],rc[MAXN];static bool vis[MAXN];int q[MAXN],qh=0,qt=0;fill(rc,rc+N,0);for(int i=0;i<N;i++){rl[a[i]][rc[a[i]]++]=i;rl[b[i]][rc[b[i]]++]=i;}fill(vis,vis+N,false);vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];for(int k=0;k<rc[x];k++){int y=rl[x][k];if(!vis[y]){vis[y]=true;q[qt++]=y;}}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nvoid fixFwdConn(){for(int pass=0;pass<N;pass++){bool vis[MAXN]={};int q[MAXN],qh=0,qt=0;vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];if(!vis[a[x]]){vis[a[x]]=true;q[qt++]=a[x];}if(!vis[b[x]]){vis[b[x]]=true;q[qt++]=b[x];}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bd=(long long)4e18;int bi=-1;bool bA=false;for(int i=0;i<N;i++){if(!vis[i])continue;if(a[i]!=u){int oa=a[i],w=cv[i];long long d=(w>0)?((long long)(abs(flow[oa]-w-T[oa])-abs(flow[oa]-T[oa]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bd){bd=d;bi=i;bA=true;}}if(b[i]!=u){int ob=b[i],w=fv[i];long long d=(w>0)?((long long)(abs(flow[ob]-w-T[ob])-abs(flow[ob]-T[ob]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bd){bd=d;bi=i;bA=false;}}}if(bi<0)break;if(bA){if(cv[bi]>0){flow[a[bi]]-=cv[bi];flow[u]+=cv[bi];}a[bi]=u;}else{if(fv[bi]>0){flow[b[bi]]-=fv[bi];flow[u]+=fv[bi];}b[bi]=u;}}}\nvoid fixBwdConn(){if(T[0]==0)return;for(int pass=0;pass<N;pass++){static int rl[MAXN][2*MAXN],rc[MAXN];static bool vis[MAXN];int q[MAXN],qh=0,qt=0;fill(rc,rc+N,0);for(int i=0;i<N;i++){rl[a[i]][rc[a[i]]++]=i;rl[b[i]][rc[b[i]]++]=i;}fill(vis,vis+N,false);vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];for(int k=0;k<rc[x];k++){int y=rl[x][k];if(!vis[y]){vis[y]=true;q[qt++]=y;}}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bd=(long long)4e18;int bk=-1;bool bA=false;for(int k=0;k<N;k++){if(!vis[k])continue;if(a[u]!=k){int oa=a[u];a[u]=k;bool fok=checkFwd();a[u]=oa;if(!fok)continue;int w=cv[u];long long d=(w>0)?((long long)(abs(flow[oa]-w-T[oa])-abs(flow[oa]-T[oa]))+(long long)(abs(flow[k]+w-T[k])-abs(flow[k]-T[k]))):0LL;if(d<bd){bd=d;bk=k;bA=true;}}if(b[u]!=k){int ob=b[u];b[u]=k;bool fok=checkFwd();b[u]=ob;if(!fok)continue;int w=fv[u];long long d=(w>0)?((long long)(abs(flow[ob]-w-T[ob])-abs(flow[ob]-T[ob]))+(long long)(abs(flow[k]+w-T[k])-abs(flow[k]-T[k]))):0LL;if(d<bd){bd=d;bk=k;bA=false;}}}if(bk<0)break;if(bA){if(cv[u]>0){flow[a[u]]-=cv[u];flow[bk]+=cv[u];}a[u]=bk;}else{if(fv[u]>0){flow[b[u]]-=fv[u];flow[bk]+=fv[u];}b[u]=bk;}}}\n// Fast flow search - NO connectivity check (O(N^3) total)\nvoid flowSearch(){long long ce=flowErr();bool imp=true;while(imp){imp=false;for(int i=0;i<N;i++)for(int t2=0;t2<2;t2++){int old=t2?b[i]:a[i],w=t2?fv[i]:cv[i];int bj=-1;long long bd=0;for(int j=0;j<N;j++){if(j==old)continue;long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[j]+w-T[j])-abs(flow[j]-T[j]))):0LL;if(d<bd){bd=d;bj=j;}}if(bj>=0){if(w>0){flow[old]-=w;flow[bj]+=w;}ce+=bd;if(t2)b[i]=bj;else a[i]=bj;imp=true;}}}}\nlong long simulateFull(int co[],int od[],int ed[]){int cnt[MAXN]={},vc[MAXN]={};fill(od,od+N,0);fill(ed,ed+N,0);int cur=0;cnt[0]=vc[0]=1;for(int w=2;w<=L;w++){if(vc[cur]&1){od[cur]++;cur=a[cur];}else{ed[cur]++;cur=b[cur];}cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++){co[j]=cnt[j];e+=abs(cnt[j]-T[j]);}return e;}\nlong long simulate(){int cnt[MAXN]={},vc[MAXN]={};int cur=0;cnt[0]=vc[0]=1;for(int w=2;w<=L;w++){int nxt=(vc[cur]&1)?a[cur]:b[cur];cur=nxt;cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++)e+=abs(cnt[j]-T[j]);return e;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>L;for(int i=0;i<N;i++)cin>>T[i];\n    for(int i=0;i<N;i++){cv[i]=(T[i]+1)/2;fv[i]=T[i]/2;}\n    for(int i=0;i<N;i++)a[i]=b[i]=0;\n    vector<tuple<int,int,int>>items;\n    for(int i=0;i<N;i++){items.emplace_back(cv[i],0,i);items.emplace_back(fv[i],1,i);}\n    sort(items.rbegin(),items.rend());\n    int rem[MAXN];for(int j=0;j<N;j++)rem[j]=T[j];if(rem[0]>0)rem[0]--;\n    priority_queue<pair<int,int>>pq;for(int j=0;j<N;j++)pq.push({rem[j],j});\n    for(auto&[w,type,emp]:items){auto[cap,bin]=pq.top();pq.pop();if(type==0)a[emp]=bin;else b[emp]=bin;rem[bin]-=w;pq.push({rem[bin],bin});}\n    computeFlow();\n    flowSearch();\n    fixFwdConn();flowSearch();\n    fixBwdConn();flowSearch();\n    fixFwdConn();\n    int co[MAXN],od[MAXN],ed[MAXN];\n    long long curErr=simulateFull(co,od,ed);\n    long long bestErr=curErr;\n    int ba[MAXN],bb[MAXN];copy(a,a+N,ba);copy(b,b+N,bb);\n    mt19937 rng(42);\n    auto t0=chrono::steady_clock::now();\n    auto el=[&](){return chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now()-t0).count();};\n    struct Cand{long long d;int i,t,j;bool operator<(const Cand&o)const{return d<o.d;}};\n    vector<Cand>cands;cands.reserve(20001);\n    int noImp=0;\n    while(el()<1750000LL){\n        cands.clear();\n        for(int i=0;i<N;i++){\n            if(od[i]>0){int oj=a[i];for(int j=0;j<N;j++){if(j==oj)continue;long long d2=(long long)(abs(co[oj]-od[i]-T[oj])-abs(co[oj]-T[oj]))+(long long)(abs(co[j]+od[i]-T[j])-abs(co[j]-T[j]));cands.push_back({d2,i,0,j});}}\n            if(ed[i]>0){int oj=b[i];for(int j=0;j<N;j++){if(j==oj)continue;long long d2=(long long)(abs(co[oj]-ed[i]-T[oj])-abs(co[oj]-T[oj]))+(long long)(abs(co[j]+ed[i]-T[j])-abs(co[j]-T[j]));cands.push_back({d2,i,1,j});}}\n        }\n        int K=min((int)cands.size(),50);\n        if(K>0)partial_sort(cands.begin(),cands.begin()+K,cands.end());\n        bool found=false;\n        for(int k=0;k<K&&!found;k++){\n            auto&[d2,i,t,j]=cands[k];int&ptr=t?b[i]:a[i];int old=ptr;ptr=j;\n            if(!checkFwd()){ptr=old;continue;}\n            long long err=simulate();\n            if(err<curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}curErr=simulateFull(co,od,ed);found=true;}\n            else ptr=old;\n        }\n        if(!found)for(int att=0;att<20&&!found;att++){\n            int i=rng()%N,t=rng()%2,j=(int)(rng()%N);int&ptr=t?b[i]:a[i];int old=ptr;\n            if(j==old)continue;ptr=j;\n            if(!checkFwd()){ptr=old;continue;}\n            long long err=simulate();\n            if(err<curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}curErr=simulateFull(co,od,ed);found=true;}\n            else ptr=old;\n        }\n        if(found)noImp=0;\n        else{noImp++;\n            if(noImp>=15){\n                for(int p=0;p<5;p++){int i=rng()%N,t=rng()%2,j=(int)(rng()%N);if(t)b[i]=j;else a[i]=j;}\n                if(!checkFwd()){copy(ba,ba+N,a);copy(bb,bb+N,b);}\n                curErr=simulateFull(co,od,ed);\n                if(curErr<bestErr){bestErr=curErr;copy(a,a+N,ba);copy(b,b+N,bb);}\n                noImp=0;\n            }\n        }\n    }\n    copy(ba,ba+N,a);copy(bb,bb+N,b);\n    for(int i=0;i<N;i++)cout<<a[i]<<\" \"<<b[i]<<\"\\n\";\n    return 0;\n}","ahc045":"#include <bits/stdc++.h>\nusing namespace std;\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,Q,L,W; cin>>N>>M>>Q>>L>>W;\n    vector<int> G(M); for(int& g:G) cin>>g;\n    vector<double> cx(N),cy(N);\n    for(int i=0;i<N;i++){int lx,rx,ly,ry;cin>>lx>>rx>>ly>>ry;cx[i]=(lx+rx)/2.0;cy[i]=(ly+ry)/2.0;}\n    auto ed2=[&](int a,int b)->double{double dx=cx[a]-cx[b],dy=cy[a]-cy[b];return dx*dx+dy*dy;};\n    // Global MST\n    vector<int> mpar(N,-1);\n    {vector<bool> vis(N,false);vector<double> key(N,1e18);key[0]=0;\n    for(int it=0;it<N;it++){int u=-1;for(int v=0;v<N;v++)if(!vis[v]&&(u==-1||key[v]<key[u]))u=v;\n    vis[u]=true;for(int v=0;v<N;v++)if(!vis[v]){double d=ed2(u,v);if(d<key[v]){key[v]=d;mpar[v]=u;}}}}\n    vector<vector<int>> mch(N);for(int v=1;v<N;v++)mch[mpar[v]].push_back(v);\n    // Post-order DFS\n    vector<int> post;{stack<pair<int,int>> stk;stk.push({0,0});while(!stk.empty()){auto&[v,ci]=stk.top();if(ci<(int)mch[v].size())stk.push({mch[v][ci++],0});else{post.push_back(v);stk.pop();}}}\n    // Greedy cut\n    vector<int> esz(N);vector<bool> scut(N,false);bool use_mst=false;\n    {multiset<int> rg(G.begin(),G.end());\n    for(int v:post){esz[v]=1;for(int c:mch[v])if(!scut[c])esz[v]+=esz[c];if(v!=0&&rg.count(esz[v])){scut[v]=true;rg.erase(rg.find(esz[v]));}}\n    use_mst=(rg.size()==1&&*rg.begin()==esz[0]);}\n    // Group assignment\n    vector<vector<int>> groups(M);\n    {map<int,queue<int>> sg;for(int i=0;i<M;i++)sg[G[i]].push(i);\n    if(use_mst){vector<bool> asn(N,false);\n    for(int v:post){if(v==0||!scut[v])continue;int gid=sg[esz[v]].front();sg[esz[v]].pop();queue<int>q;q.push(v);while(!q.empty()){int u=q.front();q.pop();if(asn[u])continue;groups[gid].push_back(u);asn[u]=true;for(int c:mch[u])if(!asn[c])q.push(c);}}\n    int gid=sg[esz[0]].front();sg[esz[0]].pop();for(int v=0;v<N;v++)if(!asn[v])groups[gid].push_back(v);}\n    else{auto eb=[](uint32_t x)->uint64_t{uint64_t r=0;for(int i=0;i<16;i++)r|=((uint64_t)((x>>i)&1))<<(2*i);return r;};\n    vector<int> ord(N);iota(ord.begin(),ord.end(),0);sort(ord.begin(),ord.end(),[&](int a,int b){return(eb((uint32_t)cx[a])|(eb((uint32_t)cy[a])<<1))<(eb((uint32_t)cx[b])|(eb((uint32_t)cy[b])<<1));});\n    int p=0;for(int i=0;i<M;i++){groups[i].assign(ord.begin()+p,ord.begin()+p+G[i]);p+=G[i];}}}\n    // NN path + 2-opt\n    vector<vector<int>> sc(M);\n    for(int i=0;i<M;i++){int g=G[i];auto&v=groups[i];if(g<=1){sc[i]=v;continue;}\n    vector<bool> used(g,false);int s0=0;for(int k=1;k<g;k++)if(cx[v[k]]<cx[v[s0]])s0=k;\n    sc[i].reserve(g);sc[i].push_back(v[s0]);used[s0]=true;\n    for(int k=1;k<g;k++){int cur=sc[i].back();double best=1e18;int bj=-1;for(int j=0;j<g;j++)if(!used[j]){double d=ed2(cur,v[j]);if(d<best){best=d;bj=j;}}sc[i].push_back(v[bj]);used[bj]=true;}\n    for(int it=0;it<3;it++){bool imp=false;for(int a=0;a<g-1;a++)for(int b=a+2;b<g;b++){double dold=ed2(sc[i][a],sc[i][a+1]);if(b+1<g)dold+=ed2(sc[i][b],sc[i][b+1]);double dnew=ed2(sc[i][a],sc[i][b]);if(b+1<g)dnew+=ed2(sc[i][a+1],sc[i][b+1]);if(dnew<dold-1e-9){reverse(sc[i].begin()+a+1,sc[i].begin()+b+1);imp=true;}}if(!imp)break;}}\n    // Queries\n    int qrem=Q;vector<vector<pair<double,pair<int,int>>>> ae(M);\n    auto dq=[&](const vector<int>&qc,int gi){if((int)qc.size()<2||qrem<=0)return;qrem--;cout<<\"? \"<<qc.size();for(int c:qc)cout<<\" \"<<c;cout<<\"\\n\"<<flush;for(int k=0;k+1<(int)qc.size();k++){int a,b;cin>>a>>b;ae[gi].push_back({ed2(a,b),{a,b}});}};\n    auto nw=[&](int g)->int{if(g<=1)return 0;if(g<=L)return 1;return(g-2)/(L-1)+1;};\n    int tmand=0;for(int i=0;i<M;i++)tmand+=nw(G[i]);int xtra=Q-tmand;\n    // Sliding window\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;if(g<=L){dq(sc[i],i);continue;}\n    int st=0;while(true){int en=min(st+L,g);bool last=(en>=g);if(last&&en-st<L){st=g-L;en=g;}dq(vector<int>(sc[i].begin()+st,sc[i].begin()+en),i);if(last)break;st+=L-1;}}\n    // Extra strided\n    {vector<int> lg;for(int i=0;i<M;i++)if(G[i]>L)lg.push_back(i);\n    if(!lg.empty()&&xtra>0)for(int qi=0;qi<xtra&&qrem>0;qi++){int gi=lg[qi%(int)lg.size()];int g=G[gi];int stride=max(1,g/L),off=(qi/(int)lg.size())%stride;vector<int>win;for(int k=off;k<g&&(int)win.size()<L;k+=stride)win.push_back(sc[gi][k]);if((int)win.size()>=2)dq(win,gi);}}\n    // Kruskal's\n    vector<int> par(N);auto fu=[&](int x)->int{while(par[x]!=x){par[x]=par[par[x]];x=par[x];}return x;};\n    vector<vector<pair<int,int>>> ans(M);\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;for(int k:sc[i])par[k]=k;sort(ae[i].begin(),ae[i].end());\n    for(auto&[d,e]:ae[i]){int ra=fu(e.first),rb=fu(e.second);if(ra!=rb){par[ra]=rb;ans[i].push_back(e);}}\n    for(int k=1;k<g;k++){int ra=fu(sc[i][k]),rb=fu(sc[i][k-1]);if(ra!=rb){par[ra]=rb;ans[i].push_back({sc[i][k],sc[i][k-1]});}}}\n    cout<<\"!\\n\";\n    for(int i=0;i<M;i++){for(int j=0;j<G[i];j++){if(j>0)cout<<\" \";cout<<groups[i][j];}cout<<\"\\n\";for(auto&[a,b]:ans[i])cout<<a<<\" \"<<b<<\"\\n\";}\n    return 0;\n}","ahc046":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20;bool grid[N][N];\nconst int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\ninline bool inB(int r,int c){return(unsigned)r<(unsigned)N&&(unsigned)c<(unsigned)N;}\nconst int NS1=N*N*21*21;static int d1[NS1],p1[NS1],q1[NS1];static uint8_t a1[NS1];\nvector<pair<char,char>> fp1(int r0,int c0,int tr,int tc){\n    memset(d1,-1,sizeof(d1));int S=(r0*N+c0)*441,G=(tr*N+tc)*441;if(S==G)return{};\n    d1[S]=0;int qh=0,qt=0;q1[qt++]=S;\n    while(qh<qt&&d1[G]==-1){int s=q1[qh++],t=s,ebc=t%21-1;t/=21;int ebr=t%21-1;t/=21;int c=t%N,r=t/N,dv=d1[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];auto isB=[&](int br,int bc){return !inB(br,bc)||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){int ns=(nr*N+nc)*441+(ebr+1)*21+(ebc+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(0<<2)|d;q1[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}if(sr!=r||sc!=c){int ns=(sr*N+sc)*441+(ebr+1)*21+(ebc+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(1<<2)|d;q1[qt++]=ns;}}}\n            if(inB(nr,nc)){if(nr==ebr&&nc==ebc){int ns=(r*N+c)*441;if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}else if(ebr==-1&&!grid[nr][nc]){int ns=(r*N+c)*441+(nr+1)*21+(nc+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}}}}\n    if(d1[G]==-1){vector<pair<char,char>> res;int r=r0,c=c0;while(r!=tr){res.push_back({'M',r<tr?'D':'U'});r+=(r<tr?1:-1);}while(c!=tc){res.push_back({'M',c<tc?'R':'L'});c+=(c<tc?1:-1);}return res;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p1[cur])path.push_back({\"MSA\"[a1[cur]>>2],\"UDLR\"[a1[cur]&3]});reverse(path.begin(),path.end());return path;}\nconst int NS2=N*N*2*21*21;static int d2[NS2],p2[NS2],q2[NS2];static uint8_t a2[NS2];\nvector<pair<char,char>> fp2(int r0,int c0,int t1r,int t1c,int t2r,int t2c){\n    memset(d2,-1,sizeof(d2));auto E=[](int r,int c,int v,int er,int ec){return (r*N+c)*2*441+v*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(t2r,t2c,1,-1,-1);d2[S]=0;int qh=0,qt=0;q2[qt++]=S;\n    while(qh<qt&&d2[G]==-1){int s=q2[qh++],t=s,ebc=t%21-1;t/=21;int ebr=t%21-1;t/=21;int v=t%2;t/=2;int c=t%N,r=t/N,dv=d2[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];auto isB=[&](int br,int bc){return !inB(br,bc)||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){int nv=v|(nr==t1r&&nc==t1c);int ns=E(nr,nc,nv,ebr,ebc);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(0<<2)|d;q2[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}if(sr!=r||sc!=c){int nv=v|(sr==t1r&&sc==t1c);int ns=E(sr,sc,nv,ebr,ebc);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(1<<2)|d;q2[qt++]=ns;}}}\n            if(inB(nr,nc)){if(nr==ebr&&nc==ebc){int ns=E(r,c,v,-1,-1);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(2<<2)|d;q2[qt++]=ns;}}else if(ebr==-1&&!grid[nr][nc]){int ns=E(r,c,v,nr,nc);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(2<<2)|d;q2[qt++]=ns;}}}}}\n    if(d2[G]==-1){auto a=fp1(r0,c0,t1r,t1c),b=fp1(t1r,t1c,t2r,t2c);a.insert(a.end(),b.begin(),b.end());return a;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p2[cur])path.push_back({\"MSA\"[a2[cur]>>2],\"UDLR\"[a2[cur]&3]});reverse(path.begin(),path.end());return path;}\nconst int NS3=N*N*3*21*21;static int d3[NS3],p3[NS3],q3[NS3];static uint8_t a3[NS3];\nvector<pair<char,char>> fp3(int r0,int c0,int t1r,int t1c,int t2r,int t2c,int t3r,int t3c){\n    memset(d3,-1,sizeof(d3));auto E=[](int r,int c,int ph,int er,int ec){return (r*N+c)*3*441+ph*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(t3r,t3c,2,-1,-1);d3[S]=0;int qh=0,qt=0;q3[qt++]=S;\n    while(qh<qt&&d3[G]==-1){int s=q3[qh++],t=s,ebc=t%21-1;t/=21;int ebr=t%21-1;t/=21;int ph=t%3;t/=3;int c=t%N,r=t/N,dv=d3[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];auto isB=[&](int br,int bc){return !inB(br,bc)||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){int np=ph;if(ph==0&&nr==t1r&&nc==t1c)np=1;else if(ph==1&&nr==t2r&&nc==t2c)np=2;int ns=E(nr,nc,np,ebr,ebc);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(0<<2)|d;q3[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}if(sr!=r||sc!=c){int np=ph;if(ph==0&&sr==t1r&&sc==t1c)np=1;else if(ph==1&&sr==t2r&&sc==t2c)np=2;int ns=E(sr,sc,np,ebr,ebc);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(1<<2)|d;q3[qt++]=ns;}}}\n            if(inB(nr,nc)){if(nr==ebr&&nc==ebc){int ns=E(r,c,ph,-1,-1);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(2<<2)|d;q3[qt++]=ns;}}else if(ebr==-1&&!grid[nr][nc]){int ns=E(r,c,ph,nr,nc);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(2<<2)|d;q3[qt++]=ns;}}}}}\n    if(d3[G]==-1){auto a=fp1(r0,c0,t1r,t1c),b=fp1(t1r,t1c,t2r,t2c),cb=fp1(t2r,t2c,t3r,t3c);a.insert(a.end(),b.begin(),b.end());a.insert(a.end(),cb.begin(),cb.end());return a;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p3[cur])path.push_back({\"MSA\"[a3[cur]>>2],\"UDLR\"[a3[cur]&3]});reverse(path.begin(),path.end());return path;}\nconst int NS4=N*N*4*21*21;static int d4[NS4],p4[NS4],q4[NS4];static uint8_t a4[NS4];\nvector<pair<char,char>> fp4(int r0,int c0,int t1r,int t1c,int t2r,int t2c,int t3r,int t3c,int t4r,int t4c){\n    memset(d4,-1,sizeof(d4));auto E=[](int r,int c,int ph,int er,int ec){return (r*N+c)*4*441+ph*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(t4r,t4c,3,-1,-1);d4[S]=0;int qh=0,qt=0;q4[qt++]=S;\n    while(qh<qt&&d4[G]==-1){int s=q4[qh++],t=s,ebc=t%21-1;t/=21;int ebr=t%21-1;t/=21;int ph=t%4;t/=4;int c=t%N,r=t/N,dv=d4[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];auto isB=[&](int br,int bc){return !inB(br,bc)||grid[br][bc]||(br==ebr&&bc==ebc);};\n            if(!isB(nr,nc)){int np=ph;if(ph==0&&nr==t1r&&nc==t1c)np=1;else if(ph==1&&nr==t2r&&nc==t2c)np=2;else if(ph==2&&nr==t3r&&nc==t3c)np=3;int ns=E(nr,nc,np,ebr,ebc);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(0<<2)|d;q4[qt++]=ns;}}\n            {int sr=r,sc=c;while(!isB(sr+DR[d],sc+DC[d])){sr+=DR[d];sc+=DC[d];}if(sr!=r||sc!=c){int np=ph;if(ph==0&&sr==t1r&&sc==t1c)np=1;else if(ph==1&&sr==t2r&&sc==t2c)np=2;else if(ph==2&&sr==t3r&&sc==t3c)np=3;int ns=E(sr,sc,np,ebr,ebc);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(1<<2)|d;q4[qt++]=ns;}}}\n            if(inB(nr,nc)){if(nr==ebr&&nc==ebc){int ns=E(r,c,ph,-1,-1);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(2<<2)|d;q4[qt++]=ns;}}else if(ebr==-1&&!grid[nr][nc]){int ns=E(r,c,ph,nr,nc);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(2<<2)|d;q4[qt++]=ns;}}}}}\n    if(d4[G]==-1){auto a=fp1(r0,c0,t1r,t1c),b=fp1(t1r,t1c,t2r,t2c),cb=fp1(t2r,t2c,t3r,t3c),e=fp1(t3r,t3c,t4r,t4c);a.insert(a.end(),b.begin(),b.end());a.insert(a.end(),cb.begin(),cb.end());a.insert(a.end(),e.begin(),e.end());return a;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p4[cur])path.push_back({\"MSA\"[a4[cur]>>2],\"UDLR\"[a4[cur]&3]});reverse(path.begin(),path.end());return path;}\nint cr,cc,eebr=-1,eebc=-1;\nvoid execPath(const vector<pair<char,char>>&path){\n    for(auto[a,d]:path){cout<<a<<' '<<d<<'\\n';int di=d=='U'?0:d=='D'?1:d=='L'?2:3;int nr=cr+DR[di],nc=cc+DC[di];\n        if(a=='M'){cr=nr;cc=nc;}else if(a=='S'){while(inB(cr+DR[di],cc+DC[di])&&!grid[cr+DR[di]][cc+DC[di]]&&!(cr+DR[di]==eebr&&cc+DC[di]==eebc))cr+=DR[di],cc+=DC[di];}\n        else{if(nr==eebr&&nc==eebc){eebr=eebc=-1;}else if(eebr==-1&&!grid[nr][nc]){eebr=nr;eebc=nc;}else grid[nr][nc]^=1;}}eebr=eebc=-1;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int Nin,M;cin>>Nin>>M;vector<pair<int,int>> pts(M);\n    for(int i=0;i<M;i++)cin>>pts[i].first>>pts[i].second;\n    memset(grid,0,sizeof(grid));cr=pts[0].first;cc=pts[0].second;eebr=eebc=-1;\n    int k=1;\n    while(k<M){\n        int tr=pts[k].first,tc=pts[k].second;auto pk=fp1(cr,cc,tr,tc);\n        if(k+1<M){\n            int tr2=pts[k+1].first,tc2=pts[k+1].second;\n            auto pk1=fp1(tr,tc,tr2,tc2);auto pkk1=fp2(cr,cc,tr,tc,tr2,tc2);\n            if(k+2<M){\n                int tr3=pts[k+2].first,tc3=pts[k+2].second;\n                auto pk2=fp1(tr2,tc2,tr3,tc3);\n                auto pk1k2=fp2(tr,tc,tr2,tc2,tr3,tc3);\n                auto pkkk=fp3(cr,cc,tr,tc,tr2,tc2,tr3,tc3);\n                int oA=(int)pkk1.size()+(int)pk2.size();\n                int oB=(int)pk.size()+(int)pk1k2.size();\n                int oC=(int)pk.size()+(int)pk1.size()+(int)pk2.size();\n                int g3=min({oA,oB,oC});\n                int eg3=min((int)pkkk.size(),g3);\n                if(k+3<M){\n                    int tr4=pts[k+3].first,tc4=pts[k+3].second;\n                    auto pk3=fp1(tr3,tc3,tr4,tc4);\n                    auto pkkkk=fp4(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4);\n                    if((int)pkkkk.size()<eg3+(int)pk3.size()){execPath(pkkkk);cr=tr4;cc=tc4;k+=4;continue;}\n                }\n                if((int)pkkk.size()<g3){execPath(pkkk);cr=tr3;cc=tc3;k+=3;continue;}\n                if(g3==oA){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                else{execPath(pk);cr=tr;cc=tc;k+=1;}\n            }else{\n                if((int)pkk1.size()<(int)pk.size()+(int)pk1.size()){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                else{execPath(pk);cr=tr;cc=tc;k+=1;}\n            }\n        }else{execPath(pk);cr=tr;cc=tc;k+=1;}\n    }\n    return 0;\n}"},"8":{"ahc001":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=205;\nint n,px[MAXN],py[MAXN];long long pr[MAXN];\ndouble score_pi(double si,long long ri){if(si<=0)return 0;double r=(si<=(double)ri)?si/ri:(double)ri/si;return 1-(1-r)*(1-r);}\nstruct Split{int x1,y1,x2,y2,dir,sp,lo,hi;vector<int>L,R;};\nvector<Split>splits;int rx1[MAXN],ry1[MAXN],rx2[MAXN],ry2[MAXN];\nvoid recompute(){for(int i=0;i<n;i++){rx1[i]=0;ry1[i]=0;rx2[i]=10000;ry2[i]=10000;}for(auto&s:splits){for(int i:s.L){if(s.dir==0)rx2[i]=min(rx2[i],s.sp);else ry2[i]=min(ry2[i],s.sp);}for(int j:s.R){if(s.dir==0)rx1[j]=max(rx1[j],s.sp);else ry1[j]=max(ry1[j],s.sp);}}}\ndouble evalAt(const Split&s,int sp){double t=0;for(int i:s.L){int nx2=(s.dir==0&&rx2[i]==s.sp)?sp:rx2[i];int ny2=(s.dir==1&&ry2[i]==s.sp)?sp:ry2[i];t+=score_pi((double)max(0,nx2-rx1[i])*max(0,ny2-ry1[i]),pr[i]);}for(int j:s.R){int nx1=(s.dir==0&&rx1[j]==s.sp)?sp:rx1[j];int ny1=(s.dir==1&&ry1[j]==s.sp)?sp:ry1[j];t+=score_pi((double)max(0,rx2[j]-nx1)*max(0,ry2[j]-ny1),pr[j]);}return t;}\nmt19937 rng(42);double p_rand=0;\nvoid doBuild(vector<int>comp,int x1,int y1,int x2,int y2){\n    int nc=(int)comp.size();if(nc==1)return;\n    long long tr=0;for(int i:comp)tr+=pr[i];long long H=y2-y1,W=x2-x1;\n    vector<int>bx(comp),by(comp);\n    sort(bx.begin(),bx.end(),[](int a,int b){return px[a]<px[b];});\n    sort(by.begin(),by.end(),[](int a,int b){return py[a]<py[b];});\n    struct Cand{double sc;int dir,k,sp,lo,hi;};vector<Cand>cands;\n    auto ss=[](long long AL,long long RL,int nL,long long AR,long long RR,int nR){double a=(RL<=0||AL>=RL)?(double)nL:nL*(1-pow(1-(double)AL/RL,2));double b=(RR<=0||AR>=RR)?(double)nR:nR*(1-pow(1-(double)AR/RR,2));return a+b;};\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[bx[k-1]];if(px[bx[k-1]]>=px[bx[k]])continue;int lo=max(px[bx[k-1]]+1,x1+1),hi=min(px[bx[k]],x2-1);if(lo>hi)continue;int sp=(int)round(x1+(double)W*pf/tr);sp=max(lo,min(hi,sp));cands.push_back({ss((long long)(sp-x1)*H,pf,k,(long long)(x2-sp)*H,tr-pf,nc-k),0,k,sp,lo,hi});}}\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[by[k-1]];if(py[by[k-1]]>=py[by[k]])continue;int lo=max(py[by[k-1]]+1,y1+1),hi=min(py[by[k]],y2-1);if(lo>hi)continue;int sp=(int)round(y1+(double)H*pf/tr);sp=max(lo,min(hi,sp));cands.push_back({ss((long long)(sp-y1)*W,pf,k,(long long)(y2-sp)*W,tr-pf,nc-k),1,k,sp,lo,hi});}}\n    if(cands.empty())return;\n    sort(cands.begin(),cands.end(),[](const Cand&a,const Cand&b){return a.sc>b.sc;});\n    int ch=0;if(p_rand>0&&(int)cands.size()>1){int K=min((int)cands.size(),5);if(uniform_real_distribution<double>(0,1)(rng)<p_rand)ch=rng()%K;}\n    auto&c=cands[ch];Split s;s.x1=x1;s.y1=y1;s.x2=x2;s.y2=y2;s.dir=c.dir;s.sp=c.sp;s.lo=c.lo;s.hi=c.hi;\n    if(c.dir==0){for(int i=0;i<c.k;i++)s.L.push_back(bx[i]);for(int i=c.k;i<nc;i++)s.R.push_back(bx[i]);splits.push_back(s);doBuild(s.L,x1,y1,s.sp,y2);doBuild(s.R,s.sp,y1,x2,y2);}\n    else{for(int i=0;i<c.k;i++)s.L.push_back(by[i]);for(int i=c.k;i<nc;i++)s.R.push_back(by[i]);splits.push_back(s);doBuild(s.L,x1,y1,x2,s.sp);doBuild(s.R,x1,s.sp,x2,y2);}\n}\nbool lsPass(){bool imp=false;for(auto&s:splits){if(s.lo>=s.hi)continue;int bsp=s.sp;double bs=evalAt(s,s.sp);int lo=s.lo,hi=s.hi;while(hi-lo>=3){int m1=lo+(hi-lo)/3,m2=hi-(hi-lo)/3;double s1=evalAt(s,m1),s2=evalAt(s,m2);if(s1<s2-1e-9)lo=m1+1;else if(s2<s1-1e-9)hi=m2-1;else{lo=m1;hi=m2;}}for(int sp=lo;sp<=hi;sp++){double sc=evalAt(s,sp);if(sc>bs){bs=sc;bsp=sp;}}if(bsp!=s.sp){s.sp=bsp;recompute();imp=true;}}return imp;}\ndouble computeScore(){double t=0;for(int i=0;i<n;i++){long long A=(long long)(rx2[i]-rx1[i])*(ry2[i]-ry1[i]);t+=score_pi((double)min(A,(long long)pr[i]),pr[i]);}return t;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>n;for(int i=0;i<n;i++)cin>>px[i]>>py[i]>>pr[i];\n    vector<int>all(n);iota(all.begin(),all.end(),0);\n    auto t0=chrono::steady_clock::now();\n    auto msf=[&](){return(int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    const double prs[]={0.0,0.1,0.2,0.3,0.4,0.5};\n    double best=-1;int bx1[MAXN],by1[MAXN],bx2[MAXN],by2[MAXN];\n    auto save=[&](){for(int i=0;i<n;i++){bx1[i]=rx1[i];by1[i]=ry1[i];bx2[i]=rx2[i];by2[i]=ry2[i];}};\n    vector<pair<uint32_t,double>>tinfo;\n    vector<pair<double,int>>ph1;\n    // Phase 1: Quick 2-pass evaluation\n    for(int trial=0;msf()<2200;trial++){\n        uint32_t seed=(uint32_t)(trial*7919+12345);\n        double pr=prs[trial==0?0:1+(trial-1)%5];\n        splits.clear();rng.seed(seed);p_rand=pr;\n        doBuild(all,0,0,10000,10000);recompute();\n        for(int p=0;p<2&&msf()<2200;p++)if(!lsPass())break;\n        double q=computeScore();\n        tinfo.emplace_back(seed,pr);\n        ph1.emplace_back(q,(int)tinfo.size()-1);\n        if(q>best){best=q;save();}\n    }\n    // Phase 2: Full LS on top trials\n    sort(ph1.rbegin(),ph1.rend());\n    for(auto&[q,tid]:ph1){\n        if(msf()>4500)break;\n        splits.clear();rng.seed(tinfo[tid].first);p_rand=tinfo[tid].second;\n        doBuild(all,0,0,10000,10000);recompute();\n        while(msf()<4500)if(!lsPass())break;\n        double sc=computeScore();\n        if(sc>best){best=sc;save();}\n    }\n    for(int i=0;i<n;i++){\n        int x1=bx1[i],y1=by1[i],x2=bx2[i],y2=by2[i],W=x2-x1,H=y2-y1,xi=px[i],yi=py[i];\n        long long A=(long long)W*H,ri=pr[i];\n        if(A<=(long long)ri){cout<<x1<<\" \"<<y1<<\" \"<<x2<<\" \"<<y2<<\"\\n\";continue;}\n        double br=0;int bw=W,bh=H;bool done=false;\n        for(int w=1;w<=W&&!done;w++){long long h0=ri/w;for(int dh=0;dh<=1;dh++){long long hh=h0+dh;if(hh<1||hh>(long long)H)continue;long long area=(long long)w*hh;double ratio=area<=(long long)ri?(double)area/ri:(double)ri/area;if(ratio>br){br=ratio;bw=w;bh=(int)hh;if(br>=1-1e-9){done=true;break;}}}}\n        int a=max(x1,xi+1-bw),b=max(y1,yi+1-bh);\n        cout<<a<<\" \"<<b<<\" \"<<(a+bw)<<\" \"<<(b+bh)<<\"\\n\";\n    }\n    return 0;\n}","ahc002":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef chrono::steady_clock Clock;\nconst int N=50,MAXM=N*N+1;\nint si,sj,M,tid[N][N],pval[N][N];\nconst int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\nconst char dc[]={'U','D','L','R'};\nmt19937 rng;\nbool tu[MAXM],btu[MAXM];\nint pi_[MAXM],pj_[MAXM],pt_[MAXM],bpi[MAXM],bpj[MAXM],bpt[MAXM];\nchar pmv[MAXM],bpmv[MAXM];\nint plen,blen;long long cscore,bscore;int ci,cj;\nint g_seen[MAXM]={};int g_ts=0;\nvoid save_best(){if(cscore<=bscore)return;bscore=cscore;blen=plen;memcpy(btu,tu,M);memcpy(bpi,pi_,plen*4);memcpy(bpj,pj_,plen*4);memcpy(bpt,pt_,plen*4);if(plen>1)memcpy(bpmv,pmv,plen-1);}\nvoid restore_best(){cscore=bscore;plen=blen;memcpy(tu,btu,M);memcpy(pi_,bpi,plen*4);memcpy(pj_,bpj,plen*4);memcpy(pt_,bpt,plen*4);if(plen>1)memcpy(pmv,bpmv,plen-1);ci=pi_[plen-1];cj=pj_[plen-1];}\nvoid walk_init(){fill(tu,tu+M,false);plen=1;ci=si;cj=sj;pi_[0]=si;pj_[0]=sj;pt_[0]=tid[si][sj];tu[tid[si][sj]]=true;cscore=pval[si][sj];}\nbool walk_step(double a,double b,double g,double g2,double g3){\n    int bd=-1;double bh=-1e18;bool g3pos=(g3>0);\n    for(int d=0;d<4;d++){\n        int ni=ci+dx[d],nj=cj+dy[d];\n        if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;\n        int t=tid[ni][nj];if(tu[t])continue;\n        tu[t]=true;++g_ts;g_seen[t]=g_ts;\n        int cnt=0;double nv=0,nv2=0,nv3=0;\n        for(int d2=0;d2<4;d2++){\n            int nni=ni+dx[d2],nnj=nj+dy[d2];\n            if((unsigned)nni>=(unsigned)N||(unsigned)nnj>=(unsigned)N)continue;\n            int t2=tid[nni][nnj];if(tu[t2]||g_seen[t2]==g_ts)continue;\n            g_seen[t2]=g_ts;cnt++;nv+=pval[nni][nnj];\n            for(int d3=0;d3<4;d3++){\n                int n3i=nni+dx[d3],n3j=nnj+dy[d3];\n                if((unsigned)n3i>=(unsigned)N||(unsigned)n3j>=(unsigned)N)continue;\n                int t3=tid[n3i][n3j];if(tu[t3]||g_seen[t3]==g_ts)continue;\n                g_seen[t3]=g_ts;nv2+=pval[n3i][n3j];\n                if(g3pos){for(int d4=0;d4<4;d4++){\n                    int n4i=n3i+dx[d4],n4j=n3j+dy[d4];\n                    if((unsigned)n4i>=(unsigned)N||(unsigned)n4j>=(unsigned)N)continue;\n                    int t4=tid[n4i][n4j];if(tu[t4]||g_seen[t4]==g_ts)continue;\n                    g_seen[t4]=g_ts;nv3+=pval[n4i][n4j];\n                }}\n            }\n        }\n        tu[t]=false;\n        double h=a*pval[ni][nj]+g*nv+g2*nv2+g3*nv3-b*cnt+(cnt==0?-1e6:0.0)\n               +uniform_real_distribution<double>(-0.5,0.5)(rng);\n        if(h>bh){bh=h;bd=d;}\n    }\n    if(bd==-1)return false;\n    int ni=ci+dx[bd],nj=cj+dy[bd];\n    tu[tid[ni][nj]]=true;cscore+=pval[ni][nj];pmv[plen-1]=dc[bd];\n    pi_[plen]=ni;pj_[plen]=nj;pt_[plen]=tid[ni][nj];plen++;ci=ni;cj=nj;return true;\n}\nvoid walk_extend(double a,double b,double g,double g2,double g3){while(walk_step(a,b,g,g2,g3));}\nvoid walk_undo(int s){s=min(s,plen-1);while(s-->0){plen--;tu[pt_[plen]]=false;cscore-=pval[pi_[plen]][pj_[plen]];}ci=pi_[plen-1];cj=pj_[plen-1];}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    rng.seed(chrono::steady_clock::now().time_since_epoch().count());\n    cin>>si>>sj;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>tid[i][j];\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>pval[i][j];\n    M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)M=max(M,tid[i][j]+1);\n    bscore=pval[si][sj];blen=1;bpi[0]=si;bpj[0]=sj;bpt[0]=tid[si][sj];\n    fill(btu,btu+M,false);btu[tid[si][sj]]=true;\n    auto t0=Clock::now();\n    auto deadline=t0+chrono::milliseconds(1850);\n    auto phase2=t0+chrono::milliseconds(1295);\n    for(int iter=0;Clock::now()<deadline;iter++){\n        bool p2=(Clock::now()>=phase2);\n        double a=uniform_real_distribution<double>(0.5,2.0)(rng);\n        double b=uniform_real_distribution<double>(0,25)(rng);\n        double g=uniform_real_distribution<double>(0,1.0)(rng);\n        double g2,g3;\n        if(!p2){g2=uniform_real_distribution<double>(0,0.1)(rng);g3=0.0;}\n        else{g2=uniform_real_distribution<double>(0,0.15)(rng);g3=(rng()%3==0)?0.0:uniform_real_distribution<double>(0,0.02)(rng);}\n        if(iter%4==0||blen<=1){walk_init();}\n        else{restore_best();int mb=blen-1,back,r=rng()%10;\n            if(r<5)back=uniform_int_distribution<int>(1,max(1,mb/10))(rng);\n            else if(r<8)back=uniform_int_distribution<int>(max(1,mb/10),max(1,mb/3))(rng);\n            else back=uniform_int_distribution<int>(max(1,mb/3),mb)(rng);\n            walk_undo(back);}\n        walk_extend(a,b,g,g2,g3);save_best();\n    }\n    cout<<string(bpmv,bpmv+blen-1)<<\"\\n\";\n}","ahc003":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30;\nconst double DELTA_VAR=1e6,INIT_SIG2_R=1e8,INIT_SIG2_E=1e7,MIN_SIG2=1e4;\ndouble mu_row[N],sig2_row[N],mu_col[N],sig2_col[N];\ndouble mu_h[N][N-1],sig2_h[N][N-1],mu_v[N-1][N],sig2_v[N-1][N];\nbool obs_h[N][N-1],obs_v[N-1][N];\ndouble wh(int i,int j){return obs_h[i][j]?mu_h[i][j]:mu_row[i];}\ndouble wv(int i,int j){return obs_v[i][j]?mu_v[i][j]:mu_col[j];}\nstring dijkstra(int sr,int sc,int tr,int tc){\n    static double dist[N*N];static int par[N*N];static char pdir[N*N];\n    fill(dist,dist+N*N,1e18);\n    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>> pq;\n    int src=sr*N+sc,dst=tr*N+tc;dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){\n        auto[d,u]=pq.top();pq.pop();\n        if(d>dist[u]+1e-9)continue;if(u==dst)break;\n        int r=u/N,c=u%N;\n        if(r>0){int nv=(r-1)*N+c;double nd=d+wv(r-1,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='U';pq.push({nd,nv});}}\n        if(r<N-1){int nv=(r+1)*N+c;double nd=d+wv(r,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='D';pq.push({nd,nv});}}\n        if(c>0){int nv=r*N+(c-1);double nd=d+wh(r,c-1);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='L';pq.push({nd,nv});}}\n        if(c<N-1){int nv=r*N+(c+1);double nd=d+wh(r,c);if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]='R';pq.push({nd,nv});}}\n    }\n    string path;for(int cur=dst;cur!=src;cur=par[cur])path+=pdir[cur];\n    reverse(path.begin(),path.end());return path;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    for(int i=0;i<N;i++){mu_row[i]=5000;sig2_row[i]=INIT_SIG2_R;}\n    for(int j=0;j<N;j++){mu_col[j]=5000;sig2_col[j]=INIT_SIG2_R;}\n    for(int q=0;q<1000;q++){\n        int sr,sc,tr,tc;cin>>sr>>sc>>tr>>tc;\n        string path=dijkstra(sr,sc,tr,tc);cout<<path<<\"\\n\";cout.flush();\n        int obs;cin>>obs;\n        double noise_var=(double)obs*obs/300.0;\n        int kh[N]={},lv[N]={};\n        struct E{bool is_h;int i,j;};vector<E> edges;\n        int r=sr,c=sc;\n        for(char ch:path){\n            if(ch=='U'){edges.push_back({false,r-1,c});lv[c]++;r--;}\n            else if(ch=='D'){edges.push_back({false,r,c});lv[c]++;r++;}\n            else if(ch=='L'){edges.push_back({true,r,c-1});kh[r]++;c--;}\n            else{edges.push_back({true,r,c});kh[r]++;c++;}\n        }\n        double pred_r=0,pvar_r=0;\n        for(int i=0;i<N;i++)if(kh[i]>0){pred_r+=kh[i]*mu_row[i];pvar_r+=(double)kh[i]*kh[i]*sig2_row[i]+kh[i]*DELTA_VAR;}\n        for(int j=0;j<N;j++)if(lv[j]>0){pred_r+=lv[j]*mu_col[j];pvar_r+=(double)lv[j]*lv[j]*sig2_col[j]+lv[j]*DELTA_VAR;}\n        double tvr=pvar_r+noise_var,resr=(double)obs-pred_r;\n        for(int i=0;i<N;i++)if(kh[i]>0){double K=sig2_row[i]*kh[i]/tvr;mu_row[i]=clamp(mu_row[i]+K*resr,1000.0,9000.0);sig2_row[i]=max(sig2_row[i]*(1.0-K*kh[i]),MIN_SIG2);}\n        for(int j=0;j<N;j++)if(lv[j]>0){double K=sig2_col[j]*lv[j]/tvr;mu_col[j]=clamp(mu_col[j]+K*resr,1000.0,9000.0);sig2_col[j]=max(sig2_col[j]*(1.0-K*lv[j]),MIN_SIG2);}\n        for(auto& e:edges){\n            if(e.is_h&&!obs_h[e.i][e.j]){obs_h[e.i][e.j]=true;mu_h[e.i][e.j]=mu_row[e.i];sig2_h[e.i][e.j]=INIT_SIG2_E;}\n            else if(!e.is_h&&!obs_v[e.i][e.j]){obs_v[e.i][e.j]=true;mu_v[e.i][e.j]=mu_col[e.j];sig2_v[e.i][e.j]=INIT_SIG2_E;}\n        }\n        double pred_e=0,pvar_e=0;\n        for(auto& e:edges){pred_e+=(e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j]);pvar_e+=(e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j]);}\n        double tve=pvar_e+noise_var,rese=(double)obs-pred_e;\n        for(auto& e:edges){\n            double& mu=e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j];\n            double& s2=e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j];\n            double K=s2/tve;mu=clamp(mu+K*rese,1000.0,9000.0);s2=max(s2*(1.0-K),MIN_SIG2);\n        }\n    }\n    return 0;\n}","ahc004":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20,MAXM=800,MAXL=12;\nint M,bs,score;\nint8_t grid[N][N],bg[N][N],h_mm[N][MAXM][N],v_mm[N][MAXM][N];\nint match_count[MAXM],slen[MAXM];\nint8_t S[MAXM][MAXL],char_pos[MAXM][8][MAXL],char_pos_cnt[MAXM][8];\nuint8_t char_appears[MAXM];\nint unsat_arr[MAXM],unsat_cnt,unsat_pos[MAXM];\nvoid unsat_remove(int k){int pos=unsat_pos[k];if(pos<0)return;int last=unsat_arr[--unsat_cnt];unsat_arr[pos]=last;unsat_pos[last]=pos;unsat_pos[k]=-1;}\nvoid unsat_add(int k){if(unsat_pos[k]>=0)return;unsat_pos[k]=unsat_cnt;unsat_arr[unsat_cnt++]=k;}\nvoid apply_cell(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int om=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;match_count[k]-=(h_mm[r][k][j]==0);h_mm[r][k][j]++;match_count[k]-=(v_mm[c][k][i2]==0);v_mm[c][k][i2]++;}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;h_mm[r][k][j]--;match_count[k]+=(h_mm[r][k][j]==0);v_mm[c][k][i2]--;match_count[k]+=(v_mm[c][k][i2]==0);}\n        int nm=match_count[k];if(om>0&&nm==0){unsat_add(k);score--;}else if(om==0&&nm>0){unsat_remove(k);score++;}}grid[r][c]=nc;}\nint compute_delta(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);int d=0;\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int mc=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi];mc-=(h_mm[r][k][(c-p+N)%N]==0);mc-=(v_mm[c][k][(r-p+N)%N]==0);}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi];mc+=(h_mm[r][k][(c-p+N)%N]==1);mc+=(v_mm[c][k][(r-p+N)%N]==1);}\n        d+=(mc>0)-(match_count[k]>0);}return d;}\nvoid recompute(){score=0;unsat_cnt=0;fill(unsat_pos,unsat_pos+M,-1);\n    for(int r=0;r<N;r++)for(int k=0;k<M;k++)for(int j=0;j<N;j++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[r][(j+p)%N]!=S[k][p]);h_mm[r][k][j]=mm;}\n    for(int c=0;c<N;c++)for(int k=0;k<M;k++)for(int i=0;i<N;i++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[(i+p)%N][c]!=S[k][p]);v_mm[c][k][i]=mm;}\n    for(int k=0;k<M;k++){match_count[k]=0;for(int r=0;r<N;r++)for(int j=0;j<N;j++)match_count[k]+=(h_mm[r][k][j]==0);for(int c=0;c<N;c++)for(int i=0;i<N;i++)match_count[k]+=(v_mm[c][k][i]==0);if(match_count[k]>0)score++;else unsat_add(k);}}\nvoid safe_refresh(){\n    int votes[N][N][8];memset(votes,0,sizeof(votes));\n    for(int k=0;k<M;k++){int bm=INT_MAX,br=0,bj=0,bd=0;\n        for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n        for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n        int rthr=max(0,min(3,slen[k]>=7?slen[k]-4:slen[k]-5));if(bm>rthr)continue;\n        for(int p=0;p<slen[k];p++){int rr=bd?(br+p)%N:br,cc=bd?bj:(bj+p)%N;votes[rr][cc][S[k][p]]++;}}\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int bc=0,bv=votes[r][c][0];\n        for(int ch=1;ch<8;ch++)if(votes[r][c][ch]>bv){bv=votes[r][c][ch];bc=ch;}\n        if(bv>0&&grid[r][c]!=bc){int d=compute_delta(r,c,grid[r][c],bc);\n            if(d>0){apply_cell(r,c,grid[r][c],bc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}}}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int n;cin>>n>>M;\n    for(int k=0;k<M;k++){string s;cin>>s;slen[k]=s.size();char_appears[k]=0;memset(char_pos_cnt[k],0,8);\n        for(int p=0;p<slen[k];p++){int ch=s[p]-'A';S[k][p]=ch;char_pos[k][ch][char_pos_cnt[k][ch]++]=p;char_appears[k]|=(1u<<ch);}}\n    mt19937 rng(42);\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)grid[i][j]=rng()%8;\n    recompute();bs=score;memcpy(bg,grid,sizeof(grid));\n    auto t0=chrono::steady_clock::now();const double TL=2.85;\n    if(score<M*5/100){\n        while(unsat_cnt>0){double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=0.15||score>=M*2/5)break;\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n            for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n            for(int p=0;p<slen[k];p++){int rr=bd?(br+p)%N:br,cc=bd?bj:(bj+p)%N;int nc=S[k][p],oc=grid[rr][cc];if(nc!=oc)apply_cell(rr,cc,oc,nc);}\n            if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}\n        if(score!=bs){memcpy(grid,bg,sizeof(grid));recompute();}}\n    double sa0=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n    double sad=max(0.1,TL-sa0);\n    double phase1_end=sa0+sad*0.50,phase2_end=sa0+sad*0.75;\n    bool p1t=false,p1d=false,p2t=false,p2d=false;\n    int bs_last_upd=0;double T=5.0;\n    for(int iter=0;;iter++){\n        if((iter&0xFFF)==0){\n            double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=TL)break;\n            // First restart at 50% (always, unchanged from 4th submission)\n            if(!p1t&&el>=phase1_end){p1t=true;\n                if(bs<M*90/100){p1d=true;memcpy(grid,bg,sizeof(grid));recompute();\n                    for(int i=0;i<5;i++){int r=rng()%N,c=rng()%N,nc=rng()%8;if(nc!=grid[r][c])apply_cell(r,c,grid[r][c],nc);}\n                    bs_last_upd=iter;}}\n            // Optional second restart at 75% (only if stagnated in phase 2)\n            if(p1d&&!p2t&&el>=phase2_end){p2t=true;\n                if(bs<M*90/100&&iter-bs_last_upd>=100000){p2d=true;\n                    memcpy(grid,bg,sizeof(grid));recompute();\n                    for(int i=0;i<2;i++){int r=rng()%N,c=rng()%N,nc=rng()%8;if(nc!=grid[r][c])apply_cell(r,c,grid[r][c],nc);}\n                    bs_last_upd=iter;}}\n            // Temperature\n            if(p2d){double prog=min(1.0,max(0.0,(el-phase2_end)/(TL-phase2_end)));T=1.5*pow(0.001/1.5,prog);}\n            else if(p1d){double prog=min(1.0,max(0.0,(el-phase1_end)/(sad*0.5)));T=2.0*pow(0.001/2.0,prog);}\n            else{double prog=min(1.0,max(0.0,(el-sa0)/sad));T=5.0*pow(0.001/5.0,prog);}\n        }\n        if(iter>0&&(iter%100000)==0&&bs<M*95/100){int pb=bs;safe_refresh();if(bs>pb)bs_last_upd=iter;}\n        bool guided=false;int r,c,nc,oc;\n        if(unsat_cnt>0&&rng()%(uint32_t)M<(uint32_t)unsat_cnt){\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int rr=0;rr<N;rr++)for(int jj=0;jj<N;jj++)if(h_mm[rr][k][jj]<bm){bm=h_mm[rr][k][jj];br=rr;bj=jj;bd=0;}\n            for(int cc=0;cc<N;cc++)for(int ii=0;ii<N;ii++)if(v_mm[cc][k][ii]<bm){bm=v_mm[cc][k][ii];br=ii;bj=cc;bd=1;}\n            int thr=max(0,min(3,slen[k]>=7?slen[k]-4:slen[k]-5));\n            if(bm>=1&&bm<=thr)for(int p=0;p<slen[k]&&!guided;p++){int rr=bd?(br+p)%N:br,cc2=bd?bj:(bj+p)%N;if(grid[rr][cc2]!=S[k][p]){r=rr;c=cc2;nc=S[k][p];oc=grid[rr][cc2];guided=true;}}\n        }\n        if(!guided){r=rng()%N;c=rng()%N;nc=rng()%8;oc=grid[r][c];if(nc==oc)continue;}\n        int d=compute_delta(r,c,oc,nc);\n        if(d>=0||(double)rng()<exp((double)d/T)*4294967295.0){apply_cell(r,c,oc,nc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));bs_last_upd=iter;}}\n    }\n    for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<(char)('A'+bg[i][j]);cout<<'\\n';}\n}","ahc005":"#include <bits/stdc++.h>\nusing namespace std;\nint N,si,sj;vector<string> grid;\nbool isRoad(int r,int c){return r>=0&&r<N&&c>=0&&c<N&&grid[r][c]!='#';}\nconst int INF=1e9;\npair<vector<int>,vector<int>> dijkstra(int src){\n    vector<int> d(N*N,INF),p(N*N,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;\n    d[src]=0;pq.push({0,src});const int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\n    while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;int r=u/N,c=u%N;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!isRoad(nr,nc))continue;int v=nr*N+nc,nd=dd+(grid[nr][nc]-'0');if(nd<d[v]){d[v]=nd;p[v]=u;pq.push({nd,v});}}}\n    return{d,p};}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>si>>sj;grid.resize(N);for(int i=0;i<N;i++)cin>>grid[i];\n    vector<int> roads;vector<int> rIdx(N*N,-1);\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)if(isRoad(r,c)){rIdx[r*N+c]=roads.size();roads.push_back(r*N+c);}\n    int R=roads.size();\n    vector<vector<int>> vis(R);\n    for(int i=0;i<R;i++){\n        int r=roads[i]/N,c=roads[i]%N;vis[i].push_back(i);\n        for(int d=1;c+d<N&&isRoad(r,c+d);d++)vis[i].push_back(rIdx[r*N+(c+d)]);\n        for(int d=1;c-d>=0&&isRoad(r,c-d);d++)vis[i].push_back(rIdx[r*N+(c-d)]);\n        for(int d=1;r+d<N&&isRoad(r+d,c);d++)vis[i].push_back(rIdx[(r+d)*N+c]);\n        for(int d=1;r-d>=0&&isRoad(r-d,c);d++)vis[i].push_back(rIdx[(r-d)*N+c]);}\n    vector<bool> cov(R,false);int uncov=R;\n    vector<int> cnt(R);for(int i=0;i<R;i++)cnt[i]=vis[i].size();\n    priority_queue<pair<int,int>> pqsc;for(int i=0;i<R;i++)pqsc.push({cnt[i],i});\n    vector<int> sents;\n    while(uncov>0){\n        int best=-1;\n        while(!pqsc.empty()){auto[cv,id]=pqsc.top();pqsc.pop();if(cv==cnt[id]){best=id;break;}}\n        if(best<0)break;\n        sents.push_back(roads[best]);\n        for(int j:vis[best])if(!cov[j]){\n            cov[j]=true;uncov--;\n            for(int k:vis[j]){cnt[k]--;pqsc.push({cnt[k],k});}\n        }\n    }\n    int stSq=si*N+sj;\n    {auto it=find(sents.begin(),sents.end(),stSq);if(it==sents.end())sents.insert(sents.begin(),stSq);else swap(*it,sents[0]);}\n    int S=sents.size();\n    {\n        vector<int> cc(R,0);for(int sq:sents)for(int j:vis[rIdx[sq]])cc[j]++;\n        bool ch=true;\n        while(ch){ch=false;for(int i=S-1;i>=1;i--){if(sents[i]<0)continue;int idx=rIdx[sents[i]];bool red=true;for(int j:vis[idx])if(cc[j]<=1){red=false;break;}if(red){for(int j:vis[idx])cc[j]--;sents[i]=-1;ch=true;}}}\n        sents.erase(remove(sents.begin(),sents.end(),-1),sents.end());S=sents.size();\n    }\n    vector<vector<int>> aD(S),aP(S);\n    for(int i=0;i<S;i++){auto[d,p]=dijkstra(sents[i]);aD[i]=move(d);aP[i]=move(p);}\n    vector<vector<int>> dm(S,vector<int>(S,INF));\n    for(int i=0;i<S;i++)for(int j=0;j<S;j++)dm[i][j]=aD[i][sents[j]];\n    vector<int> tour;\n    {vector<bool> tv(S,false);tour={0};tv[0]=true;\n    for(int s=1;s<S;s++){int cur=tour.back(),best=-1,bd=INF;for(int j=0;j<S;j++)if(!tv[j]&&dm[cur][j]<bd){bd=dm[cur][j];best=j;}tour.push_back(best);tv[best]=true;}}\n    auto do2opt=[&](){\n        int sz=tour.size();\n        for(bool imp=true;imp;){imp=false;\n            for(int i=0;i<sz-1;i++)for(int j=i+2;j<sz;j++){\n                if(i==0&&j==sz-1)continue;\n                int a=tour[i],b=tour[i+1],c=tour[j],d=tour[(j+1)%sz];\n                if(dm[a][c]+dm[b][d]<dm[a][b]+dm[c][d]){reverse(tour.begin()+i+1,tour.begin()+j+1);imp=true;}\n            }\n        }\n    };\n    auto doOrOpt=[&]()->bool{\n        int sz=tour.size();int bg=0,bi=-1,bj=-1;\n        for(int i=1;i<sz;i++){\n            int pi=tour[(i-1+sz)%sz],ci=tour[i],ni=tour[(i+1)%sz];\n            int rmv=dm[pi][ci]+dm[ci][ni]-dm[pi][ni];\n            for(int j=0;j<sz;j++){\n                if(j==i||j==(i-1+sz)%sz)continue;\n                int nj=tour[(j+1)%sz];\n                int ins=dm[tour[j]][ci]+dm[ci][nj]-dm[tour[j]][nj];\n                if(rmv-ins>bg){bg=rmv-ins;bi=i;bj=j;}\n            }\n        }\n        if(bi!=-1){int nd=tour[bi];tour.erase(tour.begin()+bi);int ip=(bj<bi)?bj+1:bj;tour.insert(tour.begin()+ip,nd);return true;}\n        return false;\n    };\n    do2opt();\n    for(int k=0;k<200;k++)if(!doOrOpt())break;\n    do2opt();\n    for(int k=0;k<50;k++){if(!doOrOpt())break;do2opt();}\n    int finS=tour.size();string res;\n    for(int i=0;i<finS;i++){\n        int fi=tour[i],tSq=sents[tour[(i+1)%finS]],sSq=sents[fi];\n        vector<int> path;for(int c=tSq;c!=sSq;c=aP[fi][c])path.push_back(c);\n        reverse(path.begin(),path.end());\n        int pp=sSq;\n        for(int nx:path){\n            int pr=pp/N,pc=pp%N,nr=nx/N,nc=nx%N;\n            if(nr<pr)res+='U';else if(nr>pr)res+='D';else if(nc<pc)res+='L';else res+='R';\n            pp=nx;\n        }\n    }\n    cout<<res<<\"\\n\";return 0;\n}","future-contest-2022-qual":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,K,R;\nvector<vector<int>> d,succs;\nvector<int> task_st,task_pre,task_w,worker_t,task_sd;\nvector<vector<double>> sk,et;\nvector<vector<int>> lb;\nvector<vector<pair<int,int>>> obs;\nvector<double> cp;\nint cur_day;double prior_sk;\nvoid upd_et(int w){for(int i=0;i<N;i++){double ww=0;for(int k=0;k<K;k++){double df=d[i][k]-sk[w][k];if(df>0)ww+=df;}et[i][w]=ww<0.5?1.0:ww;}}\nvoid calc_cp(){cp.assign(N,0.0);for(int i=N-1;i>=0;i--){if(task_st[i]==2)continue;double mn;if(task_st[i]==1){double rem=task_sd[i]+et[i][task_w[i]]-cur_day;mn=max(1.0,rem);}else{mn=et[i][0];for(int j=1;j<M;j++)mn=min(mn,et[i][j]);}double mx=0;for(int v:succs[i])mx=max(mx,cp[v]);cp[i]=mn+mx;}}\nvoid refit(int w){int n=(int)obs[w].size();double decay=exp(-0.1*n);for(int k=0;k<K;k++)sk[w][k]=max((double)lb[w][k],prior_sk*decay);double lr=1.0;for(int it=0;it<200;it++){double delta[20]={};double loss=0;for(auto&[ti,to]:obs[w]){double wh=0;for(int k=0;k<K;k++){double df=d[ti][k]-sk[w][k];if(df>0)wh+=df;}double tgt=to==1?0.0:(double)to,err=wh-tgt;loss+=err*err;for(int k=0;k<K;k++){if(d[ti][k]>sk[w][k])delta[k]+=err;else if(err<-0.5&&d[ti][k]>0)delta[k]+=0.3*err;}}bool ch=false;for(int k=0;k<K;k++){double ns=max((double)lb[w][k],max(0.0,sk[w][k]+lr*delta[k]/n));if(ns!=sk[w][k]){sk[w][k]=ns;ch=true;}}if(!ch||loss/n<0.1)break;lr*=0.95;}upd_et(w);}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>N>>M>>K>>R;d.assign(N,vector<int>(K));for(int i=0;i<N;i++)for(int k=0;k<K;k++)cin>>d[i][k];\n    succs.assign(N,{});task_pre.assign(N,0);for(int r=0;r<R;r++){int u,v;cin>>u>>v;u--;v--;succs[u].push_back(v);task_pre[v]++;}\n    task_st.assign(N,0);task_w.assign(N,-1);worker_t.assign(M,-1);task_sd.assign(N,0);\n    prior_sk=40.0/sqrt((double)K);sk.assign(M,vector<double>(K,prior_sk));lb.assign(M,vector<int>(K,0));obs.resize(M);\n    et.assign(N,vector<double>(M));for(int j=0;j<M;j++)upd_et(j);\n    set<int>avail,idle;for(int i=0;i<N;i++)if(!task_pre[i])avail.insert(i);for(int j=0;j<M;j++)idle.insert(j);\n    cur_day=0;\n    while(true){\n        cur_day++;calc_cp();\n        vector<int>av(avail.begin(),avail.end());sort(av.begin(),av.end(),[](int a,int b){return cp[a]>cp[b];});\n        // Reservation heuristic\n        map<int,double>res_cp;\n        if(!av.empty()){double maxcp=cp[av[0]];for(int wb=0;wb<M;wb++){if(worker_t[wb]==-1)continue;int cur=worker_t[wb];double rem=et[cur][wb]-(cur_day-task_sd[cur]);if(rem<0.5||rem>1.5)continue;for(int nxt:succs[cur]){if(task_pre[nxt]!=1||task_st[nxt]!=0)continue;if(cp[nxt]<maxcp*0.6)continue;int bw=-1;double bet=1e18;for(int j:idle)if(et[nxt][j]<bet){bet=et[nxt][j];bw=j;}if(bw==-1||bet>1.0)continue;double sec=1e18;for(int j=0;j<M;j++)if(j!=bw)sec=min(sec,et[nxt][j]);if(sec>=3.0){if(!res_cp.count(bw)||res_cp[bw]<cp[nxt])res_cp[bw]=cp[nxt];}}}}\n        // Greedy assignment with reservation\n        vector<pair<int,int>>asgn;set<int>id=idle;\n        for(int t:av){if(id.empty())break;int bw=-1;double bt=1e18;for(int j:id){if(res_cp.count(j)&&cp[t]<res_cp[j]*0.85)continue;if(et[t][j]<bt){bt=et[t][j];bw=j;}}if(bw==-1){for(int j:id)if(et[t][j]<bt){bt=et[t][j];bw=j;}}if(bw==-1)break;asgn.push_back({bw,t});id.erase(bw);}\n        int na=asgn.size();\n        // Task substitution: replace poorly-matched assigned tasks with better-fit unassigned ones\n        if(na>0&&!av.empty()){\n            set<int>asgn_set;for(auto&[w,t]:asgn)asgn_set.insert(t);\n            for(int i=0;i<na;i++){\n                int wi=asgn[i].first,ti=asgn[i].second;\n                if(et[ti][wi]<=3.0)continue;\n                double rcp_ti=0;for(int v:succs[ti])rcp_ti=max(rcp_ti,cp[v]);\n                double curr_cost=et[ti][wi]+rcp_ti;\n                int best_tj=-1;double best_cost=curr_cost-3.0;\n                for(int tj:avail){\n                    if(asgn_set.count(tj))continue;\n                    if(cp[tj]<cp[ti]*0.9)continue;\n                    if(et[tj][wi]>1.0)continue;\n                    double rcp_tj=0;for(int v:succs[tj])rcp_tj=max(rcp_tj,cp[v]);\n                    double ncost=et[tj][wi]+rcp_tj;\n                    if(ncost<best_cost){best_cost=ncost;best_tj=tj;}\n                }\n                if(best_tj!=-1){\n                    asgn_set.erase(ti);asgn_set.insert(best_tj);\n                    double rcp_tj=best_cost-et[best_tj][wi];\n                    asgn[i]={wi,best_tj};\n                }\n            }\n        }\n        // Recompute rcp_a for 2-way local search\n        na=asgn.size();\n        if(na>=2){\n            vector<double>rcp_a(na,0.0);for(int i=0;i<na;i++)for(int v:succs[asgn[i].second])rcp_a[i]=max(rcp_a[i],cp[v]);\n            bool impr=true;while(impr){impr=false;for(int i=0;i<na;i++)for(int j=i+1;j<na;j++){\n                int wi=asgn[i].first,ti=asgn[i].second,wj=asgn[j].first,tj=asgn[j].second;\n                double ci=et[ti][wi]+rcp_a[i],cj=et[tj][wj]+rcp_a[j],cs=max(et[ti][wj]+rcp_a[i],et[tj][wi]+rcp_a[j]);\n                if(cs<max(ci,cj)-1e-9){swap(asgn[i].first,asgn[j].first);impr=true;}\n            }}\n        }\n        cout<<asgn.size();for(auto[w,t]:asgn){cout<<' '<<w+1<<' '<<t+1;task_w[t]=w;worker_t[w]=t;task_sd[t]=cur_day;task_st[t]=1;avail.erase(t);idle.erase(w);}\n        cout<<'\\n';cout.flush();\n        int nc;cin>>nc;if(nc==-1)break;\n        for(int i=0;i<nc;i++){int w;cin>>w;w--;int t=worker_t[w];int tk=cur_day-task_sd[t]+1;obs[w].push_back({t,tk});if(tk==1)for(int k=0;k<K;k++)lb[w][k]=max(lb[w][k],d[t][k]);refit(w);task_st[t]=2;task_w[t]=-1;worker_t[w]=-1;idle.insert(w);for(int v:succs[t])if(!--task_pre[v])avail.insert(v);}\n    }\n}","ahc006":"#include <bits/stdc++.h>\nusing namespace std;\nconst int OX=400,OY=400,TOT=1000,K=50,NN=2*K+1;\nint A[TOT],B[TOT],C[TOT],D[TOT],sel[K],NX[NN],NY[NN];\nint md(int x1,int y1,int x2,int y2){return abs(x1-x2)+abs(y1-y2);}\nint ec(int u,int v){return md(NX[u],NY[u],NX[v],NY[v]);}\nvoid refresh(){NX[0]=OX;NY[0]=OY;for(int i=0;i<K;i++){NX[i+1]=A[sel[i]];NY[i+1]=B[sel[i]];NX[K+i+1]=C[sel[i]];NY[K+i+1]=D[sel[i]];}}\nint tcost(const vector<int>&r){int s=0;for(int i=0;i+1<(int)r.size();i++)s+=ec(r[i],r[i+1]);return s;}\nbool feasible(const vector<int>&r){bool p[K+1]={};for(int v:r){if(v>=1&&v<=K)p[v]=true;else if(v>K&&!p[v-K])return false;}return true;}\nvector<int> build_nn(){bool vis[NN]={},has[K+1]={};vector<int> r={0};vis[0]=true;for(int s=0;s<2*K;s++){int cur=r.back(),bv=-1,bd=INT_MAX;for(int v=1;v<NN;v++){if(vis[v]||(v>K&&!has[v-K]))continue;int dd=ec(cur,v);if(dd<bd){bd=dd;bv=v;}}r.push_back(bv);vis[bv]=true;if(bv<=K)has[bv]=true;}r.push_back(0);return r;}\nbool two_opt_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++)for(int j=i+1;j<n-1;j++)if(ec(r[i-1],r[j])+ec(r[i],r[j+1])<ec(r[i-1],r[i])+ec(r[j],r[j+1])){reverse(r.begin()+i,r.begin()+j+1);if(feasible(r))any=true;else reverse(r.begin()+i,r.begin()+j+1);}return any;}\nbool or1_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-1;i++){int v=r[i];int rem=ec(r[i-1],v)+ec(v,r[i+1])-ec(r[i-1],r[i+1]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i)continue;int ins=ec(r[j],v)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i)nr.push_back(r[k]);nr.insert(nr.begin()+((bj<i)?bj+1:bj),v);if(feasible(nr)){r=nr;any=true;}}return any;}\nbool or2_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++){int u=r[i],v=r[i+1];int rem=ec(r[i-1],u)+ec(v,r[i+2])-ec(r[i-1],r[i+2]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i||j==i+1)continue;int ins=ec(r[j],u)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i&&k!=i+1)nr.push_back(r[k]);int pos=(bj<i)?bj+1:bj-1;nr.insert(nr.begin()+pos,u);nr.insert(nr.begin()+pos+1,v);if(feasible(nr)){r=nr;any=true;}}return any;}\nvoid full_search(vector<int>&r){for(;;){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvoid quick_search(vector<int>&r,int it=5){for(int i=0;i<it;i++){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvector<int> build_perturbed(const vector<int>&base,int si){int pi=si+1,di=K+si+1;vector<int> r;r.reserve(base.size()-2);for(int v:base)if(v!=pi&&v!=di)r.push_back(v);int n=r.size();int bc=INT_MAX,bp=0,bd2=1;for(int p=0;p<n-1;p++){int cp=md(NX[r[p]],NY[r[p]],NX[pi],NY[pi])+md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]])-md(NX[r[p]],NY[r[p]],NX[r[p+1]],NY[r[p+1]]);{int cd=md(NX[pi],NY[pi],NX[di],NY[di])+md(NX[di],NY[di],NX[r[p+1]],NY[r[p+1]])-md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=p+1;}}for(int d=p+2;d<n;d++){int cd=md(NX[r[d-1]],NY[r[d-1]],NX[di],NY[di])+md(NX[di],NY[di],NX[r[d]],NY[r[d]])-md(NX[r[d-1]],NY[r[d-1]],NX[r[d]],NY[r[d]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=d;}}}vector<int> res=r;res.insert(res.begin()+bp+1,pi);res.insert(res.begin()+bd2+1,di);return res;}\nvector<int> double_bridge(const vector<int>&r,mt19937&rng){int n=r.size();if(n<8)return r;int pos[4];do{for(int i=0;i<4;i++)pos[i]=1+rng()%(n-2);}while(pos[0]==pos[1]||pos[0]==pos[2]||pos[0]==pos[3]||pos[1]==pos[2]||pos[1]==pos[3]||pos[2]==pos[3]);sort(pos,pos+4);int a=pos[0],b=pos[1],c=pos[2],d=pos[3];vector<int> nr;nr.reserve(n);for(int i=0;i<a;i++)nr.push_back(r[i]);for(int i=c;i<d;i++)nr.push_back(r[i]);for(int i=b;i<c;i++)nr.push_back(r[i]);for(int i=a;i<b;i++)nr.push_back(r[i]);for(int i=d;i<n;i++)nr.push_back(r[i]);return nr;}\nvoid emit(const vector<int>&r){cout<<K;for(int i=0;i<K;i++)cout<<\" \"<<(sel[i]+1);cout<<\"\\n\"<<r.size();for(int v:r)cout<<\" \"<<NX[v]<<\" \"<<NY[v];cout<<\"\\n\";cout.flush();}\nusing Clk=chrono::steady_clock;Clk::time_point T0;double esec(){return chrono::duration<double>(Clk::now()-T0).count();}\nint bcost=INT_MAX;vector<int> broute;int bsel[K];bool inS[TOT]={};\nvoid trysel(){refresh();auto r=build_nn();full_search(r);int c=tcost(r);if(c<bcost){bcost=c;broute=r;copy(sel,sel+K,bsel);}}\nbool greedy_step(){int n=broute.size();vector<int> pos(NN,-1);for(int i=0;i<n;i++)pos[broute[i]]=i;vector<int> rem(K);for(int i=0;i<K;i++){int pi=i+1,di=K+i+1,pp=pos[pi],dp=pos[di];rem[i]=ec(broute[pp-1],pi)+ec(pi,broute[pp+1])-ec(broute[pp-1],broute[pp+1])+ec(broute[dp-1],di)+ec(di,broute[dp+1])-ec(broute[dp-1],broute[dp+1]);}\nvector<tuple<int,int,int>> cands;for(int j=0;j<TOT;j++){if(inS[j])continue;int px=A[j],py=B[j],dx=C[j],dy=D[j];int ins=INT_MAX;for(int p=0;p<n-1;p++){int c=md(NX[broute[p]],NY[broute[p]],px,py)+md(px,py,dx,dy)+md(dx,dy,NX[broute[p+1]],NY[broute[p+1]])-ec(broute[p],broute[p+1]);if(c<ins)ins=c;}for(int si=0;si<K;si++){int g=rem[si]-ins;if(g>0)cands.emplace_back(g,si,j);}}\nif(cands.empty())return false;int tk=min(10,(int)cands.size());partial_sort(cands.begin(),cands.begin()+tk,cands.end(),greater<tuple<int,int,int>>());for(int ci=0;ci<tk;ci++){auto&[g,si,j]=cands[ci];if(inS[j])continue;int old=sel[si];sel[si]=j;refresh();auto nr=build_perturbed(broute,si);quick_search(nr,10);int nc=tcost(nr);if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[j]=true;inS[old]=false;return true;}sel[si]=old;refresh();}return false;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);T0=Clk::now();\n    for(int i=0;i<TOT;i++)cin>>A[i]>>B[i]>>C[i]>>D[i];\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(A[i],B[i],C[i],D[i])+md(C[i],D[i],OX,OY),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(OX,OY,C[i],D[i]),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={max(md(OX,OY,A[i],B[i]),md(OX,OY,C[i],D[i])),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    copy(bsel,bsel+K,sel);refresh();memset(inS,false,sizeof(inS));for(int i=0;i<K;i++)inS[sel[i]]=true;\n    emit(broute);\n    while(esec()<0.5)if(!greedy_step())break;\n    mt19937 rng(42);\n    while(esec()<1.80){\n        copy(bsel,bsel+K,sel);refresh();\n        if(rng()%4!=0){\n            auto nr=double_bridge(broute,rng);\n            if(!feasible(nr))continue;\n            full_search(nr);int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;}\n        }else{\n            int si=rng()%K,no;do{no=rng()%TOT;}while(inS[no]);\n            int oo=sel[si];sel[si]=no;refresh();\n            auto nr=build_perturbed(broute,si);quick_search(nr,5);\n            int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[no]=true;inS[oo]=false;}\n        }\n    }\n    copy(bsel,bsel+K,sel);refresh();\n    for(;;){if(esec()>1.95)break;bool a=two_opt_pass(broute),b=or1_pass(broute),c=or2_pass(broute);if(!a&&!b&&!c)break;}\n    emit(broute);\n    return 0;\n}","ahc007":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=400,M=1995;\nint px[N],py[N],eu[M],ev[M];\nlong long ed[M];\nstruct UF{int p[N],r[N];\nvoid init(){for(int i=0;i<N;i++)p[i]=i,r[i]=0;}\nint find(int x){while(p[x]!=x)x=p[x]=p[p[x]];return x;}\nbool same(int x,int y){return find(x)==find(y);}\nvoid unite(int x,int y){x=find(x);y=find(y);if(x==y)return;if(r[x]<r[y])swap(x,y);p[y]=x;if(r[x]==r[y])r[x]++;}\nint ncomp(){int c=0;for(int i=0;i<N;i++)if(find(i)==i)c++;return c;}}uf;\ndouble compute_thr(int ie,int cu,int cv,int k,long long mn){\n    int cid[N];fill(cid,cid+N,-1);int nc=0;\n    for(int v=0;v<N;v++){int r=uf.find(v);if(cid[r]==-1)cid[r]=nc++;}\n    int src=cid[cu],dst=cid[cv];\n    vector<vector<pair<int,double>>>cadj(nc);\n    for(int j=ie+1;j<M;j++){\n        int fu=uf.find(eu[j]),fv=uf.find(ev[j]);if(fu==fv)continue;\n        int a=cid[fu],b=cid[fv];\n        if(k>0&&((a==src&&b==dst)||(a==dst&&b==src)))continue;\n        double w=2.0*ed[j];cadj[a].push_back({b,w});cadj[b].push_back({a,w});\n    }\n    vector<double>dist(nc,1e18);vector<int>hops(nc,0);\n    {priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>>pq;\n    dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){auto[dv,u]=pq.top();pq.pop();\n        if(dv>dist[u]+1e-9)continue;if(u==dst)break;\n        for(auto&[v,w]:cadj[u]){double nd=dist[u]+w;if(nd<dist[v]){dist[v]=nd;hops[v]=hops[u]+1;pq.push({nd,v});}}}}\n    vector<double>bn(nc,1e18);\n    {priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>>pq;\n    bn[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){auto[bv,u]=pq.top();pq.pop();\n        if(bv>bn[u]+1e-9)continue;if(u==dst)break;\n        for(auto&[v,w]:cadj[u]){double nb=max(bn[u],w);if(nb<bn[v]){bn[v]=nb;pq.push({nb,v});}}}}\n    double sum_thr=1e18;\n    if(dist[dst]<1e17){int n=hops[dst];if(n>0)sum_thr=dist[dst]*(3.0*n+1.0)/(2.0*n*(n+1.0));}\n    double bn_thr=(bn[dst]<1e17)?bn[dst]:1e18;\n    double indir=min(sum_thr,bn_thr);\n    if(k==0)return(indir<1e17)?indir:2.0*ed[ie];\n    double ft=(double)mn*(1.0+2.0/(k+1.0));\n    return(indir<1e17)?min(ft,indir):ft;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++)cin>>px[i]>>py[i];\n    for(int i=0;i<M;i++){cin>>eu[i]>>ev[i];double dx=px[eu[i]]-px[ev[i]],dy=py[eu[i]]-py[ev[i]];ed[i]=llround(sqrt(dx*dx+dy*dy));}\n    uf.init();\n    for(int i=0;i<M;i++){\n        long long l;cin>>l;\n        if(uf.same(eu[i],ev[i])){cout<<0<<endl;continue;}\n        {UF tmp=uf;for(int j=i+1;j<M;j++)tmp.unite(eu[j],ev[j]);\n         if(tmp.ncomp()>1){cout<<1<<endl;uf.unite(eu[i],ev[i]);continue;}}\n        int cu=uf.find(eu[i]),cv=uf.find(ev[i]);\n        int k=0;long long mn=LLONG_MAX;\n        for(int j=i+1;j<M;j++){int fu=uf.find(eu[j]),fv=uf.find(ev[j]);if((fu==cu&&fv==cv)||(fu==cv&&fv==cu)){k++;mn=min(mn,ed[j]);}}\n        double thr=compute_thr(i,cu,cv,k,mn);\n        if((double)l<=thr){cout<<1<<endl;uf.unite(eu[i],ev[i]);}else cout<<0<<endl;\n    }\n}","ahc008":"#include <bits/stdc++.h>\nusing namespace std;\nconst int G=30;\nint N,M,px[20],py[20],hx[10],hy[10];\nbool wall[G+2][G+2];\nint spx[20],spy[20],shx[10],shy[10];\nconst int ddx[]={-1,1,0,0},ddy[]={0,0,-1,1};\nconst char DIRS[]=\"UDLR\",WDIRS[]=\"udlr\";\nbool inb(int x,int y){return x>=1&&x<=G&&y>=1&&y<=G;}\nint dbuf[G+2][G+2];\nvoid bfs(int tx,int ty){\n    for(int i=0;i<=G+1;i++)fill(dbuf[i],dbuf[i]+G+2,-1);\n    dbuf[tx][ty]=0;queue<pair<int,int>>q;q.push({tx,ty});\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int d=0;d<4;d++){int nx=x+ddx[d],ny=y+ddy[d];if(!inb(nx,ny)||wall[nx][ny]||dbuf[nx][ny]!=-1)continue;dbuf[nx][ny]=dbuf[x][y]+1;q.push({nx,ny});}}\n}\nchar gmv(int sx,int sy,int tx,int ty){\n    if(sx==tx&&sy==ty)return '.';bfs(tx,ty);if(dbuf[sx][sy]==-1)return '.';\n    for(int d=0;d<4;d++){int nx=sx+ddx[d],ny=sy+ddy[d];if(!inb(nx,ny)||wall[nx][ny])continue;if(dbuf[nx][ny]==dbuf[sx][sy]-1)return DIRS[d];}return '.';\n}\nbool cpl(int wx,int wy){\n    if(!inb(wx,wy)||wall[wx][wy])return false;\n    for(int i=0;i<N;i++)if(spx[i]==wx&&spy[i]==wy)return false;\n    for(int i=0;i<M;i++)if(shx[i]==wx&&shy[i]==wy)return false;\n    for(int d=0;d<4;d++){int ax=wx+ddx[d],ay=wy+ddy[d];for(int i=0;i<N;i++)if(spx[i]==ax&&spy[i]==ay)return false;}\n    return true;\n}\nstruct Task{int wx,wy,sx,sy,wd;};\nint wt[2],wp[2];bool hp[2];\nvector<Task> tsk[2];\nvector<int> te[2],ct[2];\nint phase=1;\nbool on_side1(int h){return wt[0]==0?(hp[0]?hy[h]<wp[0]:hy[h]>=wp[0]):(hp[0]?hx[h]<wp[0]:hx[h]>=wp[0]);}\nbool on_side(int h){\n    if(!on_side1(h))return false;\n    if(phase==1)return true;\n    return wt[1]==0?(hp[1]?hy[h]<wp[1]:hy[h]>=wp[1]):(hp[1]?hx[h]<wp[1]:hx[h]>=wp[1]);\n}\nvoid setup_phase2(){\n    int pr1,pr2,pc1,pc2;\n    if(wt[0]==0){pr1=1;pr2=G;pc1=hp[0]?1:wp[0];pc2=hp[0]?wp[0]-1:G;}\n    else{pr1=hp[0]?1:wp[0];pr2=hp[0]?wp[0]-1:G;pc1=1;pc2=G;}\n    auto cp=[&](int r1,int c1,int r2,int c2)->int{int cnt=0;for(int i=0;i<N;i++)if(px[i]>=r1&&px[i]<=r2&&py[i]>=c1&&py[i]<=c2)cnt++;return cnt;};\n    auto ch=[&](int r1,int c1,int r2,int c2)->int{int cnt=0;for(int i=0;i<M;i++)if(hx[i]>=r1&&hx[i]<=r2&&hy[i]>=c1&&hy[i]<=c2)cnt++;return cnt;};\n    if(cp(pr1,pc1,pr2,pc2)<2){phase=3;return;}\n    auto ev=[&](int area,int n,int hin)->double{return (double)area/900.0*pow(2.0,-(double)n)*(0.7+0.3*(double)hin/M);};\n    double bv=-1e18;wt[1]=-1;wp[1]=-1;hp[1]=true;\n    for(int c=pc1+1;c<=pc2;c++){\n        int lp=cp(pr1,pc1,pr2,c-1),rp=cp(pr1,c,pr2,pc2);\n        int lh=ch(pr1,pc1,pr2,c-1),rh=ch(pr1,c,pr2,pc2);\n        double vl=ev((c-pc1)*(pr2-pr1+1),lp,lh),vr=ev((pc2-c+1)*(pr2-pr1+1),rp,rh);\n        if(vl>bv){bv=vl;wt[1]=0;wp[1]=c;hp[1]=true;}if(vr>bv){bv=vr;wt[1]=0;wp[1]=c;hp[1]=false;}\n    }\n    for(int r=pr1+1;r<=pr2;r++){\n        int tp=cp(pr1,pc1,r-1,pc2),bp=cp(r,pc1,pr2,pc2);\n        int th=ch(pr1,pc1,r-1,pc2),bh=ch(r,pc1,pr2,pc2);\n        double vt=ev((r-pr1)*(pc2-pc1+1),tp,th),vb=ev((pr2-r+1)*(pc2-pc1+1),bp,bh);\n        if(vt>bv){bv=vt;wt[1]=1;wp[1]=r;hp[1]=true;}if(vb>bv){bv=vb;wt[1]=1;wp[1]=r;hp[1]=false;}\n    }\n    if(wt[1]<0){phase=3;return;}\n    tsk[1].clear();\n    if(wt[1]==0){if(hp[1])for(int r=pr1;r<=pr2;r++)tsk[1].push_back({r,wp[1],r,wp[1]-1,3});else for(int r=pr1;r<=pr2;r++)tsk[1].push_back({r,wp[1]-1,r,wp[1],2});}\n    else{if(hp[1])for(int c=pc1;c<=pc2;c++)tsk[1].push_back({wp[1],c,wp[1]-1,c,1});else for(int c=pc1;c<=pc2;c++)tsk[1].push_back({wp[1]-1,c,wp[1],c,0});}\n    int TT2=tsk[1].size();\n    vector<int>hord(M);iota(hord.begin(),hord.end(),0);\n    if(wt[1]==0)sort(hord.begin(),hord.end(),[](int a,int b){return a<b;});\n    te[1].resize(M);ct[1].resize(M);\n    for(int i=0;i<M;i++){int h=hord[i];ct[1][h]=i*TT2/M;te[1][h]=(i+1)*TT2/M;}\n    phase=2;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    memset(wall,false,sizeof(wall));\n    cin>>N;for(int i=0;i<N;i++){int t;cin>>px[i]>>py[i]>>t;}\n    cin>>M;for(int i=0;i<M;i++)cin>>hx[i]>>hy[i];\n    auto ch0=[&](int wtt,int wpp,bool hhp)->int{int c=0;for(int i=0;i<M;i++){bool ok=wtt==0?(hhp?hy[i]<wpp:hy[i]>=wpp):(hhp?hx[i]<wpp:hx[i]>=wpp);if(ok)c++;}return c;};\n    auto ev0=[&](int area,int n,int wtt,int wpp,bool hhp)->double{return (double)area/900.0*pow(2.0,-(double)n)*(0.7+0.3*(double)ch0(wtt,wpp,hhp)/M);};\n    double bv=-1e18;wt[0]=0;wp[0]=16;hp[0]=true;\n    for(int c=2;c<=G;c++){int lp=0,rp=0;for(int i=0;i<N;i++){if(py[i]<c)lp++;else rp++;}double vl=ev0((c-1)*G,lp,0,c,true),vr=ev0((G-c+1)*G,rp,0,c,false);if(vl>bv){bv=vl;wt[0]=0;wp[0]=c;hp[0]=true;}if(vr>bv){bv=vr;wt[0]=0;wp[0]=c;hp[0]=false;}}\n    for(int r=2;r<=G;r++){int tp=0,bp=0;for(int i=0;i<N;i++){if(px[i]<r)tp++;else bp++;}double vt=ev0((r-1)*G,tp,1,r,true),vb=ev0((G-r+1)*G,bp,1,r,false);if(vt>bv){bv=vt;wt[0]=1;wp[0]=r;hp[0]=true;}if(vb>bv){bv=vb;wt[0]=1;wp[0]=r;hp[0]=false;}}\n    tsk[0].resize(G);\n    if(wt[0]==0){if(hp[0])for(int r=1;r<=G;r++)tsk[0][r-1]={r,wp[0],r,wp[0]-1,3};else for(int r=1;r<=G;r++)tsk[0][r-1]={r,wp[0]-1,r,wp[0],2};}\n    else{if(hp[0])for(int c=1;c<=G;c++)tsk[0][c-1]={wp[0],c,wp[0]-1,c,1};else for(int c=1;c<=G;c++)tsk[0][c-1]={wp[0]-1,c,wp[0],c,0};}\n    vector<int>hord0(M);iota(hord0.begin(),hord0.end(),0);\n    if(wt[0]==0)sort(hord0.begin(),hord0.end(),[&](int a,int b){return hx[a]<hx[b];});\n    else        sort(hord0.begin(),hord0.end(),[&](int a,int b){return hy[a]<hy[b];});\n    te[0].resize(M);ct[0].resize(M);\n    for(int i=0;i<M;i++){int h=hord0[i];ct[0][h]=i*G/M;te[0][h]=(i+1)*G/M;}\n    for(int turn=0;turn<300;turn++){\n        for(int i=0;i<N;i++){spx[i]=px[i];spy[i]=py[i];}\n        for(int i=0;i<M;i++){shx[i]=hx[i];shy[i]=hy[i];}\n        if(phase==1){bool done=true;for(auto&t:tsk[0])if(!wall[t.wx][t.wy]){done=false;break;}if(done)setup_phase2();}\n        string acts(M,'.');\n        if(phase<=2){\n            int ph=phase-1;\n            auto&tsks=tsk[ph];auto&tes=te[ph];auto&cts=ct[ph];int TT=tsks.size();\n            bool all_safe=true;for(int h=0;h<M;h++)if(!on_side(h)){all_safe=false;break;}\n            set<pair<int,int>>pw;vector<bool>isp(M,false);\n            for(int h=0;h<M;h++){\n                while(cts[h]<tes[h]&&wall[tsks[cts[h]].wx][tsks[cts[h]].wy])cts[h]++;\n                if(cts[h]>=(int)tes[h])continue;\n                Task&t=tsks[cts[h]];bool ig=(cts[h]==TT-1)&&!all_safe;\n                if(hx[h]==t.sx&&hy[h]==t.sy&&!ig&&cpl(t.wx,t.wy)&&!pw.count({t.wx,t.wy})){acts[h]=WDIRS[t.wd];pw.insert({t.wx,t.wy});wall[t.wx][t.wy]=true;cts[h]++;isp[h]=true;}\n            }\n            for(int h=0;h<M;h++){\n                if(isp[h])continue;\n                while(cts[h]<tes[h]&&wall[tsks[cts[h]].wx][tsks[cts[h]].wy])cts[h]++;\n                if(cts[h]>=(int)tes[h]){\n                    if(!on_side(h)){\n                        int tx,ty;int p=phase-1;\n                        if(wt[p]==0){tx=hx[h];ty=hp[p]?wp[p]-1:wp[p];}\n                        else{tx=hp[p]?wp[p]-1:wp[p];ty=hy[h];}\n                        char mv=gmv(hx[h],hy[h],tx,ty);acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}\n                    }\n                    continue;\n                }\n                Task&t=tsks[cts[h]];\n                if(hx[h]==t.sx&&hy[h]==t.sy){acts[h]='.';continue;}\n                char mv=gmv(hx[h],hy[h],t.sx,t.sy);acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}\n            }\n            if(phase==2){bool done=true;for(auto&t:tsk[1])if(!wall[t.wx][t.wy]){done=false;break;}if(done)phase=3;}\n        }\n        cout<<acts<<\"\\n\";cout.flush();\n        for(int i=0;i<N;i++){string s;cin>>s;for(char c:s){if(c=='U')px[i]--;else if(c=='D')px[i]++;else if(c=='L')py[i]--;else if(c=='R')py[i]++;}}\n    }\n    return 0;\n}","ahc009":"#include <bits/stdc++.h>\nusing namespace std;\nint si,sj,ti,tj; double pf;\nbool H[20][19],V[19][20];\nint nb[400][4],G;\ndouble PP[201][400],PE[201];\ndouble VA[201][400];\nvoid initNb(){for(int i=0;i<20;i++)for(int j=0;j<20;j++){int c=i*20+j;nb[c][0]=(i>0&&!V[i-1][j])?(i-1)*20+j:c;nb[c][1]=(i<19&&!V[i][j])?(i+1)*20+j:c;nb[c][2]=(j>0&&!H[i][j-1])?i*20+(j-1):c;nb[c][3]=(j<19&&!H[i][j])?i*20+(j+1):c;}}\nint dc(char c){return c=='U'?0:c=='D'?1:c=='L'?2:3;}\nvoid computeVA(){memset(VA,0,sizeof(VA));for(int t=199;t>=0;t--)for(int c=0;c<400;c++){if(c==G)continue;double best=-1e18;for(int d=0;d<4;d++){int nk=nb[c][d];double v=pf*VA[t+1][c]+(nk==G?(1-pf)*(400.-t):(1-pf)*VA[t+1][nk]);if(v>best)best=v;}VA[t][c]=best;}}\nvoid buildP(const string&s,int fr){for(int t=fr;t<200;t++){int d=dc(s[t]);double*a=PP[t],*b=PP[t+1];memset(b,0,3200);for(int k=0;k<400;k++){double v=a[k];if(v<1e-15)continue;b[k]+=v*pf;b[nb[k][d]]+=v*(1-pf);}double e=b[G]*(401.-(t+1));b[G]=0;PE[t+1]=PE[t]+e;}}\ndouble evalF(const string&s,int fr){double p[400],q[400];memcpy(p,PP[fr],3200);double E=PE[fr];for(int t=fr;t<200;t++){int d=dc(s[t]);memset(q,0,3200);for(int k=0;k<400;k++){double v=p[k];if(v<1e-15)continue;q[k]+=v*pf;q[nb[k][d]]+=v*(1-pf);}E+=q[G]*(401.-(t+1));q[G]=0;memcpy(p,q,3200);}return E;}\nvoid setP(const string&s){memset(PP[0],0,3200);PP[0][si*20+sj]=1;PE[0]=0;buildP(s,0);}\nchrono::time_point<chrono::steady_clock>T0;\ndouble el(){return chrono::duration<double>(chrono::steady_clock::now()-T0).count();}\ndouble hc(string&s,double E0,double tl){double be=E0;for(;;){if(el()>tl)break;bool imp=false;for(int t=0;t<200;t++){int od=dc(s[t]);for(int d=0;d<4;d++){if(d==od)continue;s[t]=\"UDLR\"[d];double e=evalF(s,t);if(e>be+1e-12){be=e;od=d;buildP(s,t);imp=true;}else s[t]=\"UDLR\"[od];}}if(!imp)break;}return be;}\nstring bfsPath(){int ds[400];fill(ds,ds+400,-1);int pr[400],pd[400];int src=si*20+sj;queue<int>q;q.push(src);ds[src]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||ds[nk]!=-1)continue;ds[nk]=ds[k]+1;pr[nk]=k;pd[nk]=d;q.push(nk);}}string r;for(int c=G;c!=src;c=pr[c])r+=\"UDLR\"[pd[c]];reverse(r.begin(),r.end());return r;}\nstring distanceGreedy(){int bd[400];fill(bd,bd+400,-1);queue<int>q;q.push(G);bd[G]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||bd[nk]!=-1)continue;bd[nk]=bd[k]+1;q.push(nk);}}double prob[400]={},np[400];prob[si*20+sj]=1.0;string s(200,'D');for(int t=0;t<200;t++){double best=-1e18;int bestd=0;for(int d=0;d<4;d++){double g=0;for(int k=0;k<400;k++){if(prob[k]<1e-15)continue;g+=prob[k]*(1-pf)*(bd[k]-bd[nb[k][d]]);}if(g>best){best=g;bestd=d;}}s[t]=\"UDLR\"[bestd];memset(np,0,3200);for(int k=0;k<400;k++){if(prob[k]<1e-15)continue;np[k]+=prob[k]*pf;np[nb[k][bestd]]+=prob[k]*(1-pf);}np[G]=0;memcpy(prob,np,3200);}return s;}\ndouble la_val(const double*prob,int t,int depth){if(depth==0||t>=200){double v=0;for(int k=0;k<400;k++)if(prob[k]>1e-15)v+=prob[k]*(t<200?VA[t][k]:0.);return v;}double best=-1e18,np[400];for(int d=0;d<4;d++){memset(np,0,3200);for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nb[k][d]]+=v*(1-pf);}double sc=np[G]*(400.-t);np[G]=0;double fv=la_val(np,t+1,depth-1);if(sc+fv>best)best=sc+fv;}return best;}\nstring kStepGreedy(int K){double prob[400]={},np[400];prob[si*20+sj]=1.0;string s(200,'D');for(int t=0;t<200;t++){double best=-1e18;int bestd=0;for(int d=0;d<4;d++){memset(np,0,3200);for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nb[k][d]]+=v*(1-pf);}double sc=np[G]*(400.-t);np[G]=0;double fv=la_val(np,t+1,K-1);if(sc+fv>best){best=sc+fv;bestd=d;}}s[t]=\"UDLR\"[bestd];memset(np,0,3200);for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nb[k][bestd]]+=v*(1-pf);}np[G]=0;memcpy(prob,np,3200);}return s;}\nint main(){\n    ios::sync_with_stdio(0);cin.tie(0);\n    cin>>si>>sj>>ti>>tj>>pf;\n    for(int i=0;i<20;i++){string r;cin>>r;for(int j=0;j<19;j++)H[i][j]=(r[j]=='1');}\n    for(int i=0;i<19;i++){string r;cin>>r;for(int j=0;j<20;j++)V[i][j]=(r[j]=='1');}\n    initNb();G=ti*20+tj;T0=chrono::steady_clock::now();\n    computeVA();\n    string path=bfsPath();int K=(int)path.size();\n    string s1(200,'D');for(int i=0;i<200;i++)s1[i]=path[i%K];\n    string s2=kStepGreedy(3);\n    string s3=distanceGreedy();\n    setP(s1);double e1=hc(s1,PE[200],0.13);\n    setP(s2);double e2=hc(s2,PE[200],0.27);\n    setP(s3);double e3=hc(s3,PE[200],0.43);\n    string gb;double gbE;\n    if(e1>=e2&&e1>=e3){gb=s1;gbE=e1;}else if(e2>=e3){gb=s2;gbE=e2;}else{gb=s3;gbE=e3;}\n    setP(gb);\n    mt19937 rng(42);uniform_real_distribution<double>ud(0,1);\n    // SA with STEP-BASED cooling - eliminates timing sensitivity\n    {string sc=gb;double scE=gbE;double T=2.0;int sa_st=0;\n    const int SA_MAX=6000; // calibrated for ~120us/step * 6000 = 720ms\n    while(el()<1.2&&sa_st<SA_MAX){\n        int t=rng()%200,od=dc(sc[t]),nd=(od+1+(int)(rng()%3))%4;\n        sc[t]=\"UDLR\"[nd];double e=evalF(sc,t),dlt=e-scE;\n        if(dlt>0||ud(rng)<exp(dlt/T)){scE=e;buildP(sc,t);if(e>gbE){gbE=e;gb=sc;}}\n        else sc[t]=\"UDLR\"[od];\n        sa_st++;\n        if(sa_st%500==0){\n            // STEP-BASED cooling: temperature depends only on step count, not elapsed time\n            T=2.0*exp(-7.0*(double)sa_st/SA_MAX);\n            if(scE<gbE-20.){sc=gb;scE=gbE;setP(sc);}\n        }\n    }}\n    setP(gb);\n    while(el()<1.87){string p2=gb;int st=rng()%3;\n    if(st==0){int M=5+(int)(rng()%21);for(int i=0;i<M;i++){int t=rng()%200;p2[t]=\"UDLR\"[(dc(p2[t])+1+(int)(rng()%3))%4];}}\n    else if(st==1){int ts=(int)(rng()%200),sl=10+(int)(rng()%41);for(int i=ts;i<min(200,ts+sl);i++)p2[i]=\"UDLR\"[rng()%4];}\n    else{int ts=(int)(rng()%200),sl=10+(int)(rng()%41),po=rng()%K;for(int i=ts;i<min(200,ts+sl);i++)p2[i]=path[(po+(i-ts))%K];}\n    setP(p2);double e=hc(p2,PE[200],1.87);if(e>gbE+1e-12){gbE=e;gb=p2;}}\n    cout<<gb<<\"\\n\";\n}","ahc010":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30,TOTAL=N*N*4;\nconst int to_t[8][4]={{1,0,-1,-1},{3,-1,-1,0},{-1,-1,3,2},{-1,2,1,-1},{1,0,3,2},{3,2,1,0},{2,-1,0,-1},{-1,3,-1,1}};\nconst int di[4]={0,-1,0,1},dj[4]={-1,0,1,0};\nint tiles[N][N],init_t[N][N],rots[N][N],best_rots[N][N];\nlong long global_best=0;\nmt19937 rng(42);int nxt[TOTAL];uint8_t col[TOTAL];\ninline int apply_rot(int t,int r){if(t<=3)return(t+r)&3;if(t<=5)return 4+((t-4+r)&1);return 6+((t-6+r)&1);}\ninline void update_nxt(int i,int j){int base=(i*N+j)*4,t=tiles[i][j];for(int d=0;d<4;d++){int d2=to_t[t][d];if(d2<0){nxt[base+d]=-1;continue;}int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N){nxt[base+d]=-1;continue;}nxt[base+d]=(ni*N+nj)*4+((d2+2)&3);}}\nlong long evaluate(){memset(col,0,TOTAL);int t1=0,t2=0;for(int s=0;s<TOTAL;s++){if(col[s])continue;int c=s;while(c>=0&&!col[c]){col[c]=1;c=nxt[c];}if(c>=0&&col[c]==1){int len=0,cc=c;do{cc=nxt[cc];len++;}while(cc!=c);if(len>t1){t2=t1;t1=len;}else if(len>t2)t2=len;}c=s;while(c>=0&&col[c]==1){col[c]=2;c=nxt[c];}}return(long long)t1*t2;}\nconst auto TS=chrono::steady_clock::now();\ndouble gt(){return chrono::duration<double>(chrono::steady_clock::now()-TS).count();}\nstatic bool dv[TOTAL],dvb[TOTAL];\ntypedef array<int,3> Pt;\nint dfs_loop(int si,int sj,int sd,const bool*occ){\n    memset(dv,0,TOTAL);if(occ&&occ[(si*N+sj)*4+sd])return 0;\n    int i=si,j=sj,d=sd,len=0;\n    while(len<TOTAL){\n        int s=(i*N+j)*4+d;if(dv[s])return(i==si&&j==sj&&d==sd&&len>0)?len:0;\n        if(occ&&occ[s])return 0;dv[s]=true;\n        int base=(i*N+j)*4;\n        bool dc=false;for(int p=0;p<4&&!dc;p++)if(p!=d&&dv[base+p])dc=true;\n        bool gc=false;if(occ)for(int p=0;p<4&&!gc;p++)if(occ[base+p])gc=true;\n        if(dc||gc){int d2=to_t[tiles[i][j]][d];if(d2<0)return 0;int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)return 0;int nd=(d2+2)&3;if(occ&&occ[(ni*N+nj)*4+nd])return 0;len++;if(ni==si&&nj==sj&&nd==sd)return len;i=ni;j=nj;d=nd;continue;}\n        int ti=init_t[i][j],br=-1,bp=-9999;\n        for(int r=0;r<4;r++){int t=apply_rot(ti,r),d2=to_t[t][d];if(d2<0)continue;int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;int nd=(d2+2)&3,ns=(ni*N+nj)*4+nd;if(occ&&occ[ns])continue;\n            // 1-step lookahead: skip if next committed and incompatible\n            int nb=(ni*N+nj)*4;bool nc=false;for(int pp=0;pp<4&&!nc;pp++)if(pp!=nd&&(dv[nb+pp]||(occ&&occ[nb+pp])))nc=true;\n            if(nc&&to_t[tiles[ni][nj]][nd]<0)continue;\n            int p=(!dv[ns])?100:0;if(ni==si&&nj==sj&&nd==sd&&len>4)p=50;int nti=init_t[ni][nj];if(nti==4||nti==5)p+=5;if(ni>0&&ni<N-1&&nj>0&&nj<N-1)p+=3;p+=rng()%4;if(p>bp){bp=p;br=r;}}\n        if(br<0)return 0;\n        rots[i][j]=br;tiles[i][j]=apply_rot(ti,br);update_nxt(i,j);\n        int d2=to_t[tiles[i][j]][d];int ni=i+di[d2],nj=j+dj[d2],nd=(d2+2)&3;\n        if(occ&&occ[(ni*N+nj)*4+nd])return 0;len++;if(ni==si&&nj==sj&&nd==sd)return len;i=ni;j=nj;d=nd;\n    }return 0;\n}\nint build_loop(int n,const bool*occ,const vector<Pt>*sm=nullptr){\n    int sr[N][N];memcpy(sr,rots,sizeof(rots));int bl=0,bs[N][N];memcpy(bs,sr,sizeof(sr));memset(dvb,0,TOTAL);\n    for(int a=0;a<n;a++){\n        memcpy(rots,sr,sizeof(rots));for(int i=0;i<N;i++)for(int j=0;j<N;j++){tiles[i][j]=apply_rot(init_t[i][j],rots[i][j]);update_nxt(i,j);}\n        int si,sj,sd;\n        if(sm&&!sm->empty()&&(int)(rng()%10)<7){const auto&p=(*sm)[rng()%sm->size()];si=p[0];sj=p[1];sd=p[2];}\n        else{si=rng()%N;sj=rng()%N;sd=rng()%4;}\n        int l=dfs_loop(si,sj,sd,occ);\n        if(l>bl){bl=l;memcpy(bs,rots,sizeof(rots));memcpy(dvb,dv,TOTAL);}\n    }\n    memcpy(rots,bs,sizeof(rots));for(int i=0;i<N;i++)for(int j=0;j<N;j++){tiles[i][j]=apply_rot(init_t[i][j],rots[i][j]);update_nxt(i,j);}return bl;\n}\nvoid conn_greedy(){for(int p=0;p<20;p++){bool c=false;for(int i=0;i<N;i++)for(int j=0;j<N;j++){int ti=init_t[i][j];if(ti==4||ti==5)continue;int br=rots[i][j],bc=-1;for(int r=0;r<4;r++){int t=apply_rot(ti,r),cnt=0;for(int d=0;d<4;d++){if(to_t[t][d]<0)continue;int ni=i+di[d],nj=j+dj[d];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;if(to_t[tiles[ni][nj]][(d+2)%4]>=0)cnt++;}if(cnt>bc){bc=cnt;br=r;}}if(br!=rots[i][j]){rots[i][j]=br;tiles[i][j]=apply_rot(ti,br);update_nxt(i,j);c=true;}}if(!c)break;}}\nvoid run_sa(double Tf,double et){\n    long long cur=evaluate();if(cur>global_best){global_best=cur;memcpy(best_rots,rots,sizeof(rots));}\n    double si=max(10.0,(double)cur),e=gt(),s0=e;int cnt=0;\n    while(e<et){if((cnt&255)==0)e=gt();cnt++;double prog=min(1.0,(e-s0)/max(et-s0,1e-9));double T=max(0.1,si*Tf*exp(-3.0*prog));\n        int i=rng()%N,j=rng()%N,ti=init_t[i][j];int dr=(ti<=3)?(rng()%3)+1:1,nr=(rots[i][j]+dr)&3,ot=tiles[i][j];\n        tiles[i][j]=apply_rot(ti,nr);update_nxt(i,j);long long ns=evaluate(),delta=ns-cur;\n        if(delta>=0||rng()/4294967296.0<exp((double)delta/T)){rots[i][j]=nr;cur=ns;if(ns>global_best){global_best=ns;memcpy(best_rots,rots,sizeof(rots));}}\n        else{tiles[i][j]=ot;update_nxt(i,j);}\n    }\n}\nvoid run_greedy(long long&cur,double et){\n    for(bool imp=true;imp&&gt()<et;){imp=false;for(int i=0;i<N&&gt()<et;i++)for(int j=0;j<N;j++){int ti=init_t[i][j],bd=0;long long bl=cur;int st=tiles[i][j];int mdr=(ti<=3)?3:1;for(int dr=1;dr<=mdr;dr++){int nr=(rots[i][j]+dr)&3;tiles[i][j]=apply_rot(ti,nr);update_nxt(i,j);long long ns=evaluate();if(ns>bl){bl=ns;bd=dr;}tiles[i][j]=st;update_nxt(i,j);}if(bd){rots[i][j]=(rots[i][j]+bd)&3;tiles[i][j]=apply_rot(ti,rots[i][j]);update_nxt(i,j);cur=bl;if(bl>global_best){global_best=bl;memcpy(best_rots,rots,sizeof(rots));}imp=true;}}}\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){init_t[i][j]=s[j]-'0';tiles[i][j]=init_t[i][j];rots[i][j]=0;}}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n    memset(best_rots,0,sizeof(best_rots));\n    const double TL=1.85;const int NR=10;double tpr=TL/NR;\n    for(int restart=0;restart<NR&&gt()<TL-0.02;restart++){\n        double rs=gt();\n        if(restart==0){\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++){rots[i][j]=0;tiles[i][j]=init_t[i][j];}\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n            conn_greedy();\n        }else if(restart<7){\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++){int ti=init_t[i][j],r=(ti<=3)?rng()%4:(rng()%2)?1:0;rots[i][j]=r;tiles[i][j]=apply_rot(ti,r);}\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n            conn_greedy();\n            long long pre=evaluate();int pr[N][N];memcpy(pr,rots,sizeof(rots));\n            int L1=build_loop(800,nullptr);\n            if(L1>0){\n                bool occ1[TOTAL];memcpy(occ1,dvb,TOTAL);\n                vector<Pt> smart;\n                for(int i=0;i<N;i++)for(int j=0;j<N;j++){\n                    if(init_t[i][j]!=4&&init_t[i][j]!=5)continue;\n                    int base=(i*N+j)*4;bool in_l1=false;\n                    for(int dd=0;dd<4;dd++)if(occ1[base+dd]){in_l1=true;break;}\n                    if(!in_l1)continue;\n                    for(int dd=0;dd<4;dd++)if(!occ1[base+dd])smart.push_back({i,j,dd});\n                }\n                build_loop(800,occ1,smart.empty()?nullptr:&smart);\n            }\n            if(evaluate()<=0&&pre>0){memcpy(rots,pr,sizeof(rots));for(int i=0;i<N;i++)for(int j=0;j<N;j++){tiles[i][j]=apply_rot(init_t[i][j],rots[i][j]);update_nxt(i,j);}}\n        }else{\n            memcpy(rots,best_rots,sizeof(rots));for(int i=0;i<N;i++)for(int j=0;j<N;j++){tiles[i][j]=apply_rot(init_t[i][j],rots[i][j]);update_nxt(i,j);}\n            for(int k=0;k<100;k++){int pi=rng()%N,pj=rng()%N,ti=init_t[pi][pj];int dr=(ti<=3)?(rng()%3)+1:1;rots[pi][pj]=(rots[pi][pj]+dr)&3;tiles[pi][pj]=apply_rot(ti,rots[pi][pj]);update_nxt(pi,pj);}\n        }\n        long long cur=evaluate();run_greedy(cur,min(TL-0.02,rs+0.02));\n        run_sa(0.1,min(TL-0.01,rs+tpr));\n    }\n    string out(N*N,'0');for(int i=0;i<N;i++)for(int j=0;j<N;j++)out[i*N+j]='0'+best_rots[i][j];\n    cout<<out<<\"\\n\";return 0;\n}","ahc011":"#include <bits/stdc++.h>\nusing namespace std;\nint N,T,board[10][10],board_label[10][10],er,ec,tgt[10][10],avail[16];\nbool fixed_cells[10][10];string out;int total_edges;\nint uf_p[101],uf_rk[101];\nstruct UFCh{int ch,op,rt,ork;};vector<UFCh>uf_ch;\nvoid uf_init(){for(int i=0;i<=N*N;i++){uf_p[i]=i;uf_rk[i]=0;}}\nint uf_find(int x){while(uf_p[x]!=x)x=uf_p[x];return x;}\nbool uf_union(int a,int b){int ra=uf_find(a),rb=uf_find(b);if(ra==rb)return false;if(uf_rk[ra]<uf_rk[rb])swap(ra,rb);uf_ch.push_back({rb,uf_p[rb],ra,uf_rk[ra]});uf_p[rb]=ra;if(uf_rk[ra]==uf_rk[rb])uf_rk[ra]++;return true;}\nvoid uf_rollback(int sv){while((int)uf_ch.size()>sv){UFCh c=uf_ch.back();uf_ch.pop_back();uf_p[c.ch]=c.op;uf_rk[c.rt]=c.ork;}}\nint sb_p[100],sb_sz[100];bool sb_cy[100];\nint sb_find(int x){while(sb_p[x]!=x){sb_p[x]=sb_p[sb_p[x]];x=sb_p[x];}return x;}\nint scoreBoard(){int NN=N*N;for(int i=0;i<NN;i++){sb_p[i]=i;sb_sz[i]=1;sb_cy[i]=false;}auto add=[&](int a,int b2){int ra=sb_find(a),rb=sb_find(b2);if(ra==rb){sb_cy[ra]=true;return;}if(sb_sz[ra]<sb_sz[rb])swap(ra,rb);sb_p[rb]=ra;sb_sz[ra]+=sb_sz[rb];if(sb_cy[rb])sb_cy[ra]=true;};for(int i=0;i<N;i++)for(int j=0;j<N-1;j++)if(board[i][j]>0&&board[i][j+1]>0&&(board[i][j]&4)&&(board[i][j+1]&1))add(i*N+j,i*N+j+1);for(int i=0;i<N-1;i++)for(int j=0;j<N;j++)if(board[i][j]>0&&board[i+1][j]>0&&(board[i][j]&8)&&(board[i+1][j]&2))add(i*N+j,(i+1)*N+j);int best=0;for(int i=0;i<NN;i++)if(board[i/N][i%N]>0&&sb_find(i)==i&&!sb_cy[i])best=max(best,sb_sz[i]);return best;}\nvoid read_input(){cin>>N>>T;for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){char c=s[j];board[i][j]=(c>='0'&&c<='9')?c-'0':c-'a'+10;if(!board[i][j]){er=i;ec=j;}}}}\nbool valid_pos(int v,int i,int j){return!((v&1)&&!j)&&!((v&2)&&!i)&&!((v&4)&&j==N-1)&&!((v&8)&&i==N-1);}\nint g_ops;\nbool find_target(int pos){\n    if(++g_ops>5000000)return false;\n    if(pos==N*N)return total_edges==N*N-2;\n    int i=pos/N,j=pos%N;if(i==N-1&&j==N-1){tgt[i][j]=0;return find_target(pos+1);}\n    bool fl=(j>0),nl=fl&&(tgt[i][j-1]&4),fu=(i>0),nu=fu&&(tgt[i-1][j]&8);\n    int new_ed=(fl?nl:0)+(fu?nu:0);if(total_edges+new_ed>N*N-2){tgt[i][j]=-1;return false;}\n    for(int v=1;v<=15;v++){\n        if(!avail[v]||!valid_pos(v,i,j))continue;if(fl&&!!(v&1)!=nl)continue;if(fu&&!!(v&2)!=nu)continue;\n        if(j<N-1){int nj=j+1;bool n2=(v&4)!=0,ok=false;if(i==N-1&&nj==N-1)ok=!n2;else{bool fcu=(i>0),nu2=fcu&&(tgt[i-1][nj]&8);for(int u=1;u<=15&&!ok;u++){int cnt=avail[u]-(u==v?1:0);if(cnt<=0||!valid_pos(u,i,nj)||!!(u&1)!=n2||(fcu&&!!(u&2)!=nu2))continue;ok=true;}}if(!ok)continue;}\n        if(i<N-1){int ni=i+1;bool n2=(v&8)!=0,ok=false;if(ni==N-1&&j==N-1)ok=!n2;else{for(int u=1;u<=15&&!ok;u++){int cnt=avail[u]-(u==v?1:0);if(cnt<=0||!valid_pos(u,ni,j)||!!(u&2)!=n2)continue;ok=true;}}if(!ok)continue;}\n        int sv=(int)uf_ch.size(),node=i*N+j;bool cyc=false;\n        if(fl&&nl&&!uf_union(node,i*N+j-1))cyc=true;if(!cyc&&fu&&nu&&!uf_union(node,(i-1)*N+j))cyc=true;\n        if(cyc){uf_rollback(sv);continue;}\n        avail[v]--;tgt[i][j]=v;total_edges+=new_ed;if(find_target(pos+1))return true;\n        total_edges-=new_ed;tgt[i][j]=-1;avail[v]++;uf_rollback(sv);}\n    tgt[i][j]=-1;return false;}\nvoid init_labels(){vector<pair<int,int>>cp[16],tp[16];for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(board[i][j]>0)cp[board[i][j]].push_back({i,j});if(tgt[i][j]>0)tp[tgt[i][j]].push_back({i,j});}for(int v=1;v<=15;v++){sort(cp[v].begin(),cp[v].end());sort(tp[v].begin(),tp[v].end());for(int k=0;k<(int)cp[v].size();k++){auto[cr,cc]=cp[v][k];auto[tr,tc]=tp[v][k];board_label[cr][cc]=tr*N+tc;}}}\nbool check_solvable(){vector<int>s;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]>=0)s.push_back(board_label[i][j]);int inv=0;for(int a=0;a<(int)s.size();a++)for(int b=a+1;b<(int)s.size();b++)if(s[a]>s[b])inv++;if(N%2)return!(inv%2);return(inv+er)%2==1;}\nvoid fix_parity(){if(check_solvable())return;for(int v=1;v<=15;v++){vector<pair<int,int>>cp;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]==v)cp.push_back({i,j});if((int)cp.size()>=2){swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);if(check_solvable())return;swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);}}}\nvoid do_move(char m){int tr=er,tc=ec;if(m=='U')tr--;else if(m=='D')tr++;else if(m=='L')tc--;else tc++;board[er][ec]=board[tr][tc];board_label[er][ec]=board_label[tr][tc];board[tr][tc]=0;board_label[tr][tc]=-1;er=tr;ec=tc;out+=m;}\nstatic int me_prv[100],me_q[100];\nbool move_empty(int gr,int gc){if(er==gr&&ec==gc)return true;if((int)out.size()>=T)return false;if(fixed_cells[gr][gc])return false;int NN=N*N,s=er*N+ec,g=gr*N+gc;fill(me_prv,me_prv+NN,-2);me_prv[s]=-1;int qh=0,qt=0;me_q[qt++]=s;const int dr[]={-1,1,0,0},dc[]={0,0,-1,1};while(qh<qt){int cur=me_q[qh++];if(cur==g)break;int r=cur/N,c=cur%N;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int nxt=nr*N+nc;if(me_prv[nxt]!=-2)continue;me_prv[nxt]=cur;me_q[qt++]=nxt;}}if(me_prv[g]==-2)return false;static int path[101];int plen=0,cur=g;while(cur!=s){path[plen++]=cur;cur=me_prv[cur];}for(int k=plen-1;k>=0;k--){if((int)out.size()>=T)return false;int nxt=path[k],nr=nxt/N,nc=nxt%N;char m;if(nr==er-1)m='U';else if(nr==er+1)m='D';else if(nc==ec-1)m='L';else m='R';do_move(m);}return true;}\nstatic int bt_prv[10000],bt_q[10001];static char bt_mv[10000],bt_path[10000];\nbool bfs_tile(int&tr,int&tc,int dr,int dc){if(tr==dr&&tc==dc)return true;if((int)out.size()>=T)return false;int NN=N*N,t0=tr*N+tc,e0=er*N+ec,tg=dr*N+dc,tot=NN*NN;memset(bt_prv,-1,tot*sizeof(int));int start=t0*NN+e0;bt_prv[start]=start;int qh=0,qt=0;bt_q[qt++]=start;const int ddr[]={-1,1,0,0},ddc[]={0,0,-1,1};const char dch[]={'U','D','L','R'};int goal=-1;while(qh<qt){int cur=bt_q[qh++];int ct=cur/NN,ce=cur%NN;if(ct==tg){goal=cur;break;}int er_=ce/N,ec_=ce%N;for(int d=0;d<4;d++){int nr=er_+ddr[d],nc=ec_+ddc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int np=nr*N+nc,nt=(np==ct)?ce:ct,ne=np;if(nt==ne)continue;int nst=nt*NN+ne;if(nst<0||nst>=tot||bt_prv[nst]!=-1)continue;bt_prv[nst]=cur;bt_mv[nst]=dch[d];bt_q[qt++]=nst;}}if(goal<0){for(int e=0;e<NN&&goal<0;e++){if(e==tg||fixed_cells[e/N][e%N])continue;int s=tg*NN+e;if(s<tot&&bt_prv[s]!=-1)goal=s;}}if(goal<0)return false;int plen=0,cur=goal;while(cur!=start){bt_path[plen++]=bt_mv[cur];cur=bt_prv[cur];}for(int k=plen-1;k>=0;k--){if((int)out.size()>=T)return false;do_move(bt_path[k]);}tr=dr;tc=dc;return true;}\npair<int,int>find_lbl(int lbl){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]==lbl)return{i,j};return{-1,-1};}\nvoid solve_row(int row){if((int)out.size()>=T)return;for(int col=0;col<=N-3&&(int)out.size()<T;col++){auto[cr,cc]=find_lbl(row*N+col);if(cr<0)continue;if(cr==row&&cc==col){fixed_cells[row][col]=true;continue;}bfs_tile(cr,cc,row,col);fixed_cells[row][col]=true;}if((int)out.size()>=T)return;auto[ar,ac]=find_lbl(row*N+(N-2));auto[br,bc]=find_lbl(row*N+(N-1));if(ar<0||br<0)return;if(ar==row&&ac==N-2&&br==row&&bc==N-1){fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;return;}bfs_tile(ar,ac,row,N-1);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl(row*N+(N-1));if(br2<0)return;fixed_cells[row][N-1]=true;bfs_tile(br2,bc2,row+1,N-1);fixed_cells[row][N-1]=false;if((int)out.size()>=T)return;fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=true;move_empty(row,N-2);fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=false;if((int)out.size()<T&&er==row&&ec==N-2){do_move('R');if((int)out.size()<T)do_move('D');}fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;}\nvoid solve_col(int col){if((int)out.size()>=T)return;auto[ar,ac]=find_lbl((N-2)*N+col);auto[br,bc]=find_lbl((N-1)*N+col);if(ar<0||br<0)return;if(ar==N-2&&ac==col&&br==N-1&&bc==col){fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;return;}bfs_tile(ar,ac,N-1,col);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl((N-1)*N+col);if(br2<0)return;fixed_cells[N-1][col]=true;bfs_tile(br2,bc2,N-1,col+1);fixed_cells[N-1][col]=false;if((int)out.size()>=T)return;fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=true;move_empty(N-2,col);fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=false;if((int)out.size()<T&&er==N-2&&ec==col){do_move('D');if((int)out.size()<T)do_move('R');}fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;}\nvoid solve_2x2(){if((int)out.size()>=T)return;int p0=(N-2)*N+(N-2),p1=(N-2)*N+(N-1),p2=(N-1)*N+(N-2);int a=board_label[N-2][N-2],b=board_label[N-2][N-1],c=board_label[N-1][N-2],d=board_label[N-1][N-1];if(a==p0&&b==p1&&c==p2&&d==-1)return;auto el=[&](int l)->int{if(l==p0)return 0;if(l==p1)return 1;if(l==p2)return 2;return 3;};auto enc=[](int v0,int v1,int v2,int v3){return v0*64+v1*16+v2*4+v3;};int gs=enc(0,1,2,3),ss=enc(el(a),el(b),el(c),el(d));if(ss==gs)return;static int par[256];static char mfr[256];fill(par,par+256,-2);par[ss]=-1;static int bq[256];int bqh=0,bqt=0;bq[bqt++]=ss;const int adj[4][2]={{1,2},{0,3},{0,3},{1,2}};const char amv[4][2]={{'R','D'},{'L','D'},{'U','R'},{'U','L'}};while(bqh<bqt){int cur=bq[bqh++];if(cur==gs)break;int v[4]={(cur>>6)&3,(cur>>4)&3,(cur>>2)&3,cur&3};int ep=-1;for(int p=0;p<4;p++)if(v[p]==3){ep=p;break;}if(ep<0)continue;for(int k=0;k<2;k++){int np=adj[ep][k];char m=amv[ep][k];int nv[4]={v[0],v[1],v[2],v[3]};nv[ep]=nv[np];nv[np]=3;int nst=enc(nv[0],nv[1],nv[2],nv[3]);if(par[nst]==-2){par[nst]=cur;mfr[nst]=m;bq[bqt++]=nst;}}}if(par[gs]==-2)return;static char path[20];int plen=0;int cur=gs;while(cur!=ss){path[plen++]=mfr[cur];cur=par[cur];}for(int k=plen-1;k>=0;k--){if((int)out.size()>=T)break;do_move(path[k]);}}\nvoid solve(){for(int row=0;row<=N-3&&(int)out.size()<T;row++)solve_row(row);for(int col=0;col<=N-3&&(int)out.size()<T;col++)solve_col(col);solve_2x2();}\nvoid greedySolve(){const int dr[]={-1,1,0,0},dc[]={0,0,-1,1};const char mv[]={'U','D','L','R'};while((int)out.size()<T){int bsc=scoreBoard(),bsc2=bsc;char best=0;for(int d=0;d<4;d++){int nr=er+dr[d],nc=ec+dc[d];if(nr<0||nr>=N||nc<0||nc>=N)continue;int sb[10][10];memcpy(sb,board,sizeof(board));int se=er,sf=ec;int tr2=er,tc2=ec;if(mv[d]=='U')tr2--;else if(mv[d]=='D')tr2++;else if(mv[d]=='L')tc2--;else tc2++;board[er][ec]=board[tr2][tc2];board[tr2][tc2]=0;er=tr2;ec=tc2;int sc=scoreBoard();memcpy(board,sb,sizeof(board));er=se;ec=sf;if(sc>bsc2){bsc2=sc;best=mv[d];}}if(!best)break;do_move(best);}}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);read_input();\n    memset(avail,0,sizeof(avail));for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]>0)avail[board[i][j]]++;\n    memset(tgt,-1,sizeof(tgt));memset(fixed_cells,0,sizeof(fixed_cells));memset(board_label,-1,sizeof(board_label));\n    total_edges=0;uf_init();uf_ch.clear();g_ops=0;\n    bool found=find_target(0);\n    if(found){init_labels();fix_parity();solve();}\n    if(scoreBoard()<N*N-1&&(int)out.size()<T)greedySolve();\n    cout<<out<<\"\\n\";return 0;}","ahc012":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef unsigned long long ull;\ntypedef pair<ull,ull> puu;\nstruct PH{size_t operator()(const puu&p)const{size_t h=hash<ull>()(p.first);h^=hash<ull>()(p.second)+0x9e3779b9ULL+(h<<6)+(h>>2);return h;}};\nmt19937 rng(42);\nint N,K,a[11],stx[5501],sty[5501];\nstruct Line{ll px,py,qx,qy;};\nconst int MK=100;\nLine cur_lines[MK],best_lines[MK];\nint8_t sgn_data[5501][MK];\null slo[5501],shi[5501];\nunordered_map<puu,int,PH>grps;\nint b_arr[12],cscore,best_score;\nstruct Change{int idx;puu old_sig,new_sig;int8_t new_sgn;};\nvector<Change>pending;\nvector<pair<puu,int>>dvec;\nbool is_dummy[MK];\nll ecross(const Line&l,ll x,ll y){return(l.qx-l.px)*(y-l.py)-(l.qy-l.py)*(x-l.px);}\nvoid upd(int oc,int nc){if(oc>=1&&oc<=10){cscore-=min(a[oc],b_arr[oc]);b_arr[oc]--;cscore+=min(a[oc],b_arr[oc]);}if(nc>=1&&nc<=10){cscore-=min(a[nc],b_arr[nc]);b_arr[nc]++;cscore+=min(a[nc],b_arr[nc]);}}\nvoid build(){grps.clear();grps.reserve(32768);grps.max_load_factor(0.3f);memset(b_arr,0,sizeof(b_arr));cscore=0;for(int i=0;i<N;i++){slo[i]=shi[i]=0;for(int j=0;j<MK;j++){int8_t s=(ecross(cur_lines[j],stx[i],sty[i])>=0)?1:-1;sgn_data[i][j]=s;if(s==1){if(j<64)slo[i]|=(1ULL<<j);else shi[i]|=(1ULL<<(j-64));}}auto[it,ins]=grps.emplace(puu{slo[i],shi[i]},0);upd(it->second,it->second+1);it->second++;}}\nint try_ch(int j,const Line&nl){pending.clear();dvec.clear();for(int i=0;i<N;i++){int8_t ns=(ecross(nl,stx[i],sty[i])>=0)?1:-1;if(ns==sgn_data[i][j])continue;puu os{slo[i],shi[i]};ull nl2=slo[i],nh2=shi[i];if(j<64){if(ns==1)nl2|=(1ULL<<j);else nl2&=~(1ULL<<j);}else{if(ns==1)nh2|=(1ULL<<(j-64));else nh2&=~(1ULL<<(j-64));}puu nsig{nl2,nh2};pending.push_back({i,os,nsig,ns});dvec.push_back({os,-1});dvec.push_back({nsig,+1});}sort(dvec.begin(),dvec.end());int nb[12];memcpy(nb,b_arr,sizeof(nb));int nsc=cscore;for(int i=0;i<(int)dvec.size();){int j2=i,d=0;while(j2<(int)dvec.size()&&dvec[j2].first==dvec[i].first){d+=dvec[j2].second;j2++;}if(d){auto it=grps.find(dvec[i].first);int c=it!=grps.end()?it->second:0,nc=c+d;if(c>=1&&c<=10){nsc-=min(a[c],nb[c]);nb[c]--;nsc+=min(a[c],nb[c]);}if(nc>=1&&nc<=10){nsc-=min(a[nc],nb[nc]);nb[nc]++;nsc+=min(a[nc],nb[nc]);}}i=j2;}return nsc;}\nvoid do_ch(int j,const Line&nl){for(auto&ch:pending){{auto it=grps.find(ch.old_sig);upd(it->second,it->second-1);if(!--it->second)grps.erase(it);}slo[ch.idx]=ch.new_sig.first;shi[ch.idx]=ch.new_sig.second;sgn_data[ch.idx][j]=ch.new_sgn;{auto[it2,ins]=grps.emplace(ch.new_sig,0);upd(it2->second,it2->second+1);it2->second++;}}cur_lines[j]=nl;}\nLine rline(){double th=(rng()%314159)*(M_PI/314159.0);double r=(int)(rng()%18001)-9000;double cx=r*cos(th),cy=r*sin(th),sdx=-sin(th)*9000,sdy=cos(th)*9000;return{llround(cx+sdx),llround(cy+sdy),llround(cx-sdx),llround(cy-sdy)};}\nLine pline(const Line&l,int s){ll dx=(ll)(rng()%(2*s+1))-s,dy=(ll)(rng()%(2*s+1))-s;int t=rng()%3;if(t==0)return{l.px+dx,l.py+dy,l.qx,l.qy};if(t==1)return{l.px,l.py,l.qx+dx,l.qy+dy};return{l.px+dx,l.py+dy,l.qx-dx,l.qy-dy};}\nLine pline_perp(const Line&l,int s){ll ddx=l.qx-l.px,ddy=l.qy-l.py;double len=hypot((double)ddx,(double)ddy);if(len<1.0)return l;ll delta=(ll)(rng()%(2*s+1))-s;ll dx2=llround(delta*(-ddy)/len),dy2=llround(delta*ddx/len);return{l.px+dx2,l.py+dy2,l.qx+dx2,l.qy+dy2};}\nLine pline_rot(const Line&l,int mr){double mx=(l.px+l.qx)*0.5,my=(l.py+l.qy)*0.5;double hdx=(l.qx-l.px)*0.5,hdy=(l.qy-l.py)*0.5;double angle=((int)(rng()%(2*mr+1))-mr)*0.001;double ca=cos(angle),sa=sin(angle);ll ndx=llround(hdx*ca-hdy*sa),ndy=llround(hdx*sa+hdy*ca);return{llround(mx)-ndx,llround(my)-ndy,llround(mx)+ndx,llround(my)+ndy};}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>K;for(int d=1;d<=10;d++)cin>>a[d];for(int i=0;i<N;i++)cin>>stx[i]>>sty[i];\n    // 25H + 25V coarser grid + 50 dummy lines above cake\n    for(int i=0;i<25;i++){ll y=llround(-9000.0+18000.0*i/24.0);cur_lines[i]={-10000,y,10000,y};is_dummy[i]=false;}\n    for(int i=0;i<25;i++){ll x=llround(-9000.0+18000.0*i/24.0);cur_lines[25+i]={x,-10000,x,10000};is_dummy[25+i]=false;}\n    for(int i=50;i<MK;i++){cur_lines[i]={-10000,15000,10001,15000};is_dummy[i]=true;}\n    build();\n    best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));\n    pending.reserve(N+10);dvec.reserve(2*N+10);\n    auto t0=chrono::steady_clock::now();\n    double T=15.0;int iter=0;\n    while(true){\n        if(!(++iter&511)){\n            double e=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(e>2.90)break;\n            T=max(0.05,15.0*pow(0.05/15.0,e/2.90));\n        }\n        int j=rng()%MK;Line nl;\n        if(is_dummy[j]){\n            nl=rline();\n        }else{\n            int sel=rng()%100;\n            if(sel<22)nl=pline(cur_lines[j],30);\n            else if(sel<38)nl=pline_perp(cur_lines[j],50);\n            else if(sel<50)nl=pline_rot(cur_lines[j],10);\n            else if(sel<68)nl=pline(cur_lines[j],300);\n            else if(sel<82)nl=pline(cur_lines[j],2000);\n            else nl=rline();\n        }\n        if(nl.px==nl.qx&&nl.py==nl.qy)continue;\n        int ns=try_ch(j,nl);int ds=ns-cscore;bool acc=(ds>=0);\n        if(!acc&&T>0.01)acc=((double)(rng()>>8)/(double)(1u<<24))<exp((double)ds/T);\n        if(acc){\n            do_ch(j,nl);\n            if(is_dummy[j])is_dummy[j]=false;\n            if(cscore>best_score){best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));}\n        }\n    }\n    cout<<MK<<\"\\n\";\n    for(int j=0;j<MK;j++)cout<<best_lines[j].px<<\" \"<<best_lines[j].py<<\" \"<<best_lines[j].qx<<\" \"<<best_lines[j].qy<<\"\\n\";\n    return 0;\n}","ahc014":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=65;\nint N,M,cc;\nbool dots[MAXN][MAXN],h_seg[MAXN][MAXN],v_seg[MAXN][MAXN],d1_seg[MAXN][MAXN],d2_seg[MAXN][MAXN],inPQ[MAXN][MAXN];\nvector<int> row_dots[MAXN],col_dots[MAXN],diag_dots[130],ad_dots[130];\nstruct Op{int x1,y1,x2,y2,x3,y3,x4,y4;};\nvector<Op> ops,best_ops;\npriority_queue<pair<int,pair<int,int>>> work_pq;\nlong long best_score=0;\nint init_M; pair<int,int> init_list[400];\nmt19937 rng(0); int run_mode=0;\nvoid ins(vector<int>&v,int x){v.insert(lower_bound(v.begin(),v.end(),x),x);}\nvoid addDot(int x,int y){dots[x][y]=true;ins(row_dots[y],x);ins(col_dots[x],y);ins(diag_dots[x-y+64],x);ins(ad_dots[x+y],x);}\nbool ec(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)if(v_seg[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)if(h_seg[x][y1])return false;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)if(d1_seg[xm+t][ym+t])return false;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)if(d2_seg[xm+t][ymx-t])return false;}}\n    return true;}\nbool en(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2)+1;y<max(y1,y2);y++)if(dots[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2)+1;x<max(x1,x2);x++)if(dots[x][y1])return false;}\n    else{int n=abs(x2-x1),dx=(x2>x1)?1:-1,dy=(y2>y1)?1:-1;for(int t=1;t<n;t++)if(dots[x1+t*dx][y1+t*dy])return false;}\n    return true;}\nvoid de(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)v_seg[x1][y]=true;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)h_seg[x][y1]=true;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)d1_seg[xm+t][ym+t]=true;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)d2_seg[xm+t][ymx-t]=true;}}}\nbool cando(int nx,int ny,int x2,int y2,int x3,int y3,int x4,int y4){\n    if(x2<0||x2>=N||y2<0||y2>=N||x3<0||x3>=N||y3<0||y3>=N||x4<0||x4>=N||y4<0||y4>=N)return false;\n    if(!dots[x2][y2]||!dots[x3][y3]||!dots[x4][y4])return false;\n    if(!en(nx,ny,x2,y2)||!en(x2,y2,x3,y3)||!en(x3,y3,x4,y4)||!en(x4,y4,nx,ny))return false;\n    if(!ec(nx,ny,x2,y2)||!ec(x2,y2,x3,y3)||!ec(x3,y3,x4,y4)||!ec(x4,y4,nx,ny))return false;\n    ops.push_back({nx,ny,x2,y2,x3,y3,x4,y4});addDot(nx,ny);de(nx,ny,x2,y2);de(x2,y2,x3,y3);de(x3,y3,x4,y4);de(x4,y4,nx,ny);return true;}\nbool fap(int nx,int ny){\n    if(dots[nx][ny])return false;\n    vector<tuple<int,int,int,int,int,int,int>> cands;\n    for(int x2:row_dots[ny]){if(x2==nx)continue;for(int y2:col_dots[nx]){if(y2==ny||!dots[x2][y2])continue;cands.emplace_back((abs(x2-nx)+abs(y2-ny))*2,x2,ny,x2,y2,nx,y2);}}\n    for(int xa:diag_dots[nx-ny+64]){if(xa==nx)continue;int a=xa-nx;for(int xb:ad_dots[nx+ny]){if(xb==nx)continue;int b=xb-nx;int x3=nx+a+b,y3=ny+a-b;if(x3>=0&&x3<N&&y3>=0&&y3<N&&dots[x3][y3])cands.emplace_back((abs(a)+abs(b))*2+1,xa,ny+a,x3,y3,xb,ny-b);}}\n    // Mode 0: smallest first | Mode 1: largest first | Modes 2-4: small noise+sort | Modes 5-7: full shuffle\n    if(run_mode==0){\n        sort(cands.begin(),cands.end());\n    }else if(run_mode==1){\n        sort(cands.rbegin(),cands.rend());\n    }else if(run_mode<=4){\n        for(auto&c:cands)get<0>(c)+=rng()%8;\n        sort(cands.begin(),cands.end());\n    }else{\n        shuffle(cands.begin(),cands.end(),rng);\n    }\n    for(auto&[p,x2,y2,x3,y3,x4,y4]:cands)if(cando(nx,ny,x2,y2,x3,y3,x4,y4))return true;\n    return false;}\nvoid addWork(int x,int y){if(x<0||x>=N||y<0||y>=N||dots[x][y]||inPQ[x][y])return;inPQ[x][y]=true;work_pq.push({(x-cc)*(x-cc)+(y-cc)*(y-cc)+1,{x,y}});}\nvoid afterPlace(int x,int y){\n    for(int i=0;i<N;i++){addWork(i,y);addWork(x,i);}\n    for(int t=1;t<N;t++){addWork(x+t,y+t);addWork(x-t,y-t);addWork(x+t,y-t);addWork(x-t,y+t);}\n    for(int ny2:col_dots[x])for(int nx2:row_dots[y])addWork(nx2,ny2);\n    for(int xb:ad_dots[x+y])for(int xa:diag_dots[x-y+64])addWork(xa+xb-x,y+xa-xb);}\nvoid resetRun(){\n    memset(dots,0,sizeof(dots));memset(h_seg,0,sizeof(h_seg));memset(v_seg,0,sizeof(v_seg));\n    memset(d1_seg,0,sizeof(d1_seg));memset(d2_seg,0,sizeof(d2_seg));memset(inPQ,0,sizeof(inPQ));\n    for(int i=0;i<MAXN;i++){row_dots[i].clear();col_dots[i].clear();}\n    for(int i=0;i<130;i++){diag_dots[i].clear();ad_dots[i].clear();}\n    ops.clear();work_pq=priority_queue<pair<int,pair<int,int>>>();\n    for(int i=0;i<init_M;i++)addDot(init_list[i].first,init_list[i].second);\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)addWork(x,y);}\nvoid drainQ(long long lim,chrono::steady_clock::time_point t0){\n    while(!work_pq.empty()){\n        if(chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count()>=lim)return;\n        auto[w,pos]=work_pq.top();work_pq.pop();auto[x,y]=pos;inPQ[x][y]=false;\n        if(dots[x][y])continue;if(fap(x,y))afterPlace(x,y);}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>M;cc=(N-1)/2;init_M=M;\n    for(int i=0;i<M;i++){cin>>init_list[i].first>>init_list[i].second;}\n    vector<pair<int,pair<int,int>>> pts;\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)pts.emplace_back((x-cc)*(x-cc)+(y-cc)*(y-cc)+1,make_pair(x,y));\n    sort(pts.rbegin(),pts.rend());\n    auto t0=chrono::steady_clock::now();\n    auto el=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    for(int run=0;el()<4380;run++){\n        run_mode=run;\n        if(run>=2)rng.seed((long long)run*31337+12345);\n        resetRun();\n        long long re=min(4380LL,el()+550LL);\n        drainQ(re,t0);\n        bool changed=true;\n        while(changed&&el()<re){\n            changed=false;\n            for(auto&[w,pos]:pts){\n                if(el()>=re)break;\n                auto[x,y]=pos;if(dots[x][y])continue;\n                if(fap(x,y)){changed=true;afterPlace(x,y);drainQ(re,t0);}\n            }\n        }\n        long long sc=0;\n        for(int x=0;x<N;x++)for(int y=0;y<N;y++)if(dots[x][y])sc+=(long long)(x-cc)*(x-cc)+(y-cc)*(y-cc)+1;\n        if(sc>best_score){best_score=sc;best_ops=ops;}\n    }\n    cout<<best_ops.size()<<\"\\n\";\n    for(auto&op:best_ops)cout<<op.x1<<' '<<op.y1<<' '<<op.x2<<' '<<op.y2<<' '<<op.x3<<' '<<op.y3<<' '<<op.x4<<' '<<op.y4<<'\\n';\n    return 0;\n}","ahc015":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef array<array<int,10>,10> Grid;\n\nGrid applyTilt(Grid g, char dir) {\n    if(dir=='L'){for(int i=0;i<10;i++){int p=0;for(int j=0;j<10;j++)if(g[i][j])g[i][p++]=g[i][j];for(;p<10;p++)g[i][p]=0;}}\n    else if(dir=='R'){for(int i=0;i<10;i++){int p=9;for(int j=9;j>=0;j--)if(g[i][j])g[i][p--]=g[i][j];for(;p>=0;p--)g[i][p]=0;}}\n    else if(dir=='F'){for(int j=0;j<10;j++){int p=0;for(int i=0;i<10;i++)if(g[i][j])g[p++][j]=g[i][j];for(;p<10;p++)g[p][j]=0;}}\n    else{for(int j=0;j<10;j++){int p=9;for(int i=9;i>=0;i--)if(g[i][j])g[p--][j]=g[i][j];for(;p>=0;p--)g[p][j]=0;}}\n    return g;\n}\n// Merged: connectivity (\u03a3ni\u00b2) + row/col purity in one pass\nlong long evalLeaf(const Grid& g){\n    int rc[10][4]={},cc[10][4]={};\n    bool vis[10][10]={};long long sum=0;int stk[100][2];\n    const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\n    for(int si=0;si<10;si++)for(int sj=0;sj<10;sj++){\n        if(!g[si][sj])continue;\n        rc[si][g[si][sj]]++;cc[sj][g[si][sj]]++;\n        if(vis[si][sj])continue;\n        int f=g[si][sj],sz=0,top=0;\n        stk[top][0]=si;stk[top][1]=sj;top++;vis[si][sj]=true;\n        while(top>0){--top;int x=stk[top][0],y=stk[top][1];sz++;\n            for(int d=0;d<4;d++){int nx=x+dx[d],ny=y+dy[d];\n                if(nx>=0&&nx<10&&ny>=0&&ny<10&&!vis[nx][ny]&&g[nx][ny]==f){vis[nx][ny]=true;stk[top][0]=nx;stk[top][1]=ny;top++;}}}\n        sum+=(long long)sz*sz;}\n    for(int i=0;i<10;i++)for(int f=1;f<=3;f++)\n        sum+=(long long)(rc[i][f]*rc[i][f]+cc[i][f]*cc[i][f]);\n    return sum;\n}\nGrid placeCandy(Grid g,int p,int flav){\n    int cnt=0;for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(!g[i][j]&&++cnt==p){g[i][j]=flav;return g;}return g;\n}\nconst char DIRS[]={'F','B','L','R'};\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int fl[100];for(int t=0;t<100;t++)cin>>fl[t];\n    Grid grid={};mt19937 rng(20230101);\n    const int S=8;\n    for(int t=0;t<100;t++){\n        int p;cin>>p;grid=placeCandy(grid,p,fl[t]);\n        char bestDir='F';\n        if(t<99){\n            int nc1=99-t,nc2=98-t;\n            int s3[S],s_cnt=0;\n            if(t+2<100){s_cnt=min(S,nc2);\n                if(nc2<=S){for(int s=0;s<nc2;s++)s3[s]=s+1;}\n                else{for(int s=0;s<S;s++)s3[s]=rng()%nc2+1;}}\n            long long best=-1;\n            for(char d1:DIRS){\n                Grid g1=applyTilt(grid,d1);long long total=0;\n                for(int p2=1;p2<=nc1;p2++){\n                    Grid g2=placeCandy(g1,p2,fl[t+1]);long long mx=0;\n                    for(char d2:DIRS){\n                        Grid g2t=applyTilt(g2,d2);long long val;\n                        if(s_cnt==0){val=evalLeaf(g2t);}\n                        else{long long sum3=0;\n                            for(int s=0;s<s_cnt;s++){\n                                Grid g3=placeCandy(g2t,s3[s],fl[t+2]);long long best3=0;\n                                for(char d3:DIRS){Grid g3t=applyTilt(g3,d3);best3=max(best3,evalLeaf(g3t));}\n                                sum3+=best3;}\n                            val=sum3;}\n                        mx=max(mx,val);}\n                    total+=mx;}\n                if(total>best){best=total;bestDir=d1;}}\n        }\n        cout<<bestDir<<'\\n';cout.flush();\n        grid=applyTilt(grid,bestDir);\n    }\n    return 0;\n}","ahc016":"#include <bits/stdc++.h>\n#include <Eigen/Dense>\nusing namespace std;\nusing namespace Eigen;\nint M, N; double eps;\ndouble normalCDF(double x){return 0.5*erfc(-x*M_SQRT1_2);}\nvector<double> getDeg(const string& s,int n){vector<int> d(n,0);int idx=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1'){d[i]++;d[j]++;}sort(d.begin(),d.end());return{d.begin(),d.end()};}\nvector<double> getEig(const string& s,int n){MatrixXd A(n,n);A.setZero();int idx=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1')A(i,j)=A(j,i)=1.0;SelfAdjointEigenSolver<MatrixXd> sol(A,EigenvaluesOnly);vector<double> ev(n);for(int i=0;i<n;i++)ev[i]=sol.eigenvalues()(i);return ev;}\nstring makeG(int n,int m){int me=n*(n-1)/2;m=max(0,min(m,me));string s(me,'0');auto pos=[&](int a,int b)->int{if(a>b)swap(a,b);return a*(2*n-a-1)/2+(b-a-1);};int cnt=0;for(int d=1;d<n&&cnt<m;d++)for(int i=0;i<n&&cnt<m;i++){int j=(i+d)%n;if(i<j){s[pos(i,j)]='1';cnt++;}}return s;}\nint computeOptimalN(int M,double eps){\n    int Nmin=4;while((long long)Nmin*(Nmin-1)/2<M&&Nmin<100)Nmin++;\n    if(eps<1e-9||M<=1)return Nmin;\n    double bestScore=0;int optN=Nmin;\n    for(int n=Nmin;n<=100;n++){\n        int me=n*(n-1)/2;\n        vector<vector<double>> centers(M);\n        for(int k=0;k<M;k++){int m=(int)round((double)k*me/max(1,M-1));string g=makeG(n,m);centers[k]=getDeg(g,n);}\n        double minL2=1e18;\n        for(int k=1;k<M;k++){double l2=0;for(int i=0;i<n;i++){double diff=(centers[k][i]-centers[k-1][i])*(1.0-2.0*eps);l2+=diff*diff;}minL2=min(minL2,sqrt(l2));}\n        double l2noise=sqrt((double)n*(n-1)*eps*(1-eps));if(l2noise<1e-12)l2noise=1e-12;\n        // FIXED: multiply by sqrt(n) - for L2 classifier in n dimensions, SNR scales as sqrt(n)\n        double snr_eff=(minL2/l2noise)*sqrt((double)n);\n        double p_err=min((double)(M-1)/M,2.0*(1.0-normalCDF(snr_eff/2.0)));\n        double score=(1e9/n)*pow(0.9,100.0*p_err);\n        if(score>bestScore){bestScore=score;optN=n;}\n    }\n    return optN;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>M>>eps;N=computeOptimalN(M,eps);\n    int ME=N*(N-1)/2;vector<string> G(M);\n    for(int k=0;k<M;k++){int m=(int)round((double)k*ME/max(1,M-1));G[k]=makeG(N,m);}\n    cout<<N<<\"\\n\";for(auto&g:G)cout<<g<<\"\\n\";cout<<flush;\n    long long budget=2000000000LL;\n    long long opPS_eig=(long long)N*N+(long long)N*N*N;\n    int NS_eig=max(1,(int)(budget/max(1LL,(long long)M*opPS_eig)));\n    bool useEig=(NS_eig>=20);\n    int NS,FD;\n    if(useEig){NS=min(500,NS_eig);FD=2*N;}\n    else{long long opPS_deg=(long long)N*N;NS=max(30,min(1000,(int)(budget/max(1LL,(long long)M*opPS_deg))));FD=N;}\n    vector<vector<double>> C(M,vector<double>(FD,0.0));\n    if(eps<1e-9){\n        for(int k=0;k<M;k++){auto ds=getDeg(G[k],N);for(int i=0;i<N;i++)C[k][i]=ds[i];if(useEig){auto es=getEig(G[k],N);for(int i=0;i<N;i++)C[k][N+i]=es[i];}}\n    }else{\n        mt19937 rng(42);uniform_real_distribution<double> u(0.0,1.0);\n        for(int k=0;k<M;k++){\n            for(int s=0;s<NS;s++){string t=G[k];for(char&c:t)if(u(rng)<eps)c^=1;auto ds=getDeg(t,N);for(int i=0;i<N;i++)C[k][i]+=ds[i];if(useEig){auto es=getEig(t,N);for(int i=0;i<N;i++)C[k][N+i]+=es[i];}}\n            for(int i=0;i<FD;i++)C[k][i]/=NS;\n        }\n    }\n    for(int q=0;q<100;q++){\n        string h;cin>>h;\n        vector<double> hf(FD);auto dh=getDeg(h,N);for(int i=0;i<N;i++)hf[i]=dh[i];\n        if(useEig){auto eh=getEig(h,N);for(int i=0;i<N;i++)hf[N+i]=eh[i];}\n        int best=0;double bestD=1e18;\n        for(int k=0;k<M;k++){double d=0;for(int i=0;i<FD;i++){double dd=hf[i]-C[k][i];d+=dd*dd;}if(d<bestD){bestD=d;best=k;}}\n        cout<<best<<\"\\n\"<<flush;\n    }\n    return 0;\n}","ahc017":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;typedef pair<ll,int> pli;\nconst ll INF=1e18;const int MXN=1005,MXM=3005,MXD=35,MAXCP=10;\nint N,M,D,K,EU[MXM],EV[MXM];ll EW[MXM];\nvector<pair<int,int>> G[MXN];ll gd[MXN][MXN];\ndouble imp[MXM];int aday[MXM];double ADJ[MXM][MXD];int cutD[MXM][MXD];\nvector<int> ladj[MXM],cpairs[MXM],dayE[MXD];int dpos[MXM];ll dtmp2[MXN];\nuint64_t rs=0xdeadbeef123ULL;\nuint64_t rng(){rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;}\nint ri(int n){return(int)(rng()%(unsigned)n);}double rd(){return(rng()>>11)*(1.0/(1ull<<53));}\nvoid dijk(int s){fill(gd[s]+1,gd[s]+N+1,INF);gd[s][s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[d,u]=pq.top();pq.pop();if(d>gd[s][u])continue;for(auto&[v,e]:G[u]){ll nd=d+EW[e];if(nd<gd[s][v]){gd[s][v]=nd;pq.push({nd,v});}}}}\nll dijkS(int s,int t,int sk){static ll d[MXN];fill(d+1,d+N+1,INF);d[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;if(u==t)return d[t];for(auto&[v,e]:G[u]){if(e==sk)continue;ll nd=dd+EW[e];if(nd<d[v]){d[v]=nd;pq.push({nd,v});}}}return d[t];}\ndouble diagFk(int d,const vector<int>&srcs){double tot=0.0;for(int s:srcs){fill(dtmp2+1,dtmp2+N+1,INF);dtmp2[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>dtmp2[u])continue;for(auto&[v,ei]:G[u]){if(aday[ei]==d)continue;ll nd=dd+EW[ei];if(nd<dtmp2[v]){dtmp2[v]=nd;pq.push({nd,v});}}}for(int t=1;t<=N;t++)if(t!=s&&dtmp2[t]>gd[s][t])tot+=(double)(dtmp2[t]-gd[s][t]);}return tot/((double)srcs.size()*(N-1));}\nstruct BrFr{int u,pe,ix;};struct BrI{int e,sz;};int bdt[MXN],blv[MXN];vector<BrFr> bstk;\nvoid findBr(int sk,vector<BrI>&br){fill(bdt+1,bdt+N+1,-1);int tm=0;bstk.clear();if((int)bstk.capacity()<N+2)bstk.reserve(N+2);bdt[1]=blv[1]=tm++;bstk.push_back({1,-1,0});while(!bstk.empty()){BrFr&c=bstk.back();if(c.ix<(int)G[c.u].size()){auto[v,e]=G[c.u][c.ix++];if(e==sk||e==c.pe){}else if(bdt[v]<0){bdt[v]=blv[v]=tm++;bstk.push_back({v,e,0});}else blv[c.u]=min(blv[c.u],bdt[v]);}else{int u=c.u,pe=c.pe,sz=tm-bdt[u];bstk.pop_back();if(!bstk.empty()){BrFr&p=bstk.back();blv[p.u]=min(blv[p.u],blv[u]);if(blv[u]>bdt[p.u])br.push_back({pe,sz});}}}}\nbool cvis[MXN];int cq[MXN];\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);\n    auto tst=chrono::steady_clock::now();\n    cin>>N>>M>>D>>K;\n    for(int i=0;i<M;i++){cin>>EU[i]>>EV[i]>>EW[i];G[EU[i]].push_back({EV[i],i});G[EV[i]].push_back({EU[i],i});}\n    for(int i=1;i<=N;i++){int x,y;cin>>x>>y;}\n    for(int s=1;s<=N;s++)dijk(s);\n    {vector<int>par(N+1,-1),sv(N);vector<ll>sz(N+1,1);iota(sv.begin(),sv.end(),1);for(int s=1;s<=N;s++){fill(par.begin(),par.end(),-1);fill(sz.begin(),sz.end(),1LL);sort(sv.begin(),sv.end(),[s](int a,int b){return gd[s][a]<gd[s][b];});for(int v:sv){if(v==s)continue;for(auto&[u,e]:G[v])if(gd[s][u]+EW[e]==gd[s][v]){par[v]=e;break;}}for(int i=(int)sv.size()-1;i>=0;i--){int v=sv[i];if(par[v]<0)continue;int p=(EU[par[v]]==v)?EV[par[v]]:EU[par[v]];sz[p]+=sz[v];}for(int v:sv){if(par[v]<0)continue;imp[par[v]]+=(double)sz[v];}}}\n    for(int e=0;e<M;e++){ll dt=dijkS(EU[e],EV[e],e);imp[e]*=(dt<INF)?(double)(dt-EW[e]):0.0;}\n    {vector<BrI>br;for(int e=0;e<M;e++){for(int ep:{EU[e],EV[e]}){if((int)G[ep].size()==2){for(auto&[w,oe]:G[ep])if(oe!=e)cpairs[e].push_back(oe);}}sort(cpairs[e].begin(),cpairs[e].end());cpairs[e].erase(unique(cpairs[e].begin(),cpairs[e].end()),cpairs[e].end());br.clear();findBr(e,br);sort(br.begin(),br.end(),[](const BrI&a,const BrI&b){return min(a.sz,N-a.sz)>min(b.sz,N-b.sz);});for(auto&bi:br){if((int)cpairs[e].size()>=MAXCP)break;auto it=lower_bound(cpairs[e].begin(),cpairs[e].end(),bi.e);if(it==cpairs[e].end()||*it!=bi.e)cpairs[e].insert(it,bi.e);}}}\n    for(int u=1;u<=N;u++){int dg=G[u].size();for(int i=0;i<dg;i++)for(int j=i+1;j<dg;j++){int e1=G[u][i].second,e2=G[u][j].second;ladj[e1].push_back(e2);ladj[e2].push_back(e1);}}\n    for(int e=0;e<M;e++){sort(ladj[e].begin(),ladj[e].end());ladj[e].erase(unique(ladj[e].begin(),ladj[e].end()),ladj[e].end());}\n    auto isAdj=[](int a,int b){return binary_search(ladj[a].begin(),ladj[a].end(),b);};\n    auto isCut=[](int a,int b){return binary_search(cpairs[a].begin(),cpairs[a].end(),b);};\n    fill(aday,aday+M,-1);int dc[MXD]={};\n    {vector<int>eo(M);iota(eo.begin(),eo.end(),0);sort(eo.begin(),eo.end(),[](int a,int b){return imp[a]>imp[b];});\n    for(int e:eo){int best=-1;double bs=1e18;int bc=INT_MAX;\n    for(int d=0;d<D;d++){if(dc[d]>=K)continue;int cuts=0;for(int f:cpairs[e])if(aday[f]==d)cuts++;double cf=0;for(int e2:ladj[e])if(aday[e2]==d)cf+=imp[e2];double sc=cf+1e-12*dc[d];if(cuts<bc||(cuts==bc&&sc<bs)){bc=cuts;bs=sc;best=d;}}\n    if(best<0)best=0;aday[e]=best;dc[best]++;}}\n    memset(cutD,0,sizeof(cutD));memset(ADJ,0,sizeof(ADJ));\n    for(int e=0;e<M;e++){for(int f:cpairs[e])cutD[e][aday[f]]++;for(int e2:ladj[e])ADJ[e][aday[e2]]+=imp[e2];}\n    for(int e=0;e<M;e++){dpos[e]=dayE[aday[e]].size();dayE[aday[e]].push_back(e);}\n    double T=1.0;\n    {double sm=0;int c=0;for(int tr=0;tr<100000&&c<3000;tr++){\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];\n        if(dlc>0)continue;\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];\n        sm+=fabs(dl);c++;}\n    if(c>0)T=sm/c;if(T<1e-9)T=1.0;}\n    double T0=T;\n    // Phase 1: Proxy SA (1.5s)\n    for(long long step=0;;step++){\n        if(step%200000==0){double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>1.5)break;T=T0*exp(-10.*el/1.5);}\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];if(dlc>0)continue;\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];\n        if(dl<=0||(T>1e-9&&rd()<exp(-dl/T))){\n            for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n            for(int f:cpairs[e1]){cutD[f][d1]--;cutD[f][d2]++;}for(int f:cpairs[e2]){cutD[f][d2]--;cutD[f][d1]++;}\n            {int p=dpos[e1],L=dayE[d1].back();dayE[d1][p]=L;dpos[L]=p;dayE[d1].pop_back();}\n            {int p=dpos[e2],L=dayE[d2].back();dayE[d2][p]=L;dpos[L]=p;dayE[d2].pop_back();}\n            dpos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;dpos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n        }\n    }\n    // Phase 2: Actual frustration SA (1.5s to 5.2s = 3.7s)\n    {\n        const int S_ACT=10;\n        vector<int> srcs;vector<double> sfk(D);\n        auto doSample=[&](){\n            srcs.clear();set<int>used;\n            while((int)srcs.size()<S_ACT){int s=ri(N)+1;if(!used.count(s)){used.insert(s);srcs.push_back(s);}}\n            for(int d=0;d<D;d++)sfk[d]=diagFk(d,srcs);\n        };\n        doSample();\n        int eval_cnt=0;\n        while(true){\n            double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>5.2)break;\n            int d1=ri(D);for(int k=0;k<3;k++){int d=ri(D);if(sfk[d]>sfk[d1])d1=d;}\n            if(dayE[d1].empty())continue;\n            int d2=-1;for(int k=0;k<4;k++){int d=ri(D);if(d!=d1&&!dayE[d].empty()&&(d2<0||sfk[d]<sfk[d2]))d2=d;}\n            if(d2<0)continue;\n            int e1=dayE[d1][ri(dayE[d1].size())];int e2=dayE[d2][ri(dayE[d2].size())];\n            int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];if(dlc>0)continue;\n            double old_f1=sfk[d1],old_f2=sfk[d2];\n            aday[e1]=d2;aday[e2]=d1;\n            double new_f1=diagFk(d1,srcs);double new_f2=diagFk(d2,srcs);\n            aday[e1]=d1;aday[e2]=d2;\n            double delta_act=(new_f1+new_f2)-(old_f1+old_f2);\n            if(++eval_cnt%200==0)doSample();\n            if(delta_act<0){\n                for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n                for(int f:cpairs[e1]){cutD[f][d1]--;cutD[f][d2]++;}for(int f:cpairs[e2]){cutD[f][d2]--;cutD[f][d1]++;}\n                {int p=dpos[e1],L=dayE[d1].back();dayE[d1][p]=L;dpos[L]=p;dayE[d1].pop_back();}\n                {int p=dpos[e2],L=dayE[d2].back();dayE[d2][p]=L;dpos[L]=p;dayE[d2].pop_back();}\n                dpos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;dpos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n                sfk[d1]=new_f1;sfk[d2]=new_f2;\n            }\n        }\n    }\n    // Phase 3: Post-processing\n    for(int d=0;d<D;d++){int mr=(int)dayE[d].size()+5;while(mr-->0){\n        fill(cvis+1,cvis+N+1,false);int h=0,t=0;cvis[1]=true;cq[t++]=1;\n        while(h<t){int u=cq[h++];for(auto&[v,e]:G[u])if(aday[e]!=d&&!cvis[v]){cvis[v]=true;cq[t++]=v;}}\n        bool disc=false;for(int v=1;v<=N;v++)if(!cvis[v]){disc=true;break;}if(!disc)break;\n        bool fx=false;\n        for(int i=0;i<(int)dayE[d].size()&&!fx;i++){int e=dayE[d][i];if(cvis[EU[e]]==cvis[EV[e]])continue;\n            int bdd=-1;double bc=1e18;for(int dd=0;dd<D;dd++){if(dd==d||(int)dayE[dd].size()>=K)continue;double cost=0;for(int ef:ladj[e])if(aday[ef]==dd)cost+=imp[e]*imp[ef];if(bdd<0||cost<bc){bc=cost;bdd=dd;}}\n            if(bdd>=0){for(int ef:ladj[e]){ADJ[ef][d]-=imp[e];ADJ[ef][bdd]+=imp[e];}for(int f:cpairs[e]){cutD[f][d]--;cutD[f][bdd]++;}\n                {int p=dpos[e],L=dayE[d].back();dayE[d][p]=L;dpos[L]=p;dayE[d].pop_back();}dpos[e]=dayE[bdd].size();dayE[bdd].push_back(e);aday[e]=bdd;fx=true;}}\n        if(!fx)break;}}\n    for(int i=0;i<M;i++){if(i)cout<<' ';cout<<aday[i]+1;}cout<<'\\n';\n}","ahc019":"#include <bits/stdc++.h>\nusing namespace std;\nint D;string Fs[2][14],Rs[2][14];int bid,B[2][2744];bool occ[2][2744];\nstruct Box{int x,y,z,a,b,c;};\nbool bf(int r,int x0,int y0,int z0,int a,int b,int c){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++)if(occ[r][(x0+i)*D*D+(y0+j)*D+z0+k])return false;return true;}\nvoid fB(int r,int x0,int y0,int z0,int a,int b,int c,int id){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++){int q=(x0+i)*D*D+(y0+j)*D+z0+k;B[r][q]=id;occ[r][q]=true;}}\nvoid fL(int r,int x,int y,int z,int l,int ax,int id){for(int k=0;k<l;k++){int q=(x+(ax==0?k:0))*D*D+(y+(ax==1?k:0))*D+z+(ax==2?k:0);B[r][q]=id;occ[r][q]=true;}}\ndouble simTP(vector<int>t0,vector<int>t1){double sc=0;int r0=0,r1=0,i0=0,i1=0;while(true){if(!r0&&i0<(int)t0.size())r0=t0[i0++];if(!r1&&i1<(int)t1.size())r1=t1[i1++];if(!r0||!r1)break;int ml=min(r0,r1);sc+=1.0/ml;r0-=ml;r1-=ml;}sc+=r0;while(i0<(int)t0.size())sc+=t0[i0++];sc+=r1;while(i1<(int)t1.size())sc+=t1[i1++];return sc;}\ntemplate<typename T>\nvoid runBestTP(vector<pair<int,int>>brv0,vector<pair<int,int>>brv1,const vector<T>&F0,const vector<T>&F1,auto fillFn){\n    vector<int>l0,l1;for(auto[l,i]:brv0)l0.push_back(l);for(auto[l,i]:brv1)l1.push_back(l);\n    double bsc=1e18;vector<pair<int,int>>rv0=brv0,rv1=brv1;mt19937 rng(42);\n    auto tryOrd=[&](vector<pair<int,int>>r0,vector<pair<int,int>>r1){vector<int>t0,t1;for(auto[l,i]:r0)t0.push_back(l);for(auto[l,i]:r1)t1.push_back(l);double sc=simTP(t0,t1);if(sc<bsc){bsc=sc;rv0=r0;rv1=r1;}};\n    for(int o0=0;o0<2;o0++)for(int o1=0;o1<2;o1++){auto r0=brv0,r1=brv1;sort(r0.begin(),r0.end(),[=](auto&a,auto&b){return o0?a.first<b.first:a.first>b.first;});sort(r1.begin(),r1.end(),[=](auto&a,auto&b){return o1?a.first<b.first:a.first>b.first;});tryOrd(r0,r1);}\n    for(int rep=0;rep<10;rep++){auto r0=brv0,r1=brv1;shuffle(r0.begin(),r0.end(),rng);shuffle(r1.begin(),r1.end(),rng);tryOrd(r0,r1);}\n    struct SO{int idx,off;};deque<SO>r0d,r1d;for(auto[l,i]:rv0)r0d.push_back({i,0});for(auto[l,i]:rv1)r1d.push_back({i,0});\n    while(!r0d.empty()&&!r1d.empty()){auto&[i0,o0]=r0d.front();auto&[i1,o1]=r1d.front();int ml=min(F0[i0].len-o0,F1[i1].len-o1);bid++;fillFn(0,F0[i0],bid,o0,ml);fillFn(1,F1[i1],bid,o1,ml);o0+=ml;o1+=ml;if(o0==F0[i0].len)r0d.pop_front();if(o1==F1[i1].len)r1d.pop_front();}\n    while(!r0d.empty()){auto[i0,o0]=r0d.front();r0d.pop_front();bid++;fillFn(0,F0[i0],bid,o0,F0[i0].len-o0);}\n    while(!r1d.empty()){auto[i1,o1]=r1d.front();r1d.pop_front();bid++;fillFn(1,F1[i1],bid,o1,F1[i1].len-o1);}\n}\nvector<Box>eB(int arr){vector<Box>v;uint16_t fz[14]={},rz[14]={};for(int z=0;z<D;z++)for(int x=0;x<D;x++)if(Fs[arr][z][x]=='1')fz[x]|=1u<<z;for(int z=0;z<D;z++)for(int y=0;y<D;y++)if(Rs[arr][z][y]=='1')rz[y]|=1u<<z;uint16_t am=(uint16_t)((1u<<D)-1);for(int x0=0;x0<D;x0++){uint16_t xm=am;for(int a=1;x0+a<=D;a++){xm&=fz[x0+a-1];if(!xm)break;for(int y0=0;y0<D;y0++){uint16_t ym=am;for(int b=1;y0+b<=D;b++){ym&=rz[y0+b-1];if(!ym)break;uint16_t zm=xm&ym;if(!zm)continue;for(int z=0;z<D;z++){if(!(zm&(1u<<z)))continue;int cm=0;while(z+cm<D&&(zm&(1u<<(z+cm))))cm++;for(int c=1;c<=cm;c++)v.push_back({x0,y0,z,a,b,c});}}}}};return v;}\nstruct Ln{int x,y,z,len,ax;};\nvector<Ln>gRL(int arr,int ax){vector<Ln>L;if(ax==0){for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,s=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=x;else if(!v&&s>=0){L.push_back({s,y,z,x-s,0});s=-1;}}}}else if(ax==1){for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,s=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=y;else if(!v&&s>=0){L.push_back({x,s,z,y-s,1});s=-1;}}}}else{for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,s=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=z;else if(!v&&s>=0){L.push_back({x,y,s,z-s,2});s=-1;}}}}return L;}\ndouble mS(const vector<Ln>&L0,const vector<Ln>&L1){map<int,int>c0,c1;for(auto&l:L0)c0[l.len]++;for(auto&l:L1)c1[l.len]++;double sc=0;int v0=0,v1=0;for(auto&[l,c]:c0){int cl=c1.count(l)?c1[l]:0;sc+=min(c,cl)*1.0/l;v0+=(c-min(c,cl))*l;}for(auto&[l,c]:c1){int cl=c0.count(l)?c0[l]:0;if(c>cl)v1+=(c-cl)*l;}return sc+max(v0,v1);}\nvoid doBox(){auto bx0=eB(0),bx1=eB(1);typedef array<int,3>Key;auto gk=[](const Box&b)->Key{Key k={b.a,b.b,b.c};sort(k.begin(),k.end());return k;};map<Key,vector<int>>g0,g1;for(int i=0;i<(int)bx0.size();i++)g0[gk(bx0[i])].push_back(i);for(int i=0;i<(int)bx1.size();i++)g1[gk(bx1[i])].push_back(i);vector<pair<int,Key>>grps;for(auto&[k,v]:g0)if(g1.count(k))grps.push_back({k[0]*k[1]*k[2],k});sort(grps.rbegin(),grps.rend());for(auto&[vol,key]:grps){auto&v0=g0[key];auto&v1=g1[key];int p1=0;for(int i0:v0){auto&B0=bx0[i0];if(!bf(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c))continue;while(p1<(int)v1.size()&&!bf(1,bx1[v1[p1]].x,bx1[v1[p1]].y,bx1[v1[p1]].z,bx1[v1[p1]].a,bx1[v1[p1]].b,bx1[v1[p1]].c))p1++;if(p1>=(int)v1.size())break;auto&B1=bx1[v1[p1++]];bid++;fB(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c,bid);fB(1,B1.x,B1.y,B1.z,B1.a,B1.b,B1.c,bid);}}\n    int bax0=1,bax1=1;double bsc=1e18;for(int a0=0;a0<3;a0++){auto Lt0=gRL(0,a0);for(int a1=0;a1<3;a1++){auto Lt1=gRL(1,a1);double sc=mS(Lt0,Lt1);if(sc<bsc){bsc=sc;bax0=a0;bax1=a1;}}}\n    auto L0=gRL(0,bax0),L1=gRL(1,bax1);map<int,vector<int>>gl0,gl1;for(int i=0;i<(int)L0.size();i++)gl0[L0[i].len].push_back(i);for(int i=0;i<(int)L1.size();i++)gl1[L1[i].len].push_back(i);vector<bool>lu0(L0.size(),false),lu1(L1.size(),false);for(auto&[l,v0]:gl0){auto it=gl1.find(l);if(it==gl1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;auto gp=[&](const Ln&s,int off)->tuple<int,int,int>{return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};};auto[x0,y0,z0]=gp(L0[v0[j]],0);fL(0,x0,y0,z0,l,L0[v0[j]].ax,bid);auto[x1,y1,z1]=gp(L1[v1[j]],0);fL(1,x1,y1,z1,l,L1[v1[j]].ax,bid);lu0[v0[j]]=lu1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)L0.size();i++)if(!lu0[i])rv0.push_back({L0[i].len,i});for(int i=0;i<(int)L1.size();i++)if(!lu1[i])rv1.push_back({L1[i].len,i});\n    auto gp=[&](const Ln&s,int off)->tuple<int,int,int>{return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};};auto fillLn=[&](int arr,const Ln&s,int id,int off,int len){auto[x,y,z]=gp(s,off);fL(arr,x,y,z,len,s.ax,id);};\n    runBestTP(rv0,rv1,L0,L1,fillLn);}\nstruct Seg{int x,y,z,len,ax;};\nvector<Seg>buildSegs(int arr,int ax){vector<Seg>c;if(ax==2)for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,zs=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1';if(v&&zs<0)zs=z;else if(!v&&zs>=0){c.push_back({x,y,zs,z-zs,2});zs=-1;}}}else if(ax==1)for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,ys=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1';if(v&&ys<0)ys=y;else if(!v&&ys>=0){c.push_back({x,ys,z,y-ys,1});ys=-1;}}}else for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,xs=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1';if(v&&xs<0)xs=x;else if(!v&&xs>=0){c.push_back({xs,y,z,x-xs,0});xs=-1;}}}return c;}\nvector<Seg>greedyFill(vector<Seg>c){bool cx[14][14]={},cy[14][14]={};vector<Seg>sel;for(auto&s:c){bool u=false;for(int k=0;k<s.len&&!u;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);if(!cx[z][x]||!cy[z][y])u=true;}if(!u)continue;sel.push_back(s);for(int k=0;k<s.len;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);cx[z][x]=cy[z][y]=true;}}return sel;}\nvector<Seg>mF(int arr,int ax){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[](const Seg&a,const Seg&b){return a.len>b.len;});return greedyFill(c);}\nvector<Seg>mFbiased(int arr,int ax,const multiset<int>&prefer){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[&](const Seg&a,const Seg&b){int pa=prefer.count(a.len),pb=prefer.count(b.len);if(pa!=pb)return pa>pb;return a.len>b.len;});return greedyFill(c);}\nvector<Seg>mFspatial(int arr,int ax,int mode){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[mode](const Seg&a,const Seg&b){if(a.len!=b.len)return a.len>b.len;if(mode==0){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}else{if(a.y!=b.y)return a.y<b.y;return a.x<b.x;}});return greedyFill(c);}\nvector<Seg>mFbiasedSpatial(int arr,int ax,const multiset<int>&prefer,int mode){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[&](const Seg&a,const Seg&b){int pa=(int)prefer.count(a.len),pb=(int)prefer.count(b.len);if(pa!=pb)return pa>pb;if(a.len!=b.len)return a.len>b.len;if(mode==0){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}else{if(a.y!=b.y)return a.y<b.y;return a.x<b.x;}});return greedyFill(c);}\nvoid fS(int arr,const Seg&s,int id,int off,int len){for(int k=0;k<len;k++){int z=s.z+(s.ax==2?off+k:0),x=s.x+(s.ax==0?off+k:0),y=s.y+(s.ax==1?off+k:0);B[arr][x*D*D+y*D+z]=id;}}\nvoid doMF(const vector<Seg>&F0,const vector<Seg>&F1){map<int,vector<int>>g0,g1;for(int i=0;i<(int)F0.size();i++)g0[F0[i].len].push_back(i);for(int i=0;i<(int)F1.size();i++)g1[F1[i].len].push_back(i);vector<bool>u0(F0.size(),false),u1(F1.size(),false);for(auto&[l,v0]:g0){auto it=g1.find(l);if(it==g1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;fS(0,F0[v0[j]],bid,0,l);fS(1,F1[v1[j]],bid,0,l);u0[v0[j]]=u1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)F0.size();i++)if(!u0[i])rv0.push_back({F0[i].len,i});for(int i=0;i<(int)F1.size();i++)if(!u1[i])rv1.push_back({F1[i].len,i});\n    auto fillSeg=[&](int arr,const Seg&s,int id,int off,int len){fS(arr,s,id,off,len);};runBestTP(rv0,rv1,F0,F1,fillSeg);}\ndouble cScore(int mb){vector<int>v0(mb+1,0),v1(mb+1,0);for(int i=0;i<D*D*D;i++){if(B[0][i])v0[B[0][i]]++;if(B[1][i])v1[B[1][i]]++;}double sc=0;for(int k=1;k<=mb;k++){if(v0[k]>0&&v1[k]>0)sc+=1.0/v0[k];else if(v0[k]>0)sc+=v0[k];else sc+=v1[k];}return sc;}\ndouble doMFboxed(const vector<Seg>&F0,const vector<Seg>&F1){\n    uint16_t f0[14][14]={},f1[14][14]={};\n    auto buildF=[&](uint16_t f[14][14],const vector<Seg>&segs){for(auto&s:segs)for(int k=0;k<s.len;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);f[x][y]|=1u<<z;}};\n    buildF(f0,F0);buildF(f1,F1);\n    auto eBf=[&](uint16_t f[14][14])->vector<Box>{vector<Box>v;for(int x0=0;x0<D;x0++){uint16_t xm[14];for(int y=0;y<D;y++)xm[y]=f[x0][y];for(int a=1;x0+a<=D;a++){bool any=false;if(a==1){for(int y=0;y<D;y++)if(xm[y]){any=true;break;}}else{for(int y=0;y<D;y++){xm[y]&=f[x0+a-1][y];if(xm[y])any=true;}}if(!any)break;for(int y0=0;y0<D;y0++){uint16_t ym=~(uint16_t)0;for(int b=1;y0+b<=D;b++){ym&=xm[y0+b-1];if(!ym)break;for(int z=0;z<D;z++){if(!(ym&(1u<<z)))continue;int cm=0;while(z+cm<D&&(ym&(1u<<(z+cm))))cm++;for(int c=1;c<=cm;c++)v.push_back({x0,y0,z,a,b,c});}}}}};return v;};\n    auto bxs0=eBf(f0),bxs1=eBf(f1);\n    bool lo0[2744]={},lo1[2744]={};\n    auto bfL=[&](int r,const Box&b)->bool{bool*lo=r?lo1:lo0;for(int i=0;i<b.a;i++)for(int j=0;j<b.b;j++)for(int k=0;k<b.c;k++)if(lo[(b.x+i)*D*D+(b.y+j)*D+b.z+k])return false;return true;};\n    auto fBL=[&](int r,const Box&b,int id){bool*lo=r?lo1:lo0;for(int i=0;i<b.a;i++)for(int j=0;j<b.b;j++)for(int k=0;k<b.c;k++){int q=(b.x+i)*D*D+(b.y+j)*D+b.z+k;B[r][q]=id;lo[q]=true;}};\n    typedef array<int,3>Key;auto gk=[](const Box&b)->Key{Key k={b.a,b.b,b.c};sort(k.begin(),k.end());return k;};\n    map<Key,vector<int>>gb0,gb1;for(int i=0;i<(int)bxs0.size();i++)gb0[gk(bxs0[i])].push_back(i);for(int i=0;i<(int)bxs1.size();i++)gb1[gk(bxs1[i])].push_back(i);\n    vector<pair<int,Key>>grps;for(auto&[k,v]:gb0)if(gb1.count(k))grps.push_back({k[0]*k[1]*k[2],k});sort(grps.rbegin(),grps.rend());\n    for(auto&[vol,key]:grps){auto&v0=gb0[key];auto&v1=gb1[key];int p1=0;for(int i0:v0){if(!bfL(0,bxs0[i0]))continue;while(p1<(int)v1.size()&&!bfL(1,bxs1[v1[p1]]))p1++;if(p1>=(int)v1.size())break;bid++;fBL(0,bxs0[i0],bid);fBL(1,bxs1[v1[p1++]],bid);}}\n    auto getR=[&](bool*lo,uint16_t f[14][14])->vector<Seg>{vector<Seg>segs;for(int x=0;x<D;x++)for(int y=0;y<D;y++){if(!f[x][y])continue;for(int z=0,zs=-1;z<=D;z++){bool v=z<D&&(f[x][y]&(1u<<z))&&!lo[x*D*D+y*D+z];if(v&&zs<0)zs=z;else if(!v&&zs>=0){segs.push_back({x,y,zs,z-zs,2});zs=-1;}}}return segs;};\n    auto rem0=getR(lo0,f0),rem1=getR(lo1,f1);\n    map<int,vector<int>>gr0,gr1;for(int i=0;i<(int)rem0.size();i++)gr0[rem0[i].len].push_back(i);for(int i=0;i<(int)rem1.size();i++)gr1[rem1[i].len].push_back(i);\n    vector<bool>ur0(rem0.size(),false),ur1(rem1.size(),false);for(auto&[l,v0]:gr0){auto it=gr1.find(l);if(it==gr1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;fS(0,rem0[v0[j]],bid,0,l);fS(1,rem1[v1[j]],bid,0,l);ur0[v0[j]]=ur1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)rem0.size();i++)if(!ur0[i])rv0.push_back({rem0[i].len,i});for(int i=0;i<(int)rem1.size();i++)if(!ur1[i])rv1.push_back({rem1[i].len,i});\n    auto fillSeg=[&](int arr,const Seg&s,int id,int off,int len){fS(arr,s,id,off,len);};runBestTP(rv0,rv1,rem0,rem1,fillSeg);\n    return cScore(bid);}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>D;for(int i=0;i<2;i++){for(int z=0;z<D;z++)cin>>Fs[i][z];for(int z=0;z<D;z++)cin>>Rs[i][z];}\n    struct Res{int bid;int B[2][2744];};\n    double best=1e18;Res bestR;bestR.bid=0;memset(bestR.B,0,sizeof(bestR.B));\n    auto tryIt=[&](auto fn){memset(B,0,sizeof(B));bid=0;double s=fn();if(s<best){best=s;bestR.bid=bid;memcpy(bestR.B,B,sizeof(B));}};\n    for(int a0=0;a0<3;a0++)for(int a1=0;a1<3;a1++){\n        auto F0u=mF(0,a0),F1u=mF(1,a1);\n        tryIt([&,F0u,F1u]{doMF(F0u,F1u);return cScore(bid);});\n        tryIt([&,F0u,F1u]{return doMFboxed(F0u,F1u);});\n        multiset<int>L0,L1;for(auto&s:F0u)L0.insert(s.len);for(auto&s:F1u)L1.insert(s.len);\n        auto F0b=mFbiased(0,a0,L1),F1b=mFbiased(1,a1,L0);\n        tryIt([&,F0b,F1b]{doMF(F0b,F1b);return cScore(bid);});\n        tryIt([&,F0b,F1b]{return doMFboxed(F0b,F1b);});\n        multiset<int>L0b,L1b;for(auto&s:F0b)L0b.insert(s.len);for(auto&s:F1b)L1b.insert(s.len);\n        auto F0b2=mFbiased(0,a0,L1b),F1b2=mFbiased(1,a1,L0b);\n        tryIt([&,F0b2,F1b2]{doMF(F0b2,F1b2);return cScore(bid);});\n        tryIt([&,F0b2,F1b2]{return doMFboxed(F0b2,F1b2);});\n        for(int mode=0;mode<2;mode++){\n            auto F0s=mFspatial(0,a0,mode),F1s=mFspatial(1,a1,mode);\n            tryIt([&,F0s,F1s]{doMF(F0s,F1s);return cScore(bid);});\n            tryIt([&,F0s,F1s]{return doMFboxed(F0s,F1s);});\n            auto F0bs=mFbiasedSpatial(0,a0,L1,mode),F1bs=mFbiasedSpatial(1,a1,L0,mode);\n            tryIt([&,F0bs,F1bs]{return doMFboxed(F0bs,F1bs);});\n        }\n    }\n    tryIt([&]{memset(occ,0,sizeof(occ));doBox();return cScore(bid);});\n    bid=bestR.bid;memcpy(B,bestR.B,sizeof(B));\n    cout<<bid<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[0][i];}cout<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[1][i];}cout<<\"\\n\";\n    return 0;}","ahc020":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint main() {\n    auto tStart = chrono::steady_clock::now();\n    auto msElapsed = [&]() {\n        return (int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-tStart).count();\n    };\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,K; cin>>N>>M>>K;\n    vector<ll> X(N),Y(N);\n    for(int i=0;i<N;i++) cin>>X[i]>>Y[i];\n    vector<int> EU(M),EV(M); vector<ll> EW(M);\n    for(int j=0;j<M;j++){cin>>EU[j]>>EV[j]>>EW[j];EU[j]--;EV[j]--;}\n    vector<ll> A(K),B(K);\n    for(int k=0;k<K;k++) cin>>A[k]>>B[k];\n    const ll MAXP=5000,MAXP2=MAXP*MAXP,INF=(ll)4e18;\n    // D2[i][k] and D2T[k][i] (transposed, cache-efficient for fixed k, varying i)\n    vector<vector<ll>> D2(N,vector<ll>(K)),D2T(K,vector<ll>(N));\n    for(int i=0;i<N;i++)\n        for(int k=0;k<K;k++){ll dx=A[k]-X[i],dy=B[k]-Y[i];D2[i][k]=D2T[k][i]=dx*dx+dy*dy;}\n    vector<vector<pair<int,int>>> adj(N);\n    for(int j=0;j<M;j++){adj[EU[j]].push_back({EV[j],j});adj[EV[j]].push_back({EU[j],j});}\n    auto pVal=[&](ll d2)->ll{if(!d2)return 0;ll p=(ll)sqrt((double)d2);while(p*p<d2)p++;return min(p,MAXP);};\n    // APSP\n    vector<vector<ll>> spD(N,vector<ll>(N,INF));\n    vector<vector<int>> spE(N,vector<int>(N,-1)),spPr(N,vector<int>(N,-1));\n    for(int s=0;s<N;s++){\n        spD[s][s]=0;\n        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> pq;pq.push({0,s});\n        while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(d>spD[s][v])continue;\n            for(auto&[u,j]:adj[v]){ll nd=d+EW[j];if(nd<spD[s][u]){spD[s][u]=nd;spPr[s][u]=v;spE[s][u]=j;pq.push({nd,u});}}}\n    }\n    auto buildSteiner=[&](vector<bool> term)->vector<bool>{\n        term[0]=true;vector<int>T;for(int i=0;i<N;i++)if(term[i])T.push_back(i);int TN=T.size();\n        vector<bool>in(TN,false);vector<ll>key(TN,INF);vector<int>par(TN,-1);key[0]=0;\n        for(int it=0;it<TN;it++){int u=-1;for(int i=0;i<TN;i++)if(!in[i]&&(u<0||key[i]<key[u]))u=i;\n            if(u<0||key[u]>=INF)break;in[u]=true;\n            for(int w=0;w<TN;w++)if(!in[w]&&spD[T[u]][T[w]]<key[w]){key[w]=spD[T[u]][T[w]];par[w]=u;}}\n        vector<bool>eo(M,false);\n        for(int i=0;i<TN;i++){if(par[i]<0)continue;int src=T[par[i]],dst=T[i];for(int v=dst;v!=src;v=spPr[src][v])eo[spE[src][v]]=true;}\n        return eo;\n    };\n    // Enhanced optimizeP: 1-opt + bulk-2 + bulk-3 + 2-opt swap (using D2T for cache efficiency)\n    auto optimizeP=[&](const vector<bool>&reach)->pair<vector<int>,ll>{\n        vector<vector<int>>vR(N);vector<ll>vMx(N,0);\n        for(int k=0;k<K;k++){\n            ll best=INF;int bv=-1;\n            for(int i=0;i<N;i++)if(reach[i]&&D2T[k][i]<best){best=D2T[k][i];bv=i;}\n            if(bv<0||best>MAXP2)return{{},INF};\n            vR[bv].push_back(k);vMx[bv]=max(vMx[bv],best);\n        }\n        vector<ll>Pv(N,0);for(int i=0;i<N;i++)Pv[i]=pVal(vMx[i]);\n        bool imp=true;int it=0;\n        while(imp&&it++<500){\n            imp=false;\n            struct T4{int k[4];ll d[4];};\n            vector<T4>tp(N);\n            for(int u=0;u<N;u++){tp[u]={{-1,-1,-1,-1},{0,0,0,0}};\n                for(int k:vR[u]){ll d=D2T[k][u];\n                    if(d>tp[u].d[0]){tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=tp[u].d[1];tp[u].k[2]=tp[u].k[1];tp[u].d[1]=tp[u].d[0];tp[u].k[1]=tp[u].k[0];tp[u].d[0]=d;tp[u].k[0]=k;}\n                    else if(d>tp[u].d[1]){tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=tp[u].d[1];tp[u].k[2]=tp[u].k[1];tp[u].d[1]=d;tp[u].k[1]=k;}\n                    else if(d>tp[u].d[2]){tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=d;tp[u].k[2]=k;}\n                    else if(d>tp[u].d[3]){tp[u].d[3]=d;tp[u].k[3]=k;}\n                }}\n            ll bD=0;int bU=-1,bV=-1,bT=-1;\n            for(int u=0;u<N;u++){\n                if(!reach[u]||tp[u].k[0]<0)continue;\n                ll Pu2=Pv[u]*Pv[u];\n                for(int v=0;v<N;v++){\n                    if(v==u||!reach[v])continue;\n                    ll Pv2=Pv[v]*Pv[v];\n                    ll d0v=D2T[tp[u].k[0]][v];bool f0=(d0v<=MAXP2);\n                    if(f0){ll nPu=pVal(tp[u].d[1]),nPv=pVal(max(vMx[v],d0v));ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=0;}}\n                    if(f0&&tp[u].k[1]>=0){ll d1v=D2T[tp[u].k[1]][v];if(d1v<=MAXP2){ll nPu=pVal(tp[u].d[2]),nPv=pVal(max({vMx[v],d0v,d1v}));ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=1;}}}\n                    if(f0&&tp[u].k[2]>=0){ll d1v=D2T[tp[u].k[1]][v],d2v=D2T[tp[u].k[2]][v];if(d1v<=MAXP2&&d2v<=MAXP2){ll nPu=pVal(tp[u].d[3]),nPv=pVal(max({vMx[v],d0v,d1v,d2v}));ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=2;}}}\n                    if(v>u&&f0&&tp[v].k[0]>=0){ll d0u=D2T[tp[v].k[0]][u];if(d0u<=MAXP2){ll nMxU=max(tp[u].d[1],d0u),nMxV=max(tp[v].d[1],d0v);ll nPu=pVal(nMxU),nPv=pVal(nMxV);ll d=nPu*nPu+nPv*nPv-Pu2-Pv2;if(d<bD){bD=d;bU=u;bV=v;bT=3;}}}\n                }\n            }\n            if(bU<0)break;\n            int u=bU,v=bV;\n            if(bT==0){int ku=tp[u].k[0];auto&ru=vR[u];ru.erase(find(ru.begin(),ru.end(),ku));vR[v].push_back(ku);vMx[u]=tp[u].d[1];Pv[u]=pVal(vMx[u]);vMx[v]=max(vMx[v],D2T[ku][v]);Pv[v]=pVal(vMx[v]);}\n            else if(bT==1){int k0=tp[u].k[0],k1=tp[u].k[1];auto&ru=vR[u];ru.erase(find(ru.begin(),ru.end(),k0));ru.erase(find(ru.begin(),ru.end(),k1));vR[v].push_back(k0);vR[v].push_back(k1);vMx[u]=tp[u].d[2];Pv[u]=pVal(vMx[u]);vMx[v]=max({vMx[v],D2T[k0][v],D2T[k1][v]});Pv[v]=pVal(vMx[v]);}\n            else if(bT==2){int k0=tp[u].k[0],k1=tp[u].k[1],k2=tp[u].k[2];auto&ru=vR[u];ru.erase(find(ru.begin(),ru.end(),k0));ru.erase(find(ru.begin(),ru.end(),k1));ru.erase(find(ru.begin(),ru.end(),k2));vR[v].push_back(k0);vR[v].push_back(k1);vR[v].push_back(k2);vMx[u]=tp[u].d[3];Pv[u]=pVal(vMx[u]);vMx[v]=max({vMx[v],D2T[k0][v],D2T[k1][v],D2T[k2][v]});Pv[v]=pVal(vMx[v]);}\n            else{int ku=tp[u].k[0],kv=tp[v].k[0];auto&ru=vR[u];auto&rv=vR[v];ru.erase(find(ru.begin(),ru.end(),ku));rv.erase(find(rv.begin(),rv.end(),kv));ru.push_back(kv);rv.push_back(ku);vMx[u]=max(tp[u].d[1],D2T[kv][u]);Pv[u]=pVal(vMx[u]);vMx[v]=max(tp[v].d[1],D2T[ku][v]);Pv[v]=pVal(vMx[v]);}\n            imp=true;\n        }\n        vector<int>P(N,0);ll pc=0;for(int i=0;i<N;i++){P[i]=(int)Pv[i];pc+=Pv[i]*Pv[i];}\n        return{P,pc};\n    };\n    auto evalEO=[&](const vector<bool>&eo)->tuple<vector<int>,ll,bool>{\n        vector<bool>reach(N,false);queue<int>q;q.push(0);reach[0]=true;\n        while(!q.empty()){int v=q.front();q.pop();for(auto&[u,j]:adj[v])if(eo[j]&&!reach[u]){reach[u]=true;q.push(u);}}\n        ll ec=0;for(int j=0;j<M;j++)if(eo[j])ec+=EW[j];\n        auto[P,pc]=optimizeP(reach);if(pc==INF)return{{},INF,false};\n        return{P,ec+pc,true};\n    };\n    // MST\n    vector<int>mstPar(N,-1),mstPE(N,-1);vector<vector<int>>mstCh(N);\n    {vector<bool>vis(N,false);vector<ll>key(N,INF);key[0]=0;\n    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>>pq;pq.push({0,0});\n    while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(vis[v])continue;vis[v]=true;for(auto&[u,j]:adj[v])if(!vis[u]&&EW[j]<key[u]){key[u]=EW[j];mstPar[u]=v;mstPE[u]=j;pq.push({EW[j],u});}}\n    for(int v=1;v<N;v++)mstCh[mstPar[v]].push_back(v);}\n    // Leaf pruning (using D2T)\n    vector<bool>act(N,true);vector<vector<int>>vRes(N);vector<ll>vmx(N,0),Pv(N,0);\n    for(int k=0;k<K;k++){ll best=INF;int bv=-1;for(int i=0;i<N;i++)if(D2T[k][i]<best){best=D2T[k][i];bv=i;}vRes[bv].push_back(k);vmx[bv]=max(vmx[bv],best);}\n    for(int i=0;i<N;i++)Pv[i]=pVal(vmx[i]);\n    ll ec0=0,pc0=0;for(int v=1;v<N;v++)ec0+=EW[mstPE[v]];for(int i=0;i<N;i++)pc0+=Pv[i]*Pv[i];\n    auto isLeaf=[&](int v){for(int c:mstCh[v])if(act[c])return false;return true;};\n    for(bool imp2=true;imp2;){\n        imp2=false;ll bD=0;int bV=-1;vector<pair<int,int>>bAs;vector<pair<int,ll>>bAf;\n        for(int v=1;v<N;v++){\n            if(!act[v]||!isLeaf(v))continue;\n            ll delta=-(EW[mstPE[v]]+Pv[v]*Pv[v]);\n            map<int,ll>tmp;vector<pair<int,int>>ta;bool ok=true;\n            for(int k:vRes[v]){ll best=INF;int bu=-1;for(int u=0;u<N;u++){if(u==v||!act[u])continue;if(D2T[k][u]<best){best=D2T[k][u];bu=u;}}\n                if(bu<0||best>MAXP2){ok=false;break;}ta.push_back({k,bu});if(!tmp.count(bu))tmp[bu]=vmx[bu];tmp[bu]=max(tmp[bu],best);}\n            if(!ok)continue;\n            for(auto&[u,nd]:tmp){ll np=pVal(nd);delta+=np*np-Pv[u]*Pv[u];}\n            if(delta<bD){bD=delta;bV=v;bAs=ta;bAf.clear();for(auto&[u,nd]:tmp)bAf.push_back({u,nd});}\n        }\n        if(bV>=0){act[bV]=false;ec0-=EW[mstPE[bV]];pc0-=Pv[bV]*Pv[bV];Pv[bV]=0;vmx[bV]=0;vRes[bV].clear();\n            for(auto&[k,u]:bAs)vRes[u].push_back(k);\n            for(auto&[u,nd]:bAf){pc0-=Pv[u]*Pv[u];vmx[u]=nd;Pv[u]=pVal(nd);pc0+=Pv[u]*Pv[u];}imp2=true;}\n    }\n    ll bestCost=INF;vector<bool>bestEO(M,false);vector<int>bestP(N,0);\n    auto updateBest=[&](const vector<bool>&eo,const vector<int>&P,ll cost){if(cost<bestCost){bestCost=cost;bestEO=eo;bestP=P;}};\n    {vector<bool>eo(M,false);for(int v=1;v<N;v++)if(act[v])eo[mstPE[v]]=true;auto[P,sc,sf]=evalEO(eo);if(sf)updateBest(eo,P,sc);}\n    auto runSteiner=[&](vector<bool>term,int maxIter=20){\n        term[0]=true;\n        for(int sit=0;sit<maxIter&&msElapsed()<1600;sit++){\n            auto eo=buildSteiner(term);auto[sp,sc,sf]=evalEO(eo);if(!sf)break;\n            updateBest(eo,sp,sc);\n            vector<bool>nt(N,false);nt[0]=true;for(int i=0;i<N;i++)if(sp[i]>0)nt[i]=true;\n            if(nt==term)break;term=nt;\n        }\n    };\n    {vector<bool>t(N,false);for(int i=0;i<N;i++)if(Pv[i]>0)t[i]=true;runSteiner(t);}\n    {vector<bool>t(N,true);runSteiner(t);}\n    // Time-based systematic terminal set search\n    auto getTerms=[&]()->vector<bool>{\n        vector<bool>t(N,false);t[0]=true;for(int i=0;i<N;i++)if(bestP[i]>0)t[i]=true;return t;\n    };\n    bool sysImp=true;\n    while(sysImp&&msElapsed()<1850){\n        sysImp=false;\n        vector<bool>curT=getTerms();\n        // Try adding each non-terminal\n        for(int v=1;v<N&&msElapsed()<1850;v++){\n            if(curT[v])continue;\n            vector<bool>t=curT;t[v]=true;\n            auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);\n            if(sf&&sc<bestCost){updateBest(eo,sp,sc);sysImp=true;curT=getTerms();}\n        }\n        // Try removing each terminal\n        for(int v=1;v<N&&msElapsed()<1850;v++){\n            if(!curT[v])continue;\n            vector<bool>t=curT;t[v]=false;\n            auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);\n            if(sf&&sc<bestCost){updateBest(eo,sp,sc);sysImp=true;curT=getTerms();}\n        }\n    }\n    for(int i=0;i<N;i++)cout<<bestP[i]<<\" \\n\"[i==N-1];\n    for(int j=0;j<M;j++)cout<<(int)bestEO[j]<<\" \\n\"[j==M-1];\n    return 0;\n}","ahc021":"#include <bits/stdc++.h>\nusing namespace std;\n\nconst int N = 30;\nint init_board[N][N], board[N][N];\n\nvoid do_heapify(mt19937* rng, int mode, vector<array<int,4>>& ops) {\n    memcpy(board, init_board, sizeof(board));\n    ops.clear();\n    int ys[N];\n    for (int x = N-2; x >= 0; x--) {\n        for (int y = 0; y <= x; y++) ys[y] = y;\n        switch (mode) {\n            case 1: // RL\n                for (int l=0,r=x; l<r; l++,r--) swap(ys[l],ys[r]);\n                break;\n            case 2: // Small value first (input-adaptive)\n                sort(ys, ys+x+1, [&](int a, int b){ return board[x][a] < board[x][b]; });\n                break;\n            case 3: // Large value first (input-adaptive)\n                sort(ys, ys+x+1, [&](int a, int b){ return board[x][a] > board[x][b]; });\n                break;\n            default: // Random\n                if (rng) for (int i = x; i > 0; i--) swap(ys[i], ys[(*rng)()%(i+1)]);\n                break;\n        }\n        for (int i = 0; i <= x; i++) {\n            int y = ys[i], cx = x, cy = y;\n            while (cx < N-1) {\n                int ny = (board[cx+1][cy] <= board[cx+1][cy+1]) ? cy : cy+1;\n                if (board[cx][cy] <= board[cx+1][ny]) break;\n                swap(board[cx][cy], board[cx+1][ny]);\n                ops.push_back({cx, cy, cx+1, ny});\n                cy = ny; cx++;\n            }\n        }\n    }\n}\n\nint main() {\n    ios::sync_with_stdio(false); cin.tie(nullptr);\n    for (int x = 0; x < N; x++) for (int y = 0; y <= x; y++) cin >> init_board[x][y];\n\n    mt19937 rng(42);\n    vector<array<int,4>> best, v;\n    best.reserve(5000); v.reserve(5000);\n\n    do_heapify(nullptr, 0, best); // LR\n    for (int mode = 1; mode <= 3; mode++) {\n        do_heapify(nullptr, mode, v);\n        if (v.size() < best.size()) swap(best, v);\n    }\n    for (int t = 0; t < 30000; t++) {\n        do_heapify(&rng, 4, v);\n        if (v.size() < best.size()) swap(best, v);\n    }\n\n    cout << best.size() << \"\\n\";\n    for (auto& op : best)\n        cout << op[0] << \" \" << op[1] << \" \" << op[2] << \" \" << op[3] << \"\\n\";\n}","toyota2023summer-final":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXD=9;\nint D,N,M,er,ec;\nbool obs[MAXD][MAXD],hasc[MAXD][MAXD];\nint cnum[MAXD][MAXD],sr[MAXD*MAXD],sc[MAXD*MAXD],pk[MAXD][MAXD];\nconst int DR[4]={-1,1,0,0},DC[4]={0,0,-1,1};\nbool in_(int r,int c){return(unsigned)r<(unsigned)D&&(unsigned)c<(unsigned)D;}\nvoid build_sigma(){\n    int dist[MAXD][MAXD];memset(dist,-1,sizeof dist);\n    queue<pair<int,int>>q;q.push({er,ec});dist[er][ec]=0;\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+DR[i],ny=y+DC[i];if(!in_(nx,ny)||dist[nx][ny]>=0||obs[nx][ny])continue;dist[nx][ny]=dist[x][y]+1;q.push({nx,ny});}}\n    vector<pair<int,int>>pos;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(!obs[r][c]&&!(r==er&&c==ec))pos.emplace_back(r,c);\n    sort(pos.begin(),pos.end(),[&](const pair<int,int>&a,const pair<int,int>&b){if(dist[a.first][a.second]!=dist[b.first][b.second])return dist[a.first][a.second]<dist[b.first][b.second];if(a.first!=b.first)return a.first<b.first;return a.second<b.second;});\n    M=(int)pos.size();for(int k=0;k<M;k++){sr[k]=pos[k].first;sc[k]=pos[k].second;pk[pos[k].first][pos[k].second]=k;}\n}\nint gd[MAXD][MAXD],gl[MAXD][MAXD],gT;bool ga[MAXD][MAXD];\nvoid apdfs(int r,int c,int pr,int pc){\n    gd[r][c]=gl[r][c]=gT++;int ch=0;\n    for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!in_(nr,nc)||obs[nr][nc]||hasc[nr][nc])continue;\n        if(gd[nr][nc]==-1){ch++;apdfs(nr,nc,r,c);gl[r][c]=min(gl[r][c],gl[nr][nc]);if(pr==-1&&ch>1)ga[r][c]=true;if(pr!=-1&&gl[nr][nc]>=gd[r][c])ga[r][c]=true;}\n        else if(!(nr==pr&&nc==pc))gl[r][c]=min(gl[r][c],gd[nr][nc]);}\n}\npair<int,int>pick(int t){\n    memset(gd,-1,sizeof gd);memset(gl,-1,sizeof gl);memset(ga,0,sizeof ga);gT=0;\n    apdfs(er,ec,-1,-1);\n    int ir=sr[t],ic=sc[t];\n    if(gd[ir][ic]>=0&&!ga[ir][ic])return{ir,ic};\n    pair<int,int>best={-1,-1};int bd=INT_MAX,brk=-1;bool gots=false;\n    for(int r=0;r<D;r++)for(int c=0;c<D;c++){\n        if(gd[r][c]<0||(r==er&&c==ec))continue;\n        bool s=!ga[r][c];if(!s&&gots)continue;\n        int d=abs(pk[r][c]-t),rk=pk[r][c];\n        bool better=(!gots&&s)||(gots==s&&(d<bd||(d==bd&&rk>brk)));\n        if(better){best={r,c};bd=d;brk=rk;gots=s;}\n    }\n    return best;\n}\nvoid bfsr(bool st[MAXD][MAXD],bool reach[MAXD][MAXD]){\n    static pair<int,int>Q[MAXD*MAXD];memset(reach,0,MAXD*MAXD*sizeof(bool));\n    int h=0,t=0;Q[t++]={er,ec};reach[er][ec]=true;\n    while(h<t){auto[x,y]=Q[h++];for(int i=0;i<4;i++){int nx=x+DR[i],ny=y+DC[i];if(!in_(nx,ny)||reach[nx][ny]||obs[nx][ny]||st[nx][ny])continue;reach[nx][ny]=true;Q[t++]={nx,ny};}}\n}\nbool isacc(bool reach[MAXD][MAXD],int r,int c){for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(in_(nr,nc)&&reach[nr][nc])return true;}return false;}\nint count_inv(const vector<int>&v){int inv=0,n=v.size();for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(v[i]>v[j])inv++;return inv;}\nint sim_greedy_inv(bool hin[MAXD][MAXD],vector<int> seq){\n    bool h[MAXD][MAXD];memcpy(h,hin,sizeof h);\n    while(true){\n        bool reach[MAXD][MAXD];bfsr(h,reach);\n        int bn=INT_MAX,br=-1,bc=-1;\n        for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(h[r][c]&&isacc(reach,r,c)&&cnum[r][c]<bn){bn=cnum[r][c];br=r;bc=c;}\n        if(br==-1)break;\n        seq.push_back(bn);h[br][bc]=false;\n    }\n    return count_inv(seq);\n}\nvector<pair<int,int>>transport(){\n    bool h[MAXD][MAXD];memcpy(h,hasc,sizeof h);\n    vector<pair<int,int>>ord;ord.reserve(M);\n    vector<int>committed;\n    for(int s=0;s<M;s++){\n        bool reach[MAXD][MAXD];bfsr(h,reach);\n        vector<tuple<int,int,int>>acc;\n        for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(h[r][c]&&isacc(reach,r,c))acc.emplace_back(cnum[r][c],r,c);\n        if(acc.empty())break;\n        sort(acc.begin(),acc.end());\n        auto[mn,mr,mc]=acc[0];\n        pair<int,int>best_pos={mr,mc};int best_inv=-1;\n        for(auto&[nx,rx,cx]:acc){\n            if(nx==mn)continue;\n            bool h2[MAXD][MAXD];memcpy(h2,h,sizeof h2);h2[rx][cx]=false;\n            bool reach2[MAXD][MAXD];bfsr(h2,reach2);\n            int gain=0;\n            for(int r=0;r<D;r++)for(int c=0;c<D;c++)\n                if(h2[r][c]&&!isacc(reach,r,c)&&isacc(reach2,r,c)&&cnum[r][c]<nx)gain++;\n            if(gain==0)continue;\n            if(best_inv==-1){\n                bool hg[MAXD][MAXD];memcpy(hg,h,sizeof hg);hg[mr][mc]=false;\n                vector<int>sg=committed;sg.push_back(mn);\n                best_inv=sim_greedy_inv(hg,sg);\n            }\n            vector<int>sx=committed;sx.push_back(nx);\n            int inv_x=sim_greedy_inv(h2,sx);\n            if(inv_x<best_inv){best_inv=inv_x;best_pos={rx,cx};}\n        }\n        committed.push_back(cnum[best_pos.first][best_pos.second]);\n        ord.emplace_back(best_pos);\n        h[best_pos.first][best_pos.second]=false;\n    }\n    return ord;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>D>>N;memset(obs,false,sizeof obs);memset(hasc,false,sizeof hasc);memset(cnum,-1,sizeof cnum);\n    er=0;ec=(D-1)/2;for(int i=0;i<N;i++){int r,c;cin>>r>>c;obs[r][c]=true;}\n    build_sigma();\n    for(int d=0;d<M;d++){int t;cin>>t;auto[r,c]=pick(t);hasc[r][c]=true;cnum[r][c]=t;cout<<r<<' '<<c<<'\\n';cout.flush();}\n    auto ord=transport();for(auto[r,c]:ord)cout<<r<<' '<<c<<'\\n';cout.flush();\n}","ahc024":"#include <bits/stdc++.h>\nusing namespace std;using namespace chrono;\nint n,m,g[50][50],og[50][50];bool adj[102][102];\nint ac[102][102],cc[102],dp[102];\nconst int dr[]={0,0,1,-1},dc[]={1,-1,0,0};\nauto t0=steady_clock::now();\nbool tok(){return duration_cast<milliseconds>(steady_clock::now()-t0).count()<1500;}\nint gc(int r,int c){return(r<0||r>=n||c<0||c>=n)?0:g[r][c];}\nvoid cajad(){memset(adj,0,sizeof(adj));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int c=g[i][j];for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=c)adj[c][nc]=adj[nc][c]=1;}}}\nvoid cdep(){fill(dp,dp+102,100);queue<int>q;for(int c=0;c<=m;c++)if(adj[c][0]){dp[c]=0;q.push(c);}dp[0]=0;while(!q.empty()){int u=q.front();q.pop();for(int v=1;v<=m;v++)if(adj[u][v]&&dp[v]>dp[u]+1){dp[v]=dp[u]+1;q.push(v);}}}\nvoid rcp(){memset(ac,0,sizeof(ac));memset(cc,0,sizeof(cc));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int c=g[i][j];cc[c]++;bool s[102]={};for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=c&&!s[nc]){ac[c][nc]++;s[nc]=1;}}}}\nbool cok(int r,int c,int col){if(cc[col]<=1)return 0;int sr=-1,sc=-1;for(int i=0;i<n&&sr<0;i++)for(int j=0;j<n;j++)if(g[i][j]==col&&!(i==r&&j==c)){sr=i;sc=j;break;}if(sr<0)return 0;bool v[50][50]={};queue<pair<int,int>>q;q.push({sr,sc});v[sr][sc]=1;int cnt=1;while(!q.empty()){auto[cr,cc2]=q.front();q.pop();for(int d=0;d<4;d++){int nr=cr+dr[d],nc=cc2+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==col&&!(nr==r&&nc==c)&&!v[nr][nc]){v[nr][nc]=1;cnt++;q.push({nr,nc});}}}return cnt==cc[col]-1;}\nbool ctr(int r,int c){int col=g[r][c];if(!col||!adj[col][0])return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&!adj[nc][0])return 0;}bool za=(r==0||r==n-1||c==0||c==n-1);if(!za)for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&!g[nr][nc]){za=1;break;}}if(!za)return 0;if(cc[col]<=1)return 0;int cnb=0;for(int d=0;d<4;d++)if(gc(r+dr[d],c+dc[d])==col)cnb++;if(cnb==0)return 0;if(cnb>=2&&!cok(r,c,col))return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&ac[col][nc]<=1)return 0;}return 1;}\nvoid dtr(int r,int c){int col=g[r][c];bool s[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!s[nc]){ac[col][nc]--;s[nc]=1;}}g[r][c]=0;cc[col]--;cc[0]++;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;bool hz=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2<0||nr2>=n||nc2<0||nc2>=n){hz=1;break;}if(!g[nr2][nc2]){hz=1;break;}}if(!hz)ac[ncol][0]++;if(ncol==col)continue;bool sc2=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){sc2=1;break;}}if(!sc2)ac[ncol][col]--;}}\nvoid gtrim(){bool ch=1;while(ch){ch=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(g[i][j]&&ctr(i,j)){dtr(i,j);ch=1;}}}\nvoid dra(int r,int c,int col,int c2){bool s1[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!s1[nc]){ac[col][nc]--;s1[nc]=1;}}g[r][c]=c2;cc[col]--;cc[c2]++;bool s2[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=c2&&!s2[nc]){ac[c2][nc]++;s2[nc]=1;}}for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;if(ncol!=col){bool st=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){st=1;break;}}if(!st)ac[ncol][col]--;}if(ncol!=c2){bool hd=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==c2){hd=1;break;}}if(!hd)ac[ncol][c2]++;}}}\nbool cra(int r,int c,int&co){int col=g[r][c];if(!col||adj[col][0])return 0;if(cc[col]<=1)return 0;bool any=0;for(int d=0;d<4;d++){int c2=gc(r+dr[d],c+dc[d]);if(c2&&c2!=col&&dp[c2]<=dp[col]){any=1;break;}}if(!any)return 0;int cnb=0;for(int d=0;d<4;d++)if(gc(r+dr[d],c+dc[d])==col)cnb++;if(cnb==0)return 0;if(cnb>=2&&!cok(r,c,col))return 0;int best=-1,bd=dp[col]+1;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int c2=g[nr][nc];if(!c2||c2==col||dp[c2]>dp[col])continue;bool ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&!adj[c2][dc2]){ok=0;break;}}if(!ok)continue;ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&ac[col][dc2]<=1){ok=0;break;}}if(!ok)continue;if(dp[c2]<bd){best=c2;bd=dp[c2];}}if(best>=0){co=best;return 1;}return 0;}\nint czero(){int c=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)c+=!g[i][j];return c;}\nvoid run(const vector<int>&ord){rcp();gtrim();int pz=czero();while(tok()){rcp();for(int p=0;p<10;p++){bool a=0;for(int idx:ord){int i=idx/n,j=idx%n,col=g[i][j],co;if(cra(i,j,co)){dra(i,j,col,co);a=1;}}if(!a)break;}gtrim();int z=czero();if(z<=pz)break;pz=z;}}\nint mg[50][50],mac[102][102],mcc[102];\nbool wconn(int W){int sr=-1,sc_=-1,wc=0;for(int a=0;a<n;a++)for(int b=0;b<n;b++)if(g[a][b]==W){wc++;if(sr<0){sr=a;sc_=b;}}if(!wc)return 1;bool v[50][50]={};queue<pair<int,int>>q;q.push({sr,sc_});v[sr][sc_]=1;int cnt=1;while(!q.empty()){auto[cr,c2]=q.front();q.pop();for(int d=0;d<4;d++){int nr=cr+dr[d],nc=c2+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==W&&!v[nr][nc]){v[nr][nc]=1;cnt++;q.push({nr,nc});}}}return cnt==wc;}\nvoid micro_opt(){\n    for(int i=0;i<n&&tok();i++)for(int j=0;j<n;j++){\n        int I=g[i][j];if(!I||adj[I][0]||cc[I]!=1)continue;\n        for(int d0=0;d0<4;d0++){\n            int ni=i+dr[d0],nj=j+dc[d0];if(ni<0||ni>=n||nj<0||nj>=n)continue;\n            int E=g[ni][nj];if(!E||!adj[E][0]||!adj[I][E])continue;\n            bool bad=false;for(int d2=0;d2<4;d2++){int a2=ni+dr[d2],b2=nj+dc[d2];if(a2==i&&b2==j)continue;if(a2<0||a2>=n||b2<0||b2>=n||!g[a2][b2]){bad=true;break;}}\n            if(!bad){\n                int sz=czero();memcpy(mg,g,sizeof(g));memcpy(mac,ac,sizeof(ac));memcpy(mcc,cc,sizeof(cc));\n                dra(ni,nj,E,I);dra(i,j,I,E);\n                if(wconn(E)){rcp();bool vd=true;for(int a=1;a<=m&&vd;a++){if(adj[a][0]!=(ac[a][0]>0))vd=false;for(int b=1;b<a&&vd;b++)if(adj[a][b]!=(ac[a][b]>0))vd=false;}if(vd)for(int w=1;w<=m&&vd;w++)if(!wconn(w))vd=false;if(vd){gtrim();if(czero()>sz)continue;}}\n                memcpy(g,mg,sizeof(g));memcpy(ac,mac,sizeof(ac));memcpy(cc,mcc,sizeof(cc));\n            }\n            for(int d12=0;d12<4;d12++){\n                int r2=ni+dr[d12],c2=nj+dc[d12];if(r2<0||r2>=n||c2<0||c2>=n||(r2==i&&c2==j))continue;\n                int E2=g[r2][c2];if(!E2||!adj[E2][0]||!adj[I][E2]||E2==I)continue;\n                bool bad2=false;for(int d2=0;d2<4;d2++){int a2=r2+dr[d2],b2=c2+dc[d2];if(a2==ni&&b2==nj)continue;if(a2<0||a2>=n||b2<0||b2>=n||!g[a2][b2]){bad2=true;break;}}\n                if(bad2)continue;\n                int sz=czero();memcpy(mg,g,sizeof(g));memcpy(mac,ac,sizeof(ac));memcpy(mcc,cc,sizeof(cc));\n                dra(ni,nj,E,I);dra(i,j,I,E);dra(r2,c2,E2,I);dra(ni,nj,I,E2);\n                if(wconn(E)&&wconn(E2)){rcp();bool vd=true;for(int a=1;a<=m&&vd;a++){if(adj[a][0]!=(ac[a][0]>0))vd=false;for(int b=1;b<a&&vd;b++)if(adj[a][b]!=(ac[a][b]>0))vd=false;}if(vd)for(int w=1;w<=m&&vd;w++)if(!wconn(w))vd=false;if(vd){gtrim();if(czero()>sz)continue;}}\n                memcpy(g,mg,sizeof(g));memcpy(ac,mac,sizeof(ac));memcpy(cc,mcc,sizeof(cc));\n            }\n        }\n    }\n}\nstatic int bg[50][50];int bz=-1;\nvoid sv(){int z=czero();if(z>bz){bz=z;memcpy(bg,g,sizeof(g));}}\nvector<int> centroid_last_ord(){\n    vector<double>cx(102,0),cy(102,0);vector<int>cnt(102,0);\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){int col=og[i][j];if(!adj[col][0]){cx[col]+=i;cy[col]+=j;cnt[col]++;}}\n    for(int c=1;c<=m;c++)if(cnt[c]){cx[c]/=cnt[c];cy[c]/=cnt[c];}\n    vector<int>cidx(102,-1);vector<double>bd(102,1e18);\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){int col=og[i][j];if(!adj[col][0]){double d=(i-cx[col])*(i-cx[col])+(j-cy[col])*(j-cy[col]);if(d<bd[col]){bd[col]=d;cidx[col]=i*n+j;}}}\n    // type 0=exterior, 1=interior-non-centroid (sort by -dist desc=farthest first), 2=centroid\n    vector<pair<pair<int,double>,int>>keys;\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){\n        int idx=i*n+j,col=og[i][j];\n        if(!adj[col][0]){\n            if(cidx[col]==idx)keys.push_back({{2,0.0},idx});\n            else{double d=(i-cx[col])*(i-cx[col])+(j-cy[col])*(j-cy[col]);keys.push_back({{1,-d},idx});}\n        }else keys.push_back({{0,(double)idx},idx});\n    }\n    sort(keys.begin(),keys.end());\n    vector<int>ord;for(auto&[k,idx]:keys)ord.push_back(idx);\n    return ord;\n}\nint main(){\n    t0=steady_clock::now();ios_base::sync_with_stdio(0);cin.tie(0);\n    cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<n;j++){cin>>g[i][j];og[i][j]=g[i][j];}\n    cajad();cdep();mt19937 rng(42);\n    for(int trial=0;trial==0||tok();trial++){\n        memcpy(g,og,sizeof(g));\n        vector<int>ord(n*n);iota(ord.begin(),ord.end(),0);\n        if(trial==1)reverse(ord.begin(),ord.end());\n        else if(trial==2){for(int j2=0;j2<n;j2++)for(int i2=0;i2<n;i2++)ord[j2*n+i2]=i2*n+j2;}\n        else if(trial==3){int cx=n/2,cy=n/2;sort(ord.begin(),ord.end(),[&](int a,int b){return abs(a/n-cx)+abs(a%n-cy)>abs(b/n-cx)+abs(b%n-cy);});}\n        else if(trial==4){int cx=n/2,cy=n/2;sort(ord.begin(),ord.end(),[&](int a,int b){return abs(a/n-cx)+abs(a%n-cy)<abs(b/n-cx)+abs(b%n-cy);});}\n        else if(trial==5)ord=centroid_last_ord();\n        else shuffle(ord.begin(),ord.end(),rng);\n        run(ord);micro_opt();sv();\n    }\n    for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j)cout<<' ';cout<<bg[i][j];}cout<<'\\n';}\n}","ahc025":"#include <bits/stdc++.h>\nusing namespace std;\nint N, D, Q, q_used = 0;\nchar bq(const vector<int>& L, const vector<int>& R) {\n    cout << L.size() << \" \" << R.size();\n    for (int x : L) cout << \" \" << x;\n    for (int x : R) cout << \" \" << x;\n    cout << \"\\n\" << flush; q_used++;\n    char c; cin >> c; return c;\n}\nint slm;\nvector<int> ms(vector<int> a) {\n    if ((int)a.size() <= 1 || q_used >= slm) return a;\n    int m = a.size() / 2;\n    auto L = ms(vector<int>(a.begin(), a.begin() + m));\n    auto R = ms(vector<int>(a.begin() + m, a.end()));\n    vector<int> r; int i = 0, j = 0;\n    while (i < (int)L.size() && j < (int)R.size()) {\n        if (q_used >= slm) break;\n        if (bq({L[i]}, {R[j]}) != '>') r.push_back(L[i++]);\n        else r.push_back(R[j++]);\n    }\n    while (i < (int)L.size()) r.push_back(L[i++]);\n    while (j < (int)R.size()) r.push_back(R[j++]);\n    return r;\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(nullptr);\n    cin >> N >> D >> Q;\n    auto t0 = chrono::high_resolution_clock::now();\n    auto el = [&]() { return chrono::duration<double>(chrono::high_resolution_clock::now() - t0).count(); };\n    slm = Q / 2;\n    vector<int> ini(N); iota(ini.begin(), ini.end(), 0);\n    vector<int> ord = ms(ini);\n    vector<int> pos(N);\n    for (int i = 0; i < N; i++) pos[ord[i]] = i;\n    int est_end = Q * 4 / 5;\n    vector<double> w(N, 1.0), ps(N + 1, 0.0);\n    w[ord[0]] = 1.0; ps[1] = 1.0;\n    for (int i = 1; i < N; i++) {\n        if (q_used >= est_end) { w[ord[i]] = w[ord[i-1]]; ps[i+1] = ps[i] + w[ord[i]]; continue; }\n        int lo = 0, hi = i;\n        while (lo < hi && q_used < est_end) {\n            int mid = (lo + hi) / 2;\n            if (bq({ord[i]}, vector<int>(ord.begin(), ord.begin() + mid + 1)) == '>') lo = mid + 1;\n            else hi = mid;\n        }\n        double wlo = ps[lo], whi = (lo < i) ? ps[lo + 1] : ps[i] * 2.0;\n        w[ord[i]] = max(w[ord[i-1]], (wlo + whi) / 2.0);\n        ps[i+1] = ps[i] + w[ord[i]];\n    }\n    vector<int> oi(N); iota(oi.begin(), oi.end(), 0);\n    sort(oi.begin(), oi.end(), [&](int a, int b) { return fabs(w[a]-w[b]) > 1e-12 ? w[a] > w[b] : pos[a] > pos[b]; });\n    vector<double> gw(D, 0.0); vector<int> asgn(N, 0);\n    for (int x : oi) { int g = (int)(min_element(gw.begin(), gw.end()) - gw.begin()); asgn[x] = g; gw[g] += w[x]; }\n    double total = 0; for (double x : gw) total += x;\n    double mean = total / D;\n    for (int p = 0; p < 5000 && el() < 1.5; p++) {\n        bool imp = false;\n        for (int x = 0; x < N; x++) {\n            int g0 = asgn[x]; int bg = g0; double bd = 0, d0 = gw[g0] - mean;\n            for (int g = 0; g < D; g++) {\n                if (g == g0) continue;\n                double d1 = gw[g] - mean;\n                double dc = d0*d0 + d1*d1 - (d0-w[x])*(d0-w[x]) - (d1+w[x])*(d1+w[x]);\n                if (dc > bd) { bd = dc; bg = g; }\n            }\n            if (bg != g0) { gw[g0] -= w[x]; gw[bg] += w[x]; asgn[x] = bg; imp = true; }\n        }\n        for (int i = 0; i < N && el() < 1.45; i++) for (int j = i+1; j < N; j++) {\n            if (asgn[i] == asgn[j]) continue;\n            int g1 = asgn[i], g2 = asgn[j];\n            double d1 = gw[g1]-mean, d2 = gw[g2]-mean, d1n = d1-w[i]+w[j], d2n = d2+w[i]-w[j];\n            if (d1*d1 + d2*d2 > d1n*d1n + d2n*d2n + 1e-9) {\n                gw[g1] += w[j]-w[i]; gw[g2] += w[i]-w[j]; asgn[i] = g2; asgn[j] = g1; imp = true;\n            }\n        }\n        if (!imp) break;\n    }\n    vector<vector<int>> gi(D);\n    for (int x = 0; x < N; x++) gi[asgn[x]].push_back(x);\n    for (int g = 0; g < D; g++) sort(gi[g].begin(), gi[g].end(), [&](int a, int b){ return pos[a] < pos[b]; });\n    auto cpos = [&](int a, int b){ return pos[a] < pos[b]; };\n    // Phase 5a: cheap with verify\n    bool phase5a_made_moves = false;\n    int p5a_end = q_used + min(Q * 3 / 10, 300);\n    int no5a = 0;\n    while (q_used + 2 <= Q && q_used < p5a_end && el() < 1.85) {\n        int gh = (int)(max_element(gw.begin(), gw.end()) - gw.begin());\n        int gl = (int)(min_element(gw.begin(), gw.end()) - gw.begin());\n        if (gw[gh] <= gw[gl] + 1e-9 || gi[gh].empty() || gi[gl].empty()) break;\n        char cmp = bq(gi[gh], gi[gl]);\n        if (cmp == '=') { gw[gh] = gw[gl] = (gw[gh]+gw[gl])/2; continue; }\n        if (cmp == '<') { swap(gh, gl); swap(gw[gh], gw[gl]); }\n        auto& hv = gi[gh]; auto& lt = gi[gl];\n        if ((int)hv.size() <= 1) continue;\n        bool seq = false;\n        int lo = 0, hi = (int)hv.size() - 1;\n        while (lo < hi && q_used + 1 <= Q && el() < 1.8) {\n            int mid = (lo + hi) / 2;\n            vector<int> L2, R2 = lt;\n            for (int k = 0; k < (int)hv.size(); k++) if (k != mid) L2.push_back(hv[k]);\n            R2.push_back(hv[mid]);\n            char r = bq(L2, R2);\n            if (r == '=') { lo = hi = mid; seq = true; break; }\n            else if (r == '>') lo = mid + 1;\n            else hi = mid;\n        }\n        lo = min(lo, (int)hv.size() - 1);\n        if (lo > 0) {\n            double da = fabs((gw[gh]-w[hv[lo]])-(gw[gl]+w[hv[lo]]));\n            double db = fabs((gw[gh]-w[hv[lo-1]])-(gw[gl]+w[hv[lo-1]]));\n            if (db < da) lo--;\n        }\n        bool made = seq;\n        if (!seq && q_used + 1 <= Q) {\n            vector<int> vL, vR = lt;\n            for (int k = 0; k < (int)hv.size(); k++) if (k != lo) vL.push_back(hv[k]);\n            vR.push_back(hv[lo]);\n            if (!vL.empty()) {\n                char v = bq(vL, vR);\n                if (v == '>' || v == '=') made = true;\n                else if (v == '<' && lo > 0 && q_used + 1 <= Q) {\n                    vector<int> vL2, vR2 = lt;\n                    for (int k = 0; k < (int)hv.size(); k++) if (k != lo-1) vL2.push_back(hv[k]);\n                    vR2.push_back(hv[lo-1]);\n                    char v2 = bq(vL2, vR2);\n                    if (v2 == '>' || v2 == '=') { lo--; made = true; }\n                }\n            }\n        }\n        if (made) {\n            no5a = 0; phase5a_made_moves = true;\n            int mv = hv[lo]; asgn[mv] = gl; gw[gh] -= w[mv]; gw[gl] += w[mv];\n            hv.erase(hv.begin() + lo);\n            lt.insert(lower_bound(lt.begin(), lt.end(), mv, cpos), mv);\n        } else { if (++no5a >= 3) break; }\n    }\n    // Phase 5b: rank-list approach (initial tournament once, then cheap bubble updates)\n    if (phase5a_made_moves) {\n        // Build initial rank sorted by estimated gw\n        vector<int> grank;\n        for (int g = 0; g < D; g++) if (!gi[g].empty()) grank.push_back(g);\n        sort(grank.begin(), grank.end(), [&](int a, int b){ return gw[a] > gw[b]; });\n        // Find actual max with tournament (D-1 queries)\n        if ((int)grank.size() >= 2 && q_used + (int)grank.size() <= Q) {\n            int mxg = grank[0];\n            for (int i = 1; i < (int)grank.size() && q_used < Q; i++)\n                if (!gi[grank[i]].empty() && bq(gi[mxg], gi[grank[i]]) == '<') mxg = grank[i];\n            auto it = find(grank.begin(), grank.end(), mxg);\n            if (it != grank.begin()) { rotate(grank.begin(), it, it+1); }\n            // Find actual min (D-2 queries)\n            int mng = -1;\n            for (int i = (int)grank.size()-1; i >= 1 && q_used < Q; i--) {\n                if (gi[grank[i]].empty()) continue;\n                if (mng == -1) { mng = grank[i]; continue; }\n                if (bq(gi[mng], gi[grank[i]]) == '>') mng = grank[i];\n            }\n            if (mng != -1) {\n                auto it2 = find(grank.begin(), grank.end(), mng);\n                if (it2 != grank.end()-1) { rotate(it2, it2+1, grank.end()); }\n            }\n        }\n        int no_im = 0, eq_str = 0;\n        while ((int)grank.size() >= 2 && q_used + 8 <= Q && el() < 1.9) {\n            int gh = grank[0], gl = grank.back();\n            if (gi[gh].empty()) { grank.erase(grank.begin()); continue; }\n            if (gi[gl].empty()) { grank.pop_back(); continue; }\n            char cmp = bq(gi[gh], gi[gl]);\n            if (cmp == '=') { if (++eq_str >= 3) break; continue; }\n            eq_str = 0;\n            if (cmp == '<') { swap(grank.front(), grank.back()); gh = grank[0]; gl = grank.back(); }\n            auto& hv = gi[gh]; auto& lt = gi[gl];\n            if ((int)hv.size() <= 1) { grank.erase(grank.begin()); continue; }\n            bool se = false;\n            int lo = 0, hi = (int)hv.size()-1;\n            while (lo < hi && q_used + 1 <= Q && el() < 1.87) {\n                int mid = (lo+hi)/2;\n                vector<int> L2, R2 = lt;\n                for (int k = 0; k < (int)hv.size(); k++) if (k!=mid) L2.push_back(hv[k]);\n                R2.push_back(hv[mid]);\n                char r = bq(L2, R2);\n                if (r=='=') { lo=hi=mid; se=true; break; }\n                else if (r=='>') lo=mid+1; else hi=mid;\n            }\n            lo = min(lo, (int)hv.size()-1);\n            bool mm = se;\n            if (!se && q_used+1<=Q) {\n                vector<int> vL, vR=lt;\n                for (int k=0;k<(int)hv.size();k++) if(k!=lo) vL.push_back(hv[k]);\n                vR.push_back(hv[lo]);\n                if (!vL.empty()) {\n                    char v=bq(vL,vR);\n                    if (v=='>'||v=='=') mm=true;\n                    else if (v=='<'&&lo>0&&q_used+1<=Q) {\n                        vector<int> vL2,vR2=lt;\n                        for (int k=0;k<(int)hv.size();k++) if(k!=lo-1) vL2.push_back(hv[k]);\n                        vR2.push_back(hv[lo-1]);\n                        char v2=bq(vL2,vR2);\n                        if(v2=='>'||v2=='='){lo--;mm=true;}\n                    }\n                }\n            }\n            bool usw=false; int syi=0;\n            if (!se&&!lt.empty()) {\n                int ll=(int)(log2((double)lt.size())+2);\n                if (q_used+ll+1<=Q&&el()<1.87) {\n                    int y0=0,y1=(int)lt.size()-1; bool s2=false;\n                    while(y0<y1&&q_used+1<=Q&&el()<1.87){\n                        int ym=(y0+y1)/2;\n                        vector<int>L2,R2;\n                        for(int k=0;k<(int)hv.size();k++) if(k!=lo) L2.push_back(hv[k]);\n                        for(int k=0;k<(int)lt.size();k++) if(k!=ym) R2.push_back(lt[k]);\n                        L2.push_back(lt[ym]); R2.push_back(hv[lo]);\n                        if(L2.empty()||R2.empty()) break;\n                        char r=bq(L2,R2);\n                        if(r=='='){y0=y1=ym;s2=true;break;}\n                        else if(r=='>') y0=ym+1; else y1=ym;\n                    }\n                    if(s2){usw=true;syi=min(y0,(int)lt.size()-1);}\n                }\n            }\n            auto do_bubble=[&](){\n                for(int i=0;i+1<(int)grank.size()&&q_used+1<=Q;i++){\n                    if(gi[grank[i]].empty()||gi[grank[i+1]].empty()) break;\n                    if(bq(gi[grank[i]],gi[grank[i+1]])=='<') swap(grank[i],grank[i+1]); else break;}\n                for(int i=(int)grank.size()-1;i>0&&q_used+1<=Q;i--){\n                    if(gi[grank[i]].empty()||gi[grank[i-1]].empty()) break;\n                    if(bq(gi[grank[i]],gi[grank[i-1]])=='>') swap(grank[i],grank[i-1]); else break;}\n            };\n            if(usw){\n                int xmv=hv[lo],ymv=lt[syi];\n                asgn[xmv]=gl;asgn[ymv]=gh;\n                gw[gh]+=w[ymv]-w[xmv];gw[gl]+=w[xmv]-w[ymv];\n                hv.erase(hv.begin()+lo);lt.erase(lt.begin()+syi);\n                hv.insert(lower_bound(hv.begin(),hv.end(),ymv,cpos),ymv);\n                lt.insert(lower_bound(lt.begin(),lt.end(),xmv,cpos),xmv);\n                no_im=0; do_bubble();\n            } else if(mm){\n                int mv=hv[lo];asgn[mv]=gl;gw[gh]-=w[mv];gw[gl]+=w[mv];\n                hv.erase(hv.begin()+lo);\n                lt.insert(lower_bound(lt.begin(),lt.end(),mv,cpos),mv);\n                bool undo=false;\n                if(!se&&q_used+1<=Q&&!hv.empty()&&!lt.empty()){\n                    char post=bq(gi[gh],gi[gl]);\n                    if(post=='<'){\n                        undo=true;\n                        asgn[mv]=gh;gw[gh]+=w[mv];gw[gl]-=w[mv];\n                        auto it=lower_bound(lt.begin(),lt.end(),mv,cpos);\n                        if(it!=lt.end()&&*it==mv) lt.erase(it);\n                        hv.insert(lower_bound(hv.begin(),hv.end(),mv,cpos),mv);\n                    }\n                }\n                if(!undo){no_im=0; do_bubble();}\n                else{if(++no_im>=3) break;}\n            } else{if(++no_im>=3) break;}\n        }\n    }\n    while(q_used<Q) bq({0},{1});\n    for(int i=0;i<N;i++) cout<<asgn[i]<<\" \\n\"[i==N-1];\n    cout.flush();\n    return 0;\n}","ahc026":"#include <bits/stdc++.h>\nusing namespace std;\nint n, m;\nlong long run_algo(int mode, long long noise, vector<vector<int>> stacks, vector<int> stk, vector<int> pidx, vector<int> sm, vector<pair<int,int>>& ops, mt19937_64& rng) {\n    bool psfx = (mode <= 1), pat = (mode==1||mode==3);\n    ops.clear(); long long energy = 0;\n    auto recomp = [&](int t){ sm[t]=stacks[t].empty()?n+1:*min_element(stacks[t].begin(),stacks[t].end()); };\n    for (int v = 1; v <= n; v++) {\n        int s = stk[v], j = pidx[v];\n        while ((int)stacks[s].size() > j+1) {\n            int re=(int)stacks[s].size()-1, rs=re;\n            while (rs>j+1&&stacks[s][rs-1]>stacks[s][rs]) rs--;\n            int fu1=stacks[s][rs], ars=rs, bt=-1;\n            if (psfx) {\n                for (int sp=rs; sp<=re&&bt==-1; sp++) {\n                    int u1c=stacks[s][sp]; long long bs=LLONG_MIN; int bk=-1;\n                    for (int t=0;t<m;t++) { if(t==s)continue;\n                        long long tt=stacks[t].empty()?(n+1):(long long)stacks[t].back();\n                        long long mt=stacks[t].empty()?(n+1):(long long)sm[t];\n                        if(tt>u1c&&mt>u1c){ long long sc=(long long)n-tt; if(noise>0)sc+=(long long)(rng()%(2*noise+1))-noise; if(sc>bs){bs=sc;bk=t;} } }\n                    if(bk!=-1){ars=sp;bt=bk;}\n                }\n            }\n            if (bt==-1) {\n                long long best=LLONG_MIN;\n                for (int t=0;t<m;t++) { if(t==s)continue;\n                    bool emp=stacks[t].empty(); long long tt=emp?0:stacks[t].back(), mt=emp?(n+1):sm[t]; long long sc;\n                    if(!pat){ if(emp)sc=2LL*n*n; else if(tt>fu1)sc=(mt>fu1)?3LL*n*n+(n-tt):n*n+mt; else sc=mt-(long long)n*n; }\n                    else{ if(emp)sc=(long long)n; else if(tt>fu1)sc=2LL*n*n+(n-tt); else sc=tt-(long long)n*n; }\n                    if(noise>0)sc+=(long long)(rng()%(2*noise+1))-noise;\n                    if(sc>best){best=sc;bt=t;} }\n            }\n            energy+=(re-ars+1)+1; ops.push_back({stacks[s][ars],bt+1});\n            int nb=(int)stacks[bt].size(), oz=(int)stacks[s].size();\n            for(int p=ars;p<oz;p++){ int b=stacks[s][p]; stacks[bt].push_back(b); stk[b]=bt; pidx[b]=nb+(p-ars); sm[bt]=min(sm[bt],b); }\n            stacks[s].resize(ars); recomp(s);\n        }\n        ops.push_back({v,0}); stacks[s].pop_back(); recomp(s);\n    }\n    return energy;\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    cin>>n>>m; int h=n/m;\n    vector<vector<int>> is(m,vector<int>(h)); vector<int> ist(n+1),ip(n+1),ism(m,n+1);\n    for(int i=0;i<m;i++){ for(int j=0;j<h;j++){cin>>is[i][j];ist[is[i][j]]=i;ip[is[i][j]]=j;} ism[i]=*min_element(is[i].begin(),is[i].end()); }\n    long long be=LLONG_MAX; vector<pair<int,int>> bops; mt19937_64 rng(0);\n    for(int mode=0;mode<4;mode++){ mt19937_64 d(0); vector<pair<int,int>> ops; long long e=run_algo(mode,0,is,ist,ip,ism,ops,d); if(e<be){be=e;bops=ops;} }\n    for(int mode=0;mode<4;mode++){ for(int seed=0;seed<24;seed++){\n        rng.seed((uint64_t)(mode*1000+seed)*6364136223846793005ULL+1442695040888963407ULL);\n        vector<pair<int,int>> ops; long long e=run_algo(mode,2000,is,ist,ip,ism,ops,rng);\n        if(e<be){be=e;bops=ops;} } }\n    for(auto[v,i]:bops) cout<<v<<\" \"<<i<<\"\\n\";\n    return 0;\n}","ahc027":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=41,MAXC=1601,BUD=100000;\nint N,n;bool hw[MAXN][MAXN],vw[MAXN][MAXN];int dv[MAXN][MAXN];\nconst int DI[]={0,1,0,-1},DJ[]={1,0,-1,0};const char DC[]=\"RDLU\";\nint C(int i,int j){return i*N+j;}int RI(int c){return c/N;}int RJ(int c){return c%N;}\nbool OK(int i,int j,int d){int ni=i+DI[d],nj=j+DJ[d];if(ni<0||ni>=N||nj<0||nj>=N)return false;if(d==0)return!vw[i][j];if(d==1)return!hw[i][j];if(d==2)return!vw[i][nj];return!hw[ni][j];}\nshort AP[MAXC][MAXC];int AF[MAXC][MAXC];\nvoid bfs(int s){memset(AP[s],0xFF,n*sizeof(short));int fs[MAXC];AP[s][s]=0;fs[s]=s;static int q[MAXC];int h=0,tail=0;q[tail++]=s;while(h<tail){int u=q[h++];for(int d=0;d<4;d++)if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(AP[s][v]<0){AP[s][v]=AP[s][u]+1;fs[v]=(u==s)?v:fs[u];q[tail++]=v;}}}for(int i=0;i<n;i++)AF[s][i]=(i==s)?s:fs[i];}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N;n=N*N;\n    for(int i=0;i<N-1;i++){string s;cin>>s;for(int j=0;j<N;j++)hw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N-1;j++)vw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>dv[i][j];\n    for(int s=0;s<n;s++)bfs(s);\n    short D_home[MAXC];for(int c=0;c<n;c++)D_home[c]=AP[c][0];\n    string route;route.reserve(BUD+10);\n    vector<int> lv(n,0);int pos=0,t=0;\n    {vector<bool> vis(n,false);vis[0]=true;vector<pair<int,int>> stk;stk.reserve(n);stk.push_back({0,0});\n    while(!stk.empty()){int u=stk.back().first;int&nd=stk.back().second;bool found=false;\n    while(nd<4){int d=nd++;if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(!vis[v]){route+=DC[d];t++;pos=v;lv[v]=t;vis[v]=true;stk.push_back({v,0});found=true;break;}}}\n    if(!found){stk.pop_back();if(!stk.empty()){int par=stk.back().first;for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==par){route+=DC[d];t++;pos=par;lv[par]=t;break;}}}};}\n    for(int c=0;c<n;c++)lv[c]=t;\n    float sqd[MAXC];for(int c=0;c<n;c++)sqd[c]=sqrtf((float)dv[RI(c)][RJ(c)]);\n    int committed=-1,sr=0;\n    while(t+(int)D_home[pos]+2<=BUD){\n        bool rrt=(committed<0)||(pos==committed)||(sr>=20);\n        if(!rrt&&t+(int)AP[pos][committed]+(int)D_home[committed]+2>BUD)rrt=true;\n        if(rrt){\n            const short*Ap=AP[pos];int best=-1;float bu=0.0f;\n            for(int c=0;c<n;c++){if(c==pos)continue;int dc=(int)Ap[c];if(t+dc+(int)D_home[c]+2>BUD)continue;\n                // Age-at-arrival: estimate dirtiness when we actually arrive\n                float u=sqd[c]*(float)(t+dc-lv[c]+1)/sqrtf((float)dc+1.0f);\n                if(u>bu){bu=u;best=c;}}\n            committed=best;sr=0;if(committed<0)break;}\n        int nx=AF[pos][committed];bool moved=false;\n        for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;sr++;lv[pos]=t;moved=true;break;}\n        if(!moved)break;}\n    while(pos!=0){int nx=AF[pos][0];for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;break;}}\n    cout<<route<<\"\\n\";return 0;}","ahc028":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,si,sj;\nvector<string> targets;\nvector<pair<int,int>> charPos[26];\nint ovM[200][200],tCI[200][200],EV[200][200];\nfloat amd[26][26],tC[200][200];\nconst int SCALE=100,OV_W=350;\nvoid computeAll(){\n    for(int i=0;i<M;i++)for(int j=0;j<M;j++){if(i==j){ovM[i][j]=0;continue;}ovM[i][j]=0;for(int k=4;k>=1;k--){bool ok=true;for(int l=0;l<k&&ok;l++)if(targets[i][5-k+l]!=targets[j][l])ok=false;if(ok){ovM[i][j]=k;break;}}}\n    for(int c1=0;c1<26;c1++)for(int c2=0;c2<26;c2++){if(charPos[c1].empty()){amd[c1][c2]=0;continue;}float tot=0;for(auto&[r1,cc1]:charPos[c1]){int md=28;for(auto&[r2,cc2]:charPos[c2])md=min(md,abs(r1-r2)+abs(cc1-cc2));tot+=md;}amd[c1][c2]=tot/(float)charPos[c1].size();}\n    for(int i=0;i<M;i++)for(int j=0;j<M;j++){int ov=ovM[i][j],prev=targets[i][4]-'A';float cost=0;for(int k=ov;k<5;k++){int next=targets[j][k]-'A';cost+=amd[prev][next]+1;prev=next;}tC[i][j]=cost;}\n    for(int i=0;i<M;i++)for(int j=0;j<M;j++){tCI[i][j]=(int)(tC[i][j]*SCALE+0.5f);EV[i][j]=ovM[i][j]*OV_W-tCI[i][j];}\n}\nint permCS(const vector<int>&p){int s=0;for(int i=1;i<(int)p.size();i++)s+=EV[p[i-1]][p[i]];return s;}\nvector<int> greedyP(int s){vector<bool> used(M,false);vector<int> p;p.reserve(M);p.push_back(s);used[s]=true;while((int)p.size()<M){int last=p.back(),best=-1,bcs=INT_MIN;for(int j=0;j<M;j++)if(!used[j]&&EV[last][j]>bcs){bcs=EV[last][j];best=j;}p.push_back(best);used[best]=true;}return p;}\nint swapCG(const vector<int>&p,int i,int j){int m=p.size(),a=p[i],b=p[j],cg=0;if(i>0)cg+=EV[p[i-1]][b]-EV[p[i-1]][a];if(j<m-1)cg+=EV[a][p[j+1]]-EV[b][p[j+1]];if(j==i+1)cg+=EV[b][a]-EV[a][b];else{if(i<m-1)cg+=EV[b][p[i+1]]-EV[a][p[i+1]];if(j>0)cg+=EV[p[j-1]][a]-EV[p[j-1]][b];}return cg;}\nbool swapOpt(vector<int>&p){int m=p.size(),bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=swapCG(p,i,j);if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;swap(p[bi],p[bj]);return true;}\nbool orOpt(vector<int>&p){int m=p.size(),bg=0,bk=-1,bp=-1;for(int k=0;k<m;k++){int x=p[k];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=k)rest.push_back(p[i]);int lo=(k>0)?EV[p[k-1]][x]:0,ro=(k<m-1)?EV[x][p[k+1]]:0;int bo=(k>0&&k<m-1)?EV[p[k-1]][p[k+1]]:0,rc=lo+ro-bo;for(int q=0;q<=(int)rest.size();q++){int nl=(q>0)?EV[rest[q-1]][x]:0,nr=(q<(int)rest.size())?EV[x][rest[q]]:0;int nb=(q>0&&q<(int)rest.size())?EV[rest[q-1]][rest[q]]:0;int g=(nl+nr-nb)-rc;if(g>bg){bg=g;bk=k;bp=q;}}}if(bk==-1)return false;int x=p[bk];vector<int> rest;rest.reserve(m-1);for(int i=0;i<m;i++)if(i!=bk)rest.push_back(p[i]);rest.insert(rest.begin()+bp,x);p=rest;return true;}\nbool revOpt(vector<int>&p){int m=p.size();if(m<2)return false;vector<int> cd(m-1),cp(m,0);for(int k=0;k<m-1;k++)cd[k]=EV[p[k+1]][p[k]]-EV[p[k]][p[k+1]];for(int k=0;k<m-1;k++)cp[k+1]=cp[k]+cd[k];int bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=cp[j]-cp[i];if(i>0)g+=EV[p[i-1]][p[j]]-EV[p[i-1]][p[i]];if(j<m-1)g+=EV[p[i]][p[j+1]]-EV[p[j]][p[j+1]];if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;reverse(p.begin()+bi,p.begin()+bj+1);return true;}\nvoid localS(vector<int>&p,int maxP=1000){bool imp=true;int pass=0;while(imp&&pass<maxP){imp=false;pass++;if(swapOpt(p))imp=true;if(orOpt(p))imp=true;if(revOpt(p))imp=true;}}\nvoid dblBridge(vector<int>&p,mt19937&rng){int m=p.size();if(m<4)return;uniform_int_distribution<int> d(1,m-1);int a,b,c;do{a=d(rng);b=d(rng);c=d(rng);}while(a==b||b==c||a==c);if(a>b)swap(a,b);if(b>c)swap(b,c);if(a>b)swap(a,b);vector<int> np;np.reserve(m);for(int i=0;i<a;i++)np.push_back(p[i]);for(int i=b;i<c;i++)np.push_back(p[i]);for(int i=a;i<b;i++)np.push_back(p[i]);for(int i=c;i<m;i++)np.push_back(p[i]);p=np;}\nstring buildStr(const vector<int>&p){string s=targets[p[0]];for(int i=1;i<(int)p.size();i++)s+=targets[p[i]].substr(ovM[p[i-1]][p[i]]);return s;}\npair<vector<pair<int,int>>,int> dpSolve(const string&s){\n    int L=s.size(),G=N*N;const int INF=1e9;vector<int> dp((L+1)*G,INF),prv((L+1)*G,-1);dp[si*N+sj]=0;\n    for(int i=0;i<L;i++){int c=s[i]-'A',base=i*G,nb=(i+1)*G;for(int p=0;p<G;p++){int val=dp[base+p];if(val==INF)continue;int r=p/N,cc=p%N;for(auto&[nr,nc]:charPos[c]){int np=nr*N+nc,cost=val+abs(r-nr)+abs(cc-nc)+1;if(cost<dp[nb+np]){dp[nb+np]=cost;prv[nb+np]=p;}}}}\n    int bc=INF,bp=-1,lb=L*G;for(int p=0;p<G;p++)if(dp[lb+p]<bc){bc=dp[lb+p];bp=p;}\n    vector<pair<int,int>> path(L);int pos=bp;for(int i=L;i>=1;i--){path[i-1]={pos/N,pos%N};pos=prv[i*G+pos];}\n    return{path,bc};\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    auto t0=chrono::steady_clock::now();\n    auto ms=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    cin>>N>>M>>si>>sj;\n    for(int i=0;i<N;i++){string row;cin>>row;for(int j=0;j<N;j++)charPos[row[j]-'A'].push_back({i,j});}\n    targets.resize(M);for(int i=0;i<M;i++)cin>>targets[i];\n    computeAll();\n    vector<pair<int,vector<int>>> cands;\n    for(int s=0;s<M;s++){auto p=greedyP(s);cands.push_back({permCS(p),p});}\n    sort(cands.rbegin(),cands.rend());\n    // Phase 1: Quick DP evaluation of top-K greedy starts to find best actual starting basin\n    const int TOP_K=10;\n    vector<int> best;vector<pair<int,int>> bestPath;int bestT=INT_MAX;\n    for(int k=0;k<TOP_K;k++){\n        auto p=cands[k].second;\n        auto[path,T]=dpSolve(buildStr(p));\n        if(T<bestT){bestT=T;best=p;bestPath=path;}\n    }\n    // Phase 2: Full local search on DP-best, re-evaluate\n    localS(best);\n    auto[path2,T2]=dpSolve(buildStr(best));\n    if(T2<bestT){bestT=T2;bestPath=path2;}\n    // Phase 3: ILS with double-bridge + actual DP acceptance\n    mt19937 rng(42);\n    while(ms()<1700){\n        auto cur=best;\n        dblBridge(cur,rng);\n        localS(cur,15);\n        auto[curPath,curT]=dpSolve(buildStr(cur));\n        if(curT<bestT){bestT=curT;best=cur;bestPath=curPath;}\n    }\n    for(auto&[r,c]:bestPath)cout<<r<<\" \"<<c<<\"\\n\";\n    return 0;\n}","ahc030":"#include <cstdio>\n#include <cmath>\n#include <vector>\n#include <set>\n#include <algorithm>\n#include <random>\nusing namespace std;\ntypedef pair<int,int> pii;\nint main(){\n    int N,M,MAX_OPS,ops=0;double eps,coef;\n    scanf(\"%d%d%lf\",&N,&M,&eps);MAX_OPS=2*N*N;coef=1.0-2.0*eps;\n    struct Oil{int hi,hj;vector<pii>cells,pos;vector<int>rp,cp;};\n    vector<Oil>F(M);\n    for(int k=0;k<M;k++){\n        int d;scanf(\"%d\",&d);F[k].cells.resize(d);F[k].hi=F[k].hj=0;\n        for(int t=0;t<d;t++){scanf(\"%d%d\",&F[k].cells[t].first,&F[k].cells[t].second);F[k].hi=max(F[k].hi,F[k].cells[t].first);F[k].hj=max(F[k].hj,F[k].cells[t].second);}\n        F[k].rp.assign(F[k].hi+1,0);F[k].cp.assign(F[k].hj+1,0);\n        for(auto&c:F[k].cells){F[k].rp[c.first]++;F[k].cp[c.second]++;}\n        for(int di=0;di+F[k].hi<N;di++)for(int dj=0;dj+F[k].hj<N;dj++)F[k].pos.push_back({di,dj});\n    }\n    vector<vector<double>>prob(M);\n    for(int k=0;k<M;k++){int sz=(int)F[k].pos.size();prob[k].assign(sz>0?sz:1,sz>0?1.0/sz:1.0);}\n    vector<vector<int>>drld(N,vector<int>(N,-1));\n    vector<double>robs(N,0),cobs(N,0);int nrr=0,nrc=0;\n    auto qdiv=[&](const vector<pii>&c)->double{ops++;printf(\"q %d\",(int)c.size());for(auto&p:c)printf(\" %d %d\",p.first,p.second);printf(\"\\n\");fflush(stdout);int v;scanf(\"%d\",&v);return(double)v;};\n    auto qdrl=[&](int i,int j)->int{ops++;printf(\"q 1 %d %d\\n\",i,j);fflush(stdout);int v;scanf(\"%d\",&v);drld[i][j]=v;return v;};\n    auto qans=[&](const vector<pii>&oil)->bool{ops++;printf(\"a %d\",(int)oil.size());for(auto&p:oil)printf(\" %d %d\",p.first,p.second);printf(\"\\n\");fflush(stdout);int r;scanf(\"%d\",&r);return r==1;};\n    auto run_mf=[&](int nit){\n        if(!nrr&&!nrc)return;\n        double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n        vector<double>tmr(N,0),tmc(N,0);\n        for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(int r=0;r<=F[k].hi;r++)tmr[di+r]+=pp*F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)tmc[dj+c2]+=pp*F[k].cp[c2];}}\n        for(int it=0;it<nit;it++)for(int k=0;k<M;k++){\n            int np=(int)F[k].pos.size();if(!np)continue;\n            vector<double>kmr(N,0),kmc(N,0);\n            for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)kmc[dj+c2]+=pp*F[k].cp[c2];}\n            for(int i=0;i<N;i++)tmr[i]-=kmr[i];for(int j=0;j<N;j++)tmc[j]-=kmc[j];\n            vector<vector<double>>drow(N,vector<double>(F[k].hi+1,0)),dcol(N,vector<double>(F[k].hj+1,0));\n            for(int i=0;i<N;i++){double be=(double)nrr*(N*eps+tmr[i]*coef),bd=robs[i]-be;for(int r=0;r<=F[k].hi;r++){double e=(double)nrr*(N*eps+(F[k].rp[r]+tmr[i])*coef),d=robs[i]-e;drow[i][r]=(-d*d+bd*bd)/(2*vr);}}\n            for(int j=0;j<N;j++){double be=(double)nrc*(N*eps+tmc[j]*coef),bd=cobs[j]-be;for(int c2=0;c2<=F[k].hj;c2++){double e=(double)nrc*(N*eps+(F[k].cp[c2]+tmc[j])*coef),d=cobs[j]-e;dcol[j][c2]=(-d*d+bd*bd)/(2*vc);}}\n            vector<double>op2=prob[k],ll(np,0.0);double mx=-1e300;\n            for(int p=0;p<np;p++){int di=F[k].pos[p].first,dj=F[k].pos[p].second;double lp=0;for(int r=0;r<=F[k].hi;r++)lp+=drow[di+r][r];for(int c2=0;c2<=F[k].hj;c2++)lp+=dcol[dj+c2][c2];ll[p]=lp;if(lp>mx)mx=lp;}\n            double s=0;for(int p=0;p<np;p++){prob[k][p]=exp(ll[p]-mx);s+=prob[k][p];}\n            if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;else prob[k]=op2;\n            fill(kmr.begin(),kmr.end(),0);fill(kmc.begin(),kmc.end(),0);\n            for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)kmc[dj+c2]+=pp*F[k].cp[c2];}\n            for(int i=0;i<N;i++)tmr[i]+=kmr[i];for(int j=0;j<N;j++)tmc[j]+=kmc[j];\n        }\n    };\n    auto apply_hard=[&](){\n        for(int k=0;k<M;k++){int np=(int)F[k].pos.size();bool ch=false;\n            for(int p=0;p<np;p++){if(prob[k][p]<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells){if(drld[di+c.first][dj+c.second]==0){prob[k][p]=0;ch=true;break;}}}\n            if(ch){double s=0;for(double pp:prob[k])s+=pp;if(s>1e-15)for(double&pp:prob[k])pp/=s;else fill(prob[k].begin(),prob[k].end(),1.0/max(1,(int)prob[k].size()));}\n        }\n    };\n    auto get_oil=[&]()->vector<vector<double>>{\n        vector<vector<double>>noc(N,vector<double>(N,1.0));\n        for(int k=0;k<M;k++){vector<vector<double>>cvk(N,vector<double>(N,0.0));int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-12)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells)cvk[di+c.first][dj+c.second]+=pp;}for(int i=0;i<N;i++)for(int j=0;j<N;j++)noc[i][j]*=max(0.0,1.0-cvk[i][j]);}\n        vector<vector<double>>op(N,vector<double>(N,0));for(int i=0;i<N;i++)for(int j=0;j<N;j++)op[i][j]=1-noc[i][j];return op;\n    };\n    auto make_g=[&](const vector<vector<double>>&op,double thr=0.5)->vector<pii>{\n        vector<pii>r;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(drld[i][j]>0||(drld[i][j]<0&&op[i][j]>thr))r.push_back({i,j});return r;\n    };\n    auto shape_q=[&](int k)->bool{\n        if(ops>=MAX_OPS-5)return false;\n        int np=(int)F[k].pos.size();if(!np)return false;\n        int p1=0;for(int p=1;p<np;p++)if(prob[k][p]>prob[k][p1])p1=p;\n        if(prob[k][p1]>0.98)return false;\n        int p2=-1;for(int p=0;p<np;p++)if(p!=p1&&(p2<0||prob[k][p]>prob[k][p2]))p2=p;\n        int di1=F[k].pos[p1].first,dj1=F[k].pos[p1].second;\n        set<pii>Ss;\n        if(p2>=0){set<pii>c2;int di2=F[k].pos[p2].first,dj2=F[k].pos[p2].second;for(auto&c:F[k].cells)c2.insert({di2+c.first,dj2+c.second});for(auto&c:F[k].cells){pii cc={di1+c.first,dj1+c.second};if(cc.first>=0&&cc.first<N&&cc.second>=0&&cc.second<N&&!c2.count(cc))Ss.insert(cc);}}\n        if((int)Ss.size()<2){Ss.clear();for(auto&c:F[k].cells){pii cc={di1+c.first,dj1+c.second};if(cc.first>=0&&cc.first<N&&cc.second>=0&&cc.second<N)Ss.insert(cc);}}\n        if((int)Ss.size()<2)return false;\n        vector<pii>S(Ss.begin(),Ss.end());\n        vector<char>Sm(N*N,0);for(auto&p:S)Sm[p.first*N+p.second]=1;\n        vector<int>ovl(np,0);\n        for(int p=0;p<np;p++){int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells){int i=di+c.first,j=dj+c.second;if(i>=0&&i<N&&j>=0&&j<N&&Sm[i*N+j])ovl[p]++;}}\n        double omega=0;\n        for(int m=0;m<M;m++){if(m==k)continue;for(int p=0;p<(int)F[m].pos.size();p++){double pp=prob[m][p];if(pp<1e-12)continue;int di=F[m].pos[p].first,dj=F[m].pos[p].second;for(auto&c:F[m].cells){int i=di+c.first,j=dj+c.second;if(i>=0&&i<N&&j>=0&&j<N&&Sm[i*N+j])omega+=pp;}}}\n        double y=qdiv(S),sz=(double)S.size(),vq=max(1e-9,sz*eps*(1-eps));\n        double mx2=-1e300;vector<double>ll2(np);\n        for(int p=0;p<np;p++){double mu=sz*eps+((double)ovl[p]+omega)*coef,d=y-mu;ll2[p]=-d*d/(2*vq);if(ll2[p]>mx2)mx2=ll2[p];}\n        if(mx2>-1e290){double s=0;for(int p=0;p<np;p++){prob[k][p]*=(ll2[p]>mx2-500)?exp(ll2[p]-mx2):0.0;s+=prob[k][p];}if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;else fill(prob[k].begin(),prob[k].end(),1.0/np);}\n        return true;\n    };\n    auto entropy=[&](int k)->double{double H=0;for(double p:prob[k])if(p>1e-12)H-=p*log(p);return H;};\n    // SA: find best joint assignment minimizing row/col residuals\n    auto find_best=[&](int n_restarts,int nit)->vector<int>{\n        if(!nrr&&!nrc){vector<int>st(M);for(int k=0;k<M;k++){int p1=0;for(int p=1;p<(int)F[k].pos.size();p++)if(prob[k][p]>prob[k][p1])p1=p;st[k]=p1;}return st;}\n        double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n        auto cE=[&](const vector<double>&er,const vector<double>&ec)->double{\n            double E=0;for(int i=0;i<N;i++){double d=robs[i]-nrr*(N*eps+er[i]*coef);E+=d*d/(2*vr);}for(int j=0;j<N;j++){double d=cobs[j]-nrc*(N*eps+ec[j]*coef);E+=d*d/(2*vc);}return E;\n        };\n        // Precompute valid positions (not covering any v=0 drilled cell)\n        vector<vector<int>>vps(M);\n        for(int k=0;k<M;k++){for(int p=0;p<(int)F[k].pos.size();p++){int di=F[k].pos[p].first,dj=F[k].pos[p].second;bool ok=true;for(auto&c:F[k].cells)if(drld[di+c.first][dj+c.second]==0){ok=false;break;}if(ok)vps[k].push_back(p);}if(vps[k].empty())for(int p=0;p<(int)F[k].pos.size();p++)vps[k].push_back(p);}\n        mt19937 rng(42);\n        uniform_real_distribution<double>ur(0,1);\n        vector<int>gbest(M,0);double gbest_E=1e300;\n        for(int restart=0;restart<n_restarts;restart++){\n            vector<int>state(M);\n            if(restart==0){for(int k=0;k<M;k++){int p1=0;for(int p=1;p<(int)F[k].pos.size();p++)if(prob[k][p]>prob[k][p1])p1=p;state[k]=p1;}}\n            else{for(int k=0;k<M;k++){auto&vp=vps[k];int nv=(int)vp.size();double r2=ur(rng),cum=0;state[k]=vp[nv-1];for(int pi=0;pi<nv;pi++){cum+=prob[k][vp[pi]];if(cum>=r2){state[k]=vp[pi];break;}}}}\n            // Validate: ensure initial state is valid\n            for(int k=0;k<M;k++){auto&vp=vps[k];bool ok=false;for(int p:vp)if(p==state[k])ok=true;if(!ok&&!vp.empty())state[k]=vp[0];}\n            vector<double>er(N,0),ec(N,0);\n            for(int k=0;k<M;k++){int di=F[k].pos[state[k]].first,dj=F[k].pos[state[k]].second;for(int r=0;r<=F[k].hi;r++)er[di+r]+=F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)ec[dj+c2]+=F[k].cp[c2];}\n            double cur_E=cE(er,ec);\n            vector<int>best=state;double best_E=cur_E;\n            for(int it=0;it<nit;it++){\n                if(it%10000==0){// Periodic exact recompute to avoid float errors\n                    fill(er.begin(),er.end(),0);fill(ec.begin(),ec.end(),0);\n                    for(int k=0;k<M;k++){int di=F[k].pos[state[k]].first,dj=F[k].pos[state[k]].second;for(int r=0;r<=F[k].hi;r++)er[di+r]+=F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)ec[dj+c2]+=F[k].cp[c2];}\n                    cur_E=cE(er,ec);\n                }\n                double T=5.0*exp(-6.0*it/nit)+0.01;\n                int k=rng()%M;auto&vp=vps[k];int nv=(int)vp.size();if(nv<=1)continue;\n                int new_p=vp[rng()%nv],old_p=state[k];if(new_p==old_p)continue;\n                int doi=F[k].pos[old_p].first,doj=F[k].pos[old_p].second,dni=F[k].pos[new_p].first,dnj=F[k].pos[new_p].second;\n                for(int r=0;r<=F[k].hi;r++){er[doi+r]-=F[k].rp[r];er[dni+r]+=F[k].rp[r];}\n                for(int c2=0;c2<=F[k].hj;c2++){ec[doj+c2]-=F[k].cp[c2];ec[dnj+c2]+=F[k].cp[c2];}\n                double new_E=cE(er,ec),dE=new_E-cur_E;\n                bool accept=(dE<=0)||ur(rng)<exp(-dE/T);\n                if(accept){state[k]=new_p;cur_E=new_E;if(cur_E<best_E){best_E=cur_E;best=state;}}\n                else{for(int r=0;r<=F[k].hi;r++){er[doi+r]+=F[k].rp[r];er[dni+r]-=F[k].rp[r];}for(int c2=0;c2<=F[k].hj;c2++){ec[doj+c2]+=F[k].cp[c2];ec[dnj+c2]-=F[k].cp[c2];}}\n            }\n            if(best_E<gbest_E){gbest_E=best_E;gbest=best;}\n        }\n        return gbest;\n    };\n    auto sa_guess=[&](const vector<int>&state)->vector<pii>{\n        set<pii>oil_set;\n        for(int k=0;k<M;k++){int di=F[k].pos[state[k]].first,dj=F[k].pos[state[k]].second;for(auto&c:F[k].cells){int i=di+c.first,j=dj+c.second;if(drld[i][j]!=0)oil_set.insert({i,j});}}\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(drld[i][j]>0)oil_set.insert({i,j});\n        return vector<pii>(oil_set.begin(),oil_set.end());\n    };\n    // Phase 1: Row/col queries\n    int nr=(eps>=0.15)?3:(eps>=0.08)?2:1;\n    for(int rep=0;rep<nr&&ops+2*N<=MAX_OPS-N*N-5;rep++){\n        for(int i=0;i<N;i++){vector<pii>c;for(int j=0;j<N;j++)c.push_back({i,j});robs[i]+=qdiv(c);}nrr++;\n        for(int j=0;j<N;j++){vector<pii>c;for(int i=0;i<N;i++)c.push_back({i,j});cobs[j]+=qdiv(c);}nrc++;\n    }\n    run_mf(200);\n    // Phase 2: Shape queries\n    {int qb=min(40,max(0,MAX_OPS-ops-N*N-5));for(int q=0;q<qb&&ops<MAX_OPS-N*N-3;q++){int bk=0;double be=entropy(0);for(int k=1;k<M;k++){double h=entropy(k);if(h>be){be=h;bk=k;}}if(be<0.05)break;if(!shape_q(bk))break;run_mf(10);}}\n    apply_hard();run_mf(100);\n    // Phase 3: SA + first guess\n    {auto bs=find_best(5,150000);auto g=sa_guess(bs);if(ops<MAX_OPS&&qans(g))return 0;}\n    // Phase 4: Targeted drilling + SA + second guess\n    {\n        auto op=get_oil();\n        while(ops<MAX_OPS-3){\n            int bi=-1,bj=-1;double bu=0;\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(drld[i][j]>=0)continue;double u=min(op[i][j],1.0-op[i][j]);if(u>bu){bu=u;bi=i;bj=j;}}\n            if(bi<0||bu<0.1)break;\n            qdrl(bi,bj);\n            if(drld[bi][bj]==0){for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){if(prob[k][p]<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells)if(di+c.first==bi&&dj+c.second==bj){prob[k][p]=0;break;}}double s=0;for(double pp:prob[k])s+=pp;if(s>1e-15)for(double&pp:prob[k])pp/=s;else fill(prob[k].begin(),prob[k].end(),1.0/max(1,(int)prob[k].size()));}}\n            run_mf(5);op=get_oil();\n        }\n        apply_hard();run_mf(20);\n        auto bs=find_best(3,70000);auto g=sa_guess(bs);\n        if(ops<MAX_OPS&&qans(g))return 0;\n    }\n    // Phase 5: Drill all remaining + final guess\n    for(int i=0;i<N&&ops<MAX_OPS-2;i++)for(int j=0;j<N&&ops<MAX_OPS-2;j++)if(drld[i][j]<0)qdrl(i,j);\n    if(ops<MAX_OPS){auto op=get_oil();auto g=make_g(op);qans(g);}\n    return 0;\n}","ahc031":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef tuple<ll,int,int> T3;\nint W,D,N;\nvector<vector<int>>a;\nstruct CS{\nint s0,st,nc,cw;\nint r(int d,int k)const{return a[d][s0+k*st];}\nvector<int>ch(const vector<int>&days)const{\n    vector<int>h(nc,1);\n    auto be=[&](int k,int cur)->ll{ll b=0;for(int d:days){int df=r(d,k)-cur*cw;if(df>0)b+=(ll)min(cw,df);}return b;};\n    priority_queue<T3>pq;\n    for(int k=0;k<nc;k++){ll b=be(k,1);if(b>0)pq.push({b,k,1});}\n    for(int rem=W-nc;rem>0&&!pq.empty();){auto[b,kk,cu]=pq.top();pq.pop();if(b<=0)break;h[kk]++;rem--;ll nb=be(kk,h[kk]);if(nb>0)pq.push({nb,kk,h[kk]});}\n    sort(h.begin(),h.end());\n    {int s=0;for(int x:h)s+=x;if(s<W&&!h.empty())h.back()+=(W-s);}\n    return h;\n}\nll ac(int d,const vector<int>&h)const{ll c=0;for(int k=0;k<nc;k++){int df=r(d,k)-h[k]*cw;if(df>0)c+=(ll)df*100;}return c;}\nset<int>gb(const vector<int>&arr)const{set<int>S;int y=0;for(int i=0;i+1<(int)arr.size();i++){y+=arr[i];S.insert(y);}return S;}\nll bd(const set<int>&A,const set<int>&B)const{ll c=0;for(int x:A)if(!B.count(x))c++;for(int x:B)if(!A.count(x))c++;return c*(ll)cw;}\nvector<int>ag(const vector<int>&h,const set<int>&t)const{\n    vector<int>tg(t.begin(),t.end());multiset<int>av(h.begin(),h.end());\n    vector<int>arr;int S=0,j=0,nt=(int)tg.size();\n    while(!av.empty()){while(j<nt&&S>=tg[j])j++;if(j>=nt){for(int x:av)arr.push_back(x);break;}\n        int nd=tg[j]-S;auto it=av.find(nd);\n        if(it!=av.end()){arr.push_back(nd);S+=nd;av.erase(it);j++;}\n        else{auto ub=av.upper_bound(nd);\n            if(ub!=av.begin()){--ub;arr.push_back(*ub);S+=*ub;av.erase(ub);while(j<nt&&S>=tg[j])j++;}\n            else{it=av.begin();arr.push_back(*it);S+=*it;av.erase(it);while(j<nt&&S>=tg[j])j++;}\n        }\n    }return arr;\n}\nvector<int>hc(vector<int>arr,const set<int>&t)const{\n    if(t.empty()||(int)arr.size()<=1)return arr;\n    int n2=arr.size();vector<int>ps(n2+1,0);for(int i=0;i<n2;i++)ps[i+1]=ps[i]+arr[i];\n    bool im=true;while(im){im=false;\n        for(int i=0;i<n2-1;i++)for(int j=i+1;j<n2;j++){if(arr[i]==arr[j])continue;\n            int dl=arr[j]-arr[i],g=0;for(int k=i+1;k<=j;k++){g-=(int)t.count(ps[k]);g+=(int)t.count(ps[k]+dl);}\n            if(g>0){swap(arr[i],arr[j]);for(int k=i+1;k<=j;k++)ps[k]+=dl;im=true;}\n        }}return arr;\n}\npair<ll,vector<vector<int>>>solve()const{\n    vector<vector<int>>C;vector<int>ai(D);iota(ai.begin(),ai.end(),0);\n    C.push_back(ch(ai));\n    for(int d=0;d<D;d++)C.push_back(ch({d}));\n    for(int d=0;d+1<D;d++)C.push_back(ch({d,d+1}));\n    for(int d=0;d+2<D;d++)C.push_back(ch({d,d+1,d+2}));\n    for(int d=0;d+3<D;d++)C.push_back(ch({d,d+1,d+2,d+3}));\n    int NC=(int)C.size();\n    vector<set<int>>SS(NC);for(int L=0;L<NC;L++)SS[L]=gb(C[L]);\n    vector<vector<ll>>AR(D,vector<ll>(NC));for(int d=0;d<D;d++)for(int L=0;L<NC;L++)AR[d][L]=ac(d,C[L]);\n    vector<vector<ll>>pcg(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++){if(L1==L2)continue;pcg[L1][L2]=bd(SS[L1],gb(ag(C[L2],SS[L1])));}\n    // Transposed pcg for cache-friendly column access in inner loop\n    vector<vector<ll>>pcgt(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++)pcgt[L2][L1]=pcg[L1][L2];\n    vector<ll>zr(NC,0LL);\n    const ll INF=2e18;\n    vector<vector<ll>>dp(D,vector<ll>(NC,INF));vector<vector<int>>frm(D,vector<int>(NC,-1));\n    for(int L=0;L<NC;L++)dp[0][L]=AR[0][L];\n    for(int d=1;d<D;d++)for(int L=0;L<NC;L++)for(int pL=0;pL<NC;pL++){if(dp[d-1][pL]==INF)continue;ll cv=dp[d-1][pL]+pcg[pL][L]+AR[d][L];if(cv<dp[d][L]){dp[d][L]=cv;frm[d][L]=pL;}}\n    int bL=(int)(min_element(dp[D-1].begin(),dp[D-1].end())-dp[D-1].begin());\n    vector<int>dpseq(D);dpseq[D-1]=bL;for(int d=D-2;d>=0;d--)dpseq[d]=frm[d+1][dpseq[d+1]];\n    // Fast local search: O(1) per eval using pcg table lookups\n    auto dls=[&](vector<int>s)->vector<int>{\n        vector<ll>dc(D);\n        for(int d=0;d<D;d++){dc[d]=AR[d][s[d]];if(d>0&&s[d]!=s[d-1])dc[d]+=pcg[s[d-1]][s[d]];}\n        for(int it=0;it<200;it++){bool any=false;\n            for(int d=0;d<D;d++){\n                int bL2=s[d];ll bDl=0;\n                ll od=dc[d],od1=(d+1<D?dc[d+1]:0LL);\n                const ll*rp=(d>0)?pcg[s[d-1]].data():zr.data();\n                const ll*rt=(d+1<D)?pcgt[s[d+1]].data():zr.data();\n                ll b21=(d+1<D)?AR[d+1][s[d+1]]:0LL;\n                const ll*ra=AR[d].data();\n                for(int L=0;L<NC;L++){\n                    ll dl=(ra[L]+rp[L]+b21+rt[L])-(od+od1);\n                    if(dl<bDl){bDl=dl;bL2=L;}}\n                if(bL2!=s[d]){s[d]=bL2;\n                    dc[d]=AR[d][s[d]]+(d>0&&s[d]!=s[d-1]?pcg[s[d-1]][s[d]]:0LL);\n                    if(d+1<D)dc[d+1]=AR[d+1][s[d+1]]+(s[d+1]!=s[d]?pcg[s[d]][s[d+1]]:0LL);\n                    any=true;}}\n            if(!any)break;}\n        return s;\n    };\n    auto fs=[&](const vector<int>&s)->pair<ll,vector<vector<int>>>{\n        vector<vector<int>>arrs(D);ll cost=0;arrs[0]=C[s[0]];cost+=AR[0][s[0]];set<int>cur=gb(arrs[0]);\n        for(int d=1;d<D;d++){if(s[d]==s[d-1]){arrs[d]=arrs[d-1];cost+=AR[d][s[d]];}\n            else{arrs[d]=hc(ag(C[s[d]],cur),cur);set<int>ns=gb(arrs[d]);cost+=AR[d][s[d]]+bd(cur,ns);cur=ns;}}\n        return{cost,arrs};\n    };\n    auto[c1,a1]=fs(dls(dpseq));\n    vector<int>gseq(D);{int L0=0;for(int L=0;L<NC;L++)if(AR[0][L]<AR[0][L0])L0=L;\n        gseq[0]=L0;\n        for(int d=1;d<D;d++){ll bc=INF;int bL2=gseq[d-1];\n            for(int L=0;L<NC;L++){ll cv=AR[d][L]+(L!=gseq[d-1]?pcg[gseq[d-1]][L]:0LL);if(cv<bc){bc=cv;bL2=L;}}\n            gseq[d]=bL2;}}\n    auto[c2,a2]=fs(dls(gseq));\n    vector<int>apseq(D);for(int d=0;d<D;d++)apseq[d]=d+1;\n    auto[c3,a3]=fs(dls(apseq));\n    vector<int>fseq(D,0);\n    auto[c4,a4]=fs(dls(fseq));\n    ll bc2=min({c1,c2,c3,c4});\n    if(bc2==c1)return{c1,a1};else if(bc2==c2)return{c2,a2};else if(bc2==c3)return{c3,a3};else return{c4,a4};\n}\n};\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>W>>D>>N;a.resize(D,vector<int>(N));\n    for(int d=0;d<D;d++)for(int k=0;k<N;k++)cin>>a[d][k];\n    ll best=2e18;int bK=1;\n    vector<pair<ll,vector<vector<int>>>>bcr;\n    for(int K=1;K<=N;K++){\n        if(N%K!=0||W%K!=0)continue;\n        int npc=N/K,cw=W/K;\n        if(npc==1){\n            ll tc=0;vector<pair<ll,vector<vector<int>>>>cr(K);\n            for(int c=0;c<K;c++){ll cc=0;for(int d=0;d<D;d++){int df=a[d][c]-cw*W;if(df>0)cc+=(ll)df*100;}\n                cr[c]={cc,vector<vector<int>>(D,vector<int>(1,W))};tc+=cc;}\n            if(tc<best){best=tc;bK=K;bcr=cr;}continue;}\n        if(K>10)continue;\n        vector<pair<ll,vector<vector<int>>>>cr(K);ll tc=0;\n        for(int c=0;c<K;c++){CS cs{c,K,npc,cw};cr[c]=cs.solve();tc+=cr[c].first;}\n        if(tc<best){best=tc;bK=K;bcr=cr;}\n    }\n    int npc=N/bK,cw=W/bK;\n    for(int d=0;d<D;d++){\n        vector<array<int,4>>rects(N);\n        for(int c=0;c<bK;c++){int x0=c*cw,x1=x0+cw;const auto&arr=bcr[c].second[d];\n            vector<int>y(npc+1);y[0]=0;for(int j=0;j<npc;j++)y[j+1]=y[j]+arr[j];\n            vector<pair<int,int>>strips(npc);for(int j=0;j<npc;j++)strips[j]={arr[j],y[j]};\n            sort(strips.begin(),strips.end());\n            for(int j=0;j<npc;j++){int k=c+j*bK;rects[k]={strips[j].second,x0,strips[j].second+strips[j].first,x1};}\n        }\n        for(int k=0;k<N;k++)cout<<rects[k][0]<<\" \"<<rects[k][1]<<\" \"<<rects[k][2]<<\" \"<<rects[k][3]<<\"\\n\";\n    }\n    return 0;\n}","ahc032":"#include <bits/stdc++.h>\nusing namespace std;\nusing namespace chrono;\nconstexpr long long MOD=998244353;\nint N,M,K;long long sv[20][3][3],b[9][9],cur_score;\ninline long long add_mod(long long a,long long c){long long s=a+c;return s>=MOD?s-MOD:s;}\ninline long long sub_mod(long long a,long long c){return a>=c?a-c:a-c+MOD;}\nvoid apply_s(int m,int p,int q){for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long&c=b[p+i][q+j];long long nv=add_mod(c,sv[m][i][j]);cur_score+=nv-c;c=nv;}}\nvoid undo_s(int m,int p,int q){for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long&c=b[p+i][q+j];long long nv=sub_mod(c,sv[m][i][j]);cur_score+=nv-c;c=nv;}}\nstruct Op{int m,p,q;};\nconst int TK=15;\nlong long gdtv[3][3],gdts,gdtbest;int gdbs[9],gdcs[9],gdord[20],gdfl;bool gdto;steady_clock::time_point gddl;\nvoid tile_dfs(int dep,int mi){\n    if(gdto)return;\n    if(dep==9){if(++gdfl%200000==0&&steady_clock::now()>=gddl){gdto=true;return;}if(gdts>gdtbest){gdtbest=gdts;for(int d=0;d<9;d++)gdbs[d]=gdord[gdcs[d]];}return;}\n    long long ub=gdts;for(int i=0;i<3;i++)for(int j=0;j<3;j++)ub+=(MOD-1)-gdtv[i][j];if(ub<=gdtbest)return;\n    for(int idx=mi;idx<TK;idx++){int m=gdord[idx];gdcs[dep]=idx;\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(gdtv[i][j],sv[m][i][j]);gdts+=nv-gdtv[i][j];gdtv[i][j]=nv;}\n        tile_dfs(dep+1,idx);\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=sub_mod(gdtv[i][j],sv[m][i][j]);gdts+=nv-gdtv[i][j];gdtv[i][j]=nv;}\n        if(gdto)return;}\n}\nlong long compute_tile(int s[9],long long itv[3][3]){long long ts=0;long long tv[3][3];for(int i=0;i<3;i++)for(int j=0;j<3;j++){tv[i][j]=itv[i][j];ts+=itv[i][j];}for(int d=0;d<9;d++)for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(tv[i][j],sv[s[d]][i][j]);ts+=nv-tv[i][j];tv[i][j]=nv;}return ts;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N>>M>>K;cur_score=0;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){cin>>b[i][j];b[i][j]%=MOD;cur_score+=b[i][j];}\n    for(int m=0;m<M;m++)for(int i=0;i<3;i++)for(int j=0;j<3;j++)cin>>sv[m][i][j];\n    auto t0=steady_clock::now();const long long TL_US=1850000;\n    vector<Op>ops;ops.reserve(K);\n    const int tpos[9][2]={{0,0},{0,3},{0,6},{3,0},{3,3},{3,6},{6,0},{6,3},{6,6}};\n    gdfl=0;gdto=false;gddl=t0+milliseconds(1300);\n    for(int tile=0;tile<9;tile++){\n        int p=tpos[tile][0],q=tpos[tile][1];long long itv[3][3];long long its=0;\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){itv[i][j]=b[p+i][q+j];its+=itv[i][j];}\n        long long gn[20];int ord[20];iota(ord,ord+20,0);\n        for(int m=0;m<M;m++){gn[m]=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)gn[m]+=add_mod(itv[i][j],sv[m][i][j])-itv[i][j];}\n        sort(ord,ord+20,[&](int a,int b_){return gn[a]>gn[b_];});\n        long long grtv[3][3];memcpy(grtv,itv,sizeof(itv));long long grts=its;int grs[9];\n        for(int d=0;d<9;d++){long long bg=0;int bm=0;for(int m=0;m<M;m++){long long g=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)g+=add_mod(grtv[i][j],sv[m][i][j])-grtv[i][j];if(g>bg){bg=g;bm=m;}}grs[d]=bm;for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(grtv[i][j],sv[bm][i][j]);grts+=nv-grtv[i][j];grtv[i][j]=nv;}}\n        memcpy(gdtv,itv,sizeof(itv));gdts=its;gdtbest=grts;for(int d=0;d<9;d++)gdbs[d]=grs[d];for(int m=0;m<20;m++)gdord[m]=ord[m];\n        tile_dfs(0,0);\n        int best_s[9];memcpy(best_s,gdbs,sizeof(gdbs));long long best_ts=gdtbest;\n        bool imp=true;\n        while(imp){imp=false;for(int d=0;d<9;d++){int om=best_s[d];for(int m=0;m<M;m++){if(m==om)continue;int tmp[9];memcpy(tmp,best_s,sizeof(best_s));tmp[d]=m;long long ts=compute_tile(tmp,itv);if(ts>best_ts){best_ts=ts;memcpy(best_s,tmp,sizeof(tmp));imp=true;}}}}\n        // 2-opt refinement\n        bool imp2=true;\n        while(imp2){\n            imp2=false;long long b2ts=best_ts;int bd1=-1,bd2=-1,bm1=-1,bm2=-1;\n            for(int d1=0;d1<9;d1++)for(int d2=d1+1;d2<9;d2++)for(int m1=0;m1<M;m1++)for(int m2=0;m2<M;m2++){\n                if(m1==best_s[d1]&&m2==best_s[d2])continue;\n                int tmp[9];memcpy(tmp,best_s,sizeof(best_s));tmp[d1]=m1;tmp[d2]=m2;\n                long long ts=compute_tile(tmp,itv);\n                if(ts>b2ts){b2ts=ts;bd1=d1;bd2=d2;bm1=m1;bm2=m2;}\n            }\n            if(bd1>=0){best_ts=b2ts;best_s[bd1]=bm1;best_s[bd2]=bm2;imp2=true;}\n        }\n        for(int d=0;d<9;d++){apply_s(best_s[d],p,q);ops.push_back({best_s[d],p,q});}\n    }\n    long long best_score=cur_score;vector<Op>best_ops=ops;\n    mt19937 rng(42);const int POS=N-2;\n    auto rand_op=[&]()->Op{return{(int)(rng()%M),(int)(rng()%POS),(int)(rng()%POS)};};\n    double T_start=1e8;\n    if(!ops.empty()){long long sumd=0;int cnt=0;for(int i=0;i<3000;i++){int L=ops.size();if(!L)break;int idx=rng()%L;Op oo=ops[idx],no=rand_op();long long s0=cur_score;undo_s(oo.m,oo.p,oo.q);apply_s(no.m,no.p,no.q);long long d=cur_score-s0;sumd+=(d<0?-d:d);cnt++;undo_s(no.m,no.p,no.q);apply_s(oo.m,oo.p,oo.q);}if(cnt>0)T_start=max(1.0,(double)sumd/cnt);}\n    double T=T_start,T_end=max(T_start*1e-7,1.0);\n    for(long long it=0;;it++){\n        if(it%50000==0){long long el=duration_cast<microseconds>(steady_clock::now()-t0).count();if(el>=TL_US)break;T=T_start*pow(T_end/T_start,(double)el/TL_US);}\n        int L=ops.size();Op n1=rand_op(),o1{},o2{},n2{};int i1=-1,i2=-1,mt;\n        if(L==0){mt=0;}else{int r=rng()%10;if(L==K)mt=(r<2)?1:(r<7)?2:3;else mt=(r<2)?0:(r<3)?1:(r<7)?2:3;if(mt==3&&L<2)mt=2;}\n        if(mt==1||mt==2){i1=rng()%L;o1=ops[i1];}\n        if(mt==3){i1=rng()%L;do{i2=rng()%L;}while(i2==i1);o1=ops[i1];o2=ops[i2];n2=rand_op();}\n        long long s0=cur_score;\n        switch(mt){case 0:apply_s(n1.m,n1.p,n1.q);break;case 1:undo_s(o1.m,o1.p,o1.q);break;case 2:undo_s(o1.m,o1.p,o1.q);apply_s(n1.m,n1.p,n1.q);break;case 3:undo_s(o1.m,o1.p,o1.q);undo_s(o2.m,o2.p,o2.q);apply_s(n1.m,n1.p,n1.q);apply_s(n2.m,n2.p,n2.q);break;}\n        long long delta=cur_score-s0;bool acc=(delta>=0)||(T>0.5&&(double)(rng()%1000000)<exp((double)delta/T)*1e6);\n        if(acc){switch(mt){case 0:ops.push_back(n1);break;case 1:ops[i1]=ops.back();ops.pop_back();break;case 2:ops[i1]=n1;break;case 3:ops[i1]=n1;ops[i2]=n2;break;}if(cur_score>best_score){best_score=cur_score;best_ops=ops;}}\n        else{switch(mt){case 0:undo_s(n1.m,n1.p,n1.q);break;case 1:apply_s(o1.m,o1.p,o1.q);break;case 2:undo_s(n1.m,n1.p,n1.q);apply_s(o1.m,o1.p,o1.q);break;case 3:undo_s(n2.m,n2.p,n2.q);undo_s(n1.m,n1.p,n1.q);apply_s(o2.m,o2.p,o2.q);apply_s(o1.m,o1.p,o1.q);break;}}\n    }\n    cout<<best_ops.size()<<'\\n';for(auto&op:best_ops)cout<<op.m<<' '<<op.p<<' '<<op.q<<'\\n';\n    return 0;\n}","ahc033":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=5;\nint A[N][N],posR[N*N],posP[N*N],grid[N][N];\nint craneR,craneC;bool craneHolding;int craneContainer;\nint recvSent[N],recvPickedUp[N],dispatchCount[N];bool done_[N*N];\nmap<int,pair<int,int>> bufPos;set<pair<int,int>> usedBufs;\nstring result;\nvoid sRecv(){for(int r=0;r<N;r++){bool bl=craneHolding&&craneR==r&&craneC==0;if(!bl&&grid[r][0]==-1&&recvSent[r]<N)grid[r][0]=A[r][recvSent[r]++];}}\nvoid sDisp(){for(int r=0;r<N;r++)if(grid[r][N-1]!=-1){dispatchCount[r]++;grid[r][N-1]=-1;}}\nvoid act(char c){result+=c;if(c=='P'){craneContainer=grid[craneR][craneC];grid[craneR][craneC]=-1;craneHolding=true;}else if(c=='Q'){grid[craneR][craneC]=craneContainer;craneHolding=false;craneContainer=-1;}else if(c=='U')craneR--;else if(c=='D')craneR++;else if(c=='L')craneC--;else if(c=='R')craneC++;}\nvoid turn_(char c){sRecv();act(c);sDisp();}\nvoid goto_(int tr,int tc){while(craneR!=tr||craneC!=tc){if(craneR<tr)turn_('D');else if(craneR>tr)turn_('U');else if(craneC<tc)turn_('R');else turn_('L');}}\nvoid pickup_(int r,int c,bool g){while(grid[r][c]==-1){if(g&&recvSent[r]<N){turn_('P');return;}turn_('.');}turn_('P');}\npair<int,int> freeBuf(int tR=-1){\n    if(tR>=0)for(int c=N-2;c>=1;c--){auto p=make_pair(tR,c);if(!usedBufs.count(p)&&grid[tR][c]==-1)return p;}\n    for(int c=N-2;c>=1;c--)for(int r=0;r<N;r++){auto p=make_pair(r,c);if(!usedBufs.count(p)&&grid[r][c]==-1)return p;}\n    for(int r=0;r<N;r++)if(recvSent[r]==N){auto p=make_pair(r,0);if(!usedBufs.count(p)&&grid[r][0]==-1)return p;}\n    return{-1,-1};\n}\nint nNext(int g){return dispatchCount[g]<N?N*g+dispatchCount[g]:-1;}\nvoid deliver_(int srcR,int srcC,bool isBuf,bool isGate,int d){\n    goto_(srcR,srcC);pickup_(srcR,srcC,isGate);\n    int cont=craneContainer;\n    if(isBuf){usedBufs.erase({srcR,srcC});bufPos.erase(cont);}else if(isGate)recvPickedUp[srcR]++;\n    done_[cont]=true;goto_(d,N-1);turn_('Q');\n}\nvoid bufferGate_(int r,int dstR,int dstC){\n    goto_(r,0);pickup_(r,0,true);int cont=craneContainer;recvPickedUp[r]++;\n    usedBufs.insert({dstR,dstC});bufPos[cont]={dstR,dstC};goto_(dstR,dstC);turn_('Q');\n}\nvoid clearBlocker_(int r){\n    int bl=A[r][recvPickedUp[r]],gbl=bl/N;\n    for(int i=0;i<N&&nNext(gbl)!=bl;i++){\n        int pre=nNext(gbl);\n        if(pre<0||done_[pre])break;\n        if(bufPos.count(pre)){auto[br,bc]=bufPos[pre];deliver_(br,bc,true,false,gbl);}\n        else if(!done_[pre]&&recvPickedUp[posR[pre]]==posP[pre])deliver_(posR[pre],0,false,true,gbl);\n        else break;\n    }\n    if(nNext(gbl)==bl){deliver_(r,0,false,true,gbl);return;}\n    auto[br,bc]=freeBuf(gbl);\n    if(br!=-1)bufferGate_(r,br,bc);else deliver_(r,0,false,true,gbl);\n}\nbool canChain(int bl){\n    int gbl=bl/N,blPos=bl%N,disp=dispatchCount[gbl];\n    if(disp>blPos)return false;\n    for(int pos=disp;pos<blPos;pos++){\n        int needed=N*gbl+pos;\n        if(done_[needed])continue;\n        if(bufPos.count(needed))continue;\n        if(recvPickedUp[posR[needed]]==posP[needed])continue;\n        return false;\n    }\n    return true;\n}\nvoid deliverForGate(int gate){\n    int k=nNext(gate);if(k<0||done_[k])return;\n    if(bufPos.count(k)){auto[br,bc]=bufPos[k];deliver_(br,bc,true,false,gate);}\n    else{int r=posR[k],p=posP[k];while(recvPickedUp[r]<p)clearBlocker_(r);deliver_(r,0,false,true,gate);}\n}\nvector<int> planOrd(){\n    const int ND=N+1;int DB=1;for(int i=0;i<N;i++)DB*=ND;const int NS=DB*N*N;\n    auto enc=[&](array<int,N>d,int r,int c){int s=0;for(int i=0;i<N;i++)s=s*ND+d[i];return s*N*N+r*N+c;};\n    auto dec=[&](int s,array<int,N>&d,int&r,int&c){c=s%N;s/=N;r=s%N;s/=N;for(int i=N-1;i>=0;i--){d[i]=s%ND;s/=ND;}};\n    vector<int>dist(NS,INT_MAX/2),pS(NS,-1),pG(NS,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;\n    array<int,N>d0{};int s0=enc(d0,0,0);dist[s0]=0;pq.push({0,s0});\n    while(!pq.empty()){\n        auto[w,s]=pq.top();pq.pop();if(w>dist[s])continue;\n        array<int,N>d;int r,c;dec(s,d,r,c);\n        for(int g=0;g<N;g++){\n            if(d[g]>=N)continue;int k=N*g+d[g],sR=posR[k];\n            int tc=abs(r-sR)+abs(c)+abs(sR-g)+(N-1)+2+posP[k]*12;\n            auto nd=d;nd[g]++;int ns=enc(nd,g,N-1);\n            if(dist[s]+tc<dist[ns]){dist[ns]=dist[s]+tc;pS[ns]=s;pG[ns]=g;pq.push({dist[ns],ns});}\n        }\n    }\n    array<int,N>gD;gD.fill(N);int best=-1,bd=INT_MAX;\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int gs=enc(gD,r,c);if(dist[gs]<bd){bd=dist[gs];best=gs;}}\n    vector<int>ord;if(best!=-1)for(int s=best;pS[s]!=-1;s=pS[s])ord.push_back(pG[s]);\n    reverse(ord.begin(),ord.end());return ord;\n}\nvoid solve(){\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)grid[r][c]=-1;\n    craneR=craneC=0;craneHolding=false;craneContainer=-1;\n    fill(recvSent,recvSent+N,0);fill(recvPickedUp,recvPickedUp+N,0);\n    fill(dispatchCount,dispatchCount+N,0);fill(done_,done_+N*N,false);\n    bufPos.clear();usedBufs.clear();result.clear();\n    for(int r=0;r<N;r++)for(int p=0;p<N;p++){posR[A[r][p]]=r;posP[A[r][p]]=p;}\n    auto ord=planOrd();for(int g:ord)deliverForGate(g);\n    for(int it=0;it<5000;it++){\n        bool done=true;for(int i=0;i<N;i++)if(dispatchCount[i]<N){done=false;break;}if(done)break;\n        int bK=-1,bSc=INT_MAX,bSR=-1,bSC=-1;bool bBuf=false;\n        for(int g=0;g<N;g++){\n            int k=nNext(g);if(k<0||done_[k])continue;\n            int sR,sC;bool ib;\n            if(bufPos.count(k)){auto&bp=bufPos[k];sR=bp.first;sC=bp.second;ib=true;}\n            else{int r=posR[k],p=posP[k];if(recvPickedUp[r]!=p)continue;sR=r;sC=0;ib=false;}\n            int future=0;\n            for(int j=dispatchCount[g]+1;j<N;j++){int f=N*g+j;if(bufPos.count(f)||(!done_[f]&&recvPickedUp[posR[f]]==posP[f]))future++;}\n            int sc=abs(craneR-sR)+abs(craneC-sC)+abs(sR-g)+abs(sC-(N-1))-future*5;\n            if(sc<bSc){bSc=sc;bK=k;bSR=sR;bSC=sC;bBuf=ib;}\n        }\n        if(bK>=0){deliver_(bSR,bSC,bBuf,!bBuf,bK/N);continue;}\n        int bG_chain=-1,bD_chain=INT_MAX,bG_buf=-1,bD_buf=INT_MAX;\n        for(int g=0;g<N;g++){\n            int k=nNext(g);if(k<0||done_[k]||bufPos.count(k))continue;\n            int r=posR[k],p=posP[k];if(recvPickedUp[r]==p)continue;\n            int bl=A[r][recvPickedUp[r]],dd=abs(craneR-r)+abs(craneC);\n            if(canChain(bl)){if(dd<bD_chain){bD_chain=dd;bG_chain=g;}}\n            else{if(dd<bD_buf){bD_buf=dd;bG_buf=g;}}\n        }\n        int bG=(bG_chain>=0)?bG_chain:bG_buf;\n        if(bG>=0)clearBlocker_(posR[nNext(bG)]);\n    }\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    int n;cin>>n;for(int r=0;r<N;r++)for(int p=0;p<N;p++)cin>>A[r][p];\n    solve();cout<<result<<\"\\n\";for(int i=1;i<N;i++)cout<<\"B\\n\";\n    return 0;\n}","ahc034":"#include <bits/stdc++.h>\nusing namespace std;\nint N,h[20][20],origH[20][20],curR,curC,curLoad;\nvector<string> ops;long long totalCost;\nvoid doLoad(int d){if(d<=0)return;totalCost+=d;ops.push_back(\"+\"+to_string(d));h[curR][curC]-=d;curLoad+=d;}\nvoid doUnload(int d){d=min(d,curLoad);if(d<=0)return;totalCost+=d;ops.push_back(\"-\"+to_string(d));h[curR][curC]+=d;curLoad-=d;}\nvoid moveStep(char dir,int dr,int dc){totalCost+=100LL+curLoad;curR+=dr;curC+=dc;ops.push_back(string(1,dir));if(h[curR][curC]>0)doLoad(h[curR][curC]);else if(h[curR][curC]<0&&curLoad>0)doUnload(min(curLoad,-h[curR][curC]));}\nvoid moveTo(int tr,int tc){\n    if(curR==tr&&curC==tc)return;\n    int nrow=abs(tr-curR),ncol=abs(tc-curC),rs=curR<tr?1:-1,cs=curC<tc?1:-1;\n    if(!nrow||!ncol){while(curR!=tr)moveStep(rs>0?'D':'U',rs,0);while(curC!=tc)moveStep(cs>0?'R':'L',0,cs);return;}\n    bool ld=(curLoad>0);\n    auto cv=[&](int r,int c)->int{int ri=curR+r*rs,ci=curC+c*cs;return ld?abs(h[ri][ci]):max(0,h[ri][ci]);};\n    int dp[21][21]={};bool fr[21][21]={};\n    for(int r=1;r<=nrow;r++){dp[r][0]=dp[r-1][0]+cv(r,0);fr[r][0]=1;}\n    for(int c=1;c<=ncol;c++)dp[0][c]=dp[0][c-1]+cv(0,c);\n    for(int r=1;r<=nrow;r++)for(int c=1;c<=ncol;c++){int a=dp[r-1][c]+cv(r,c),b=dp[r][c-1]+cv(r,c);if(a>=b){dp[r][c]=a;fr[r][c]=1;}else dp[r][c]=b;}\n    string path;int r=nrow,c=ncol;\n    while(r||c){if(!r){path+='c';c--;}else if(!c){path+='r';r--;}else if(fr[r][c]){path+='r';r--;}else{path+='c';c--;}}\n    reverse(path.begin(),path.end());\n    for(char ch:path)if(ch=='r')moveStep(rs>0?'D':'U',rs,0);else moveStep(cs>0?'R':'L',0,cs);\n}\nbool allZero(){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])return false;return true;}\nvoid run(int threshold,bool sd,bool nls=false){\n    if(h[0][0]>0)doLoad(h[0][0]);\n    while(!allZero()&&(int)ops.size()<95000){\n        auto md=[&](int i,int j){return abs(i-curR)+abs(j-curC);};\n        int nD=INT_MAX,di=-1,dj=-1;double bDS=-1;int sdi=-1,sdj=-1;\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]<0){int d=md(i,j);if(d<nD){nD=d;di=i;dj=j;}if(sd&&curLoad>0){double sc=(double)min(curLoad,-h[i][j])/(d+1);if(sc>bDS){bDS=sc;sdi=i;sdj=j;}}}\n        int dI=(sd&&sdi>=0)?sdi:di,dJ=(sd&&sdj>=0)?sdj:dj;\n        if(curLoad==0){\n            double bs=-1;int bi=-1,bj=-1;\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0){double sc=(double)h[i][j]/(md(i,j)+1);if(sc>bs){bs=sc;bi=i;bj=j;}}\n            if(bi<0)break;moveTo(bi,bj);if(h[bi][bj]>0)doLoad(h[bi][bj]);\n        }else{\n            int fsi=-1,fsj=-1;\n            if(threshold==-1){\n                double bss=-1,bds=-1;int ssi=-1,ssj=-1;\n                for(int i=0;i<N;i++)for(int j=0;j<N;j++){int d=md(i,j);if(h[i][j]>0){double sc=(double)h[i][j]*100/((double)(d+1)*max(curLoad,1));if(sc>bss){bss=sc;ssi=i;ssj=j;}}if(h[i][j]<0){double sc=(double)min(curLoad,-h[i][j])/(d+1);if(sc>bds)bds=sc;}}\n                if(bss>bds&&ssi>=0){fsi=ssi;fsj=ssj;}\n            }else{\n                double bfs=-1;\n                for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(h[i][j]<=0)continue;int d=md(i,j);if((long long)d*curLoad>=(long long)nD*threshold)continue;double sc=nls?1.0/(d+1):(double)h[i][j]/(d+1);if(sc>bfs){bfs=sc;fsi=i;fsj=j;}}\n            }\n            if(fsi>=0){moveTo(fsi,fsj);if(h[fsi][fsj]>0)doLoad(h[fsi][fsj]);}\n            else if(dI>=0){moveTo(dI,dJ);if(h[dI][dJ]<0&&curLoad>0)doUnload(min(curLoad,-h[dI][dJ]));}\n            else break;\n        }\n    }\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])totalCost+=10000LL+100LL*abs(h[i][j]);\n}\nvoid runTSP(int fb){\n    vector<pair<int,int>> cells;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(origH[i][j]!=0)cells.push_back({i,j});\n    int n=cells.size();vector<bool>vis(n,false);int cr=0,cc=0;\n    for(int s=0;s<n&&(int)ops.size()<88000;s++){\n        int best=-1,bd=INT_MAX;\n        for(int i=0;i<n;i++){if(vis[i])continue;int d=abs(cells[i].first-cr)+abs(cells[i].second-cc);if(d<bd){bd=d;best=i;}}\n        if(best<0)break;vis[best]=true;auto[r,c]=cells[best];cr=r;cc=c;\n        moveTo(r,c);if(h[r][c]>0)doLoad(h[r][c]);else if(h[r][c]<0&&curLoad>0)doUnload(min(curLoad,-h[r][c]));\n    }\n    while(!allZero()&&(int)ops.size()<95000){\n        auto md=[&](int i,int j){return abs(i-curR)+abs(j-curC);};\n        int nD=INT_MAX,di=-1,dj=-1;\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]<0){int d=md(i,j);if(d<nD){nD=d;di=i;dj=j;}}\n        if(curLoad==0){double bs=-1;int bi=-1,bj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0){double sc=(double)h[i][j]/(md(i,j)+1);if(sc>bs){bs=sc;bi=i;bj=j;}}if(bi<0)break;moveTo(bi,bj);if(h[bi][bj]>0)doLoad(h[bi][bj]);}\n        else{double bfs=-1;int fsi=-1,fsj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(h[i][j]<=0)continue;int d=md(i,j);if((long long)d*curLoad>=(long long)nD*fb)continue;double sc=(double)h[i][j]/(d+1);if(sc>bfs){bfs=sc;fsi=i;fsj=j;}}\n            if(fsi>=0){moveTo(fsi,fsj);if(h[fsi][fsj]>0)doLoad(h[fsi][fsj]);}else if(di>=0){moveTo(di,dj);if(h[di][dj]<0&&curLoad>0)doUnload(min(curLoad,-h[di][dj]));}else break;}\n    }\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])totalCost+=10000LL+100LL*abs(h[i][j]);\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N;for(int i=0;i<N;i++)for(int j=0;j<N;j++){cin>>h[i][j];origH[i][j]=h[i][j];}\n    long long best=LLONG_MAX;vector<string>bestOps;\n    auto go=[&](auto f){for(int i=0;i<N;i++)for(int j=0;j<N;j++)h[i][j]=origH[i][j];curR=curC=curLoad=0;ops.clear();totalCost=0;f();if(totalCost<best){best=totalCost;bestOps=ops;}};\n    for(auto[t,sd,nls]:vector<tuple<int,bool,bool>>{{-1,0,0},{-1,1,0},{0,0,0},{0,1,0},{30,0,0},{50,0,0},{70,0,0},{80,0,0},{90,0,0},{100,0,0},{110,0,0},{120,0,0},{130,0,0},{150,0,0},{175,0,0},{200,0,0},{250,0,0},{300,0,0},{400,0,0},{500,0,0},{750,0,0},{1000,0,0},{2000,0,0},{80,1,0},{100,1,0},{120,1,0},{150,1,0},{200,1,0},{300,1,0},{80,0,1},{100,0,1},{120,0,1},{150,0,1}})\n        go([&]{run(t,sd,nls);});\n    for(int fb:{80,100,150})go([&]{runTSP(fb);});\n    for(auto&op:bestOps)cout<<op<<\"\\n\";\n}","ahc035":"#include <bits/stdc++.h>\nusing namespace std;\nint main(){\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,T; cin>>N>>M>>T;\n    const int SC=2*N*(N-1),nn=N*N;\n    vector<vector<int>> X(SC,vector<int>(M));\n    for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    mt19937 rng(42);\n    vector<array<int,4>> nbr(nn); vector<int> ndeg(nn,0);\n    for(int p=0;p<nn;p++){int r=p/N,c=p%N;if(r>0)nbr[p][ndeg[p]++]=p-N;if(r<N-1)nbr[p][ndeg[p]++]=p+N;if(c>0)nbr[p][ndeg[p]++]=p-1;if(c<N-1)nbr[p][ndeg[p]++]=p+1;}\n    for(int turn=0;turn<T;turn++){\n        auto ts=chrono::steady_clock::now();\n        vector<int> vals(SC,0);\n        for(int k=0;k<SC;k++) for(int l=0;l<M;l++) vals[k]+=X[k][l];\n        vector<bool> ins(SC,false); vector<int> sel;\n        for(int l=0;l<M;l++){int bk=0;for(int k=1;k<SC;k++)if(X[k][l]>X[bk][l])bk=k;if(!ins[bk]){ins[bk]=true;sel.push_back(bk);}}\n        {vector<int> ord(SC);iota(ord.begin(),ord.end(),0);sort(ord.begin(),ord.end(),[&](int a,int b){return vals[a]>vals[b];});for(int k:ord){if((int)sel.size()>=nn)break;if(!ins[k]){ins[k]=true;sel.push_back(k);}}}\n        vector<int> pst(nn*nn);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++){int s=0;for(int l=0;l<M;l++)s+=max(X[sel[i]][l],X[sel[j]][l]);pst[i*nn+j]=s;}\n        vector<int> psum(nn,0);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++) psum[i]+=pst[i*nn+j];\n        auto ctrb=[&](const vector<int>&g,int p)->int{int v=0;for(int d=0;d<ndeg[p];d++)v+=pst[g[p]*nn+g[nbr[p][d]]];return v;};\n        auto totsc=[&](const vector<int>&g)->int{int s=0;for(int p=0;p<nn;p++){if((p%N)<N-1)s+=pst[g[p]*nn+g[p+1]];if(p<nn-N)s+=pst[g[p]*nn+g[p+N]];}return s;};\n        auto locsrch=[&](vector<int> g)->vector<int>{bool imp=true;while(imp){imp=false;for(int a=0;a<nn;a++)for(int b=a+1;b<nn;b++){int bef=ctrb(g,a)+ctrb(g,b);swap(g[a],g[b]);int aft=ctrb(g,a)+ctrb(g,b);if(aft>bef)imp=true;else swap(g[a],g[b]);}}return g;};\n        auto grinit=[&]()->vector<int>{vector<int> g(nn,-1);vector<bool> used(nn,false);for(int pos=0;pos<nn;pos++){int r=pos/N,c=pos%N;int bs=-1;int64_t bv=-1;for(int s=0;s<nn;s++){if(used[s])continue;int cv=0;if(r>0)cv+=pst[s*nn+g[pos-N]];if(c>0)cv+=pst[s*nn+g[pos-1]];int64_t ev=(int64_t)cv*1000000LL+psum[s];if(ev>bv){bv=ev;bs=s;}}g[pos]=bs;used[bs]=true;}return g;};\n        int gbest=-1; vector<int> bg;\n        for(int rest=0;rest<3;rest++){\n            double rt0=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n            if(rt0>=0.185) break;\n            double tl=(0.185-rt0)/(3-rest),tend=rt0+tl;\n            vector<int> g(nn); double T0;\n            if(rest==0){g=grinit();T0=200.0;}else{iota(g.begin(),g.end(),0);shuffle(g.begin(),g.end(),rng);T0=1000.0;}\n            int cur=totsc(g),lb=cur; vector<int> lg=g; double temp=T0;\n            for(int it=0;;it++){\n                if((it&0x7FF)==0){double now=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(now>=tend)break;temp=T0*pow(0.1/T0,(now-rt0)/tl);}\n                int p1=rng()%nn,p2=rng()%nn; if(p1==p2)continue;\n                int bef=ctrb(g,p1)+ctrb(g,p2); swap(g[p1],g[p2]); int aft=ctrb(g,p1)+ctrb(g,p2); int d=aft-bef;\n                if(d>=0||(rng()%1000000)<(int)(1e6*exp((double)d/temp))){cur+=d;if(cur>lb){lb=cur;lg=g;}}else swap(g[p1],g[p2]);\n            }\n            lg=locsrch(lg); int sc=totsc(lg); if(sc>gbest){gbest=sc;bg=lg;}\n        }\n        for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(j)cout<<' ';cout<<sel[bg[i*N+j]];}cout<<'\\n';}\n        cout.flush();\n        for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    }\n    return 0;\n}","ahc038":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,V;\nconst int DR[]={0,1,0,-1},DC[]={1,0,-1,0};\nint rx,ry,nfp,Vp,rfp=-1;\nint fpd[4],hld[4];\nstruct Del{int sr,sc,tr,tc;bool done;};\nvector<Del>P;int np;\nvector<vector<int>>g;\nmap<pair<int,int>,int>sm;\nvector<string>ops;\nbool navto(int tr,int tc,int pk,int td){\n    while((rx!=tr||ry!=tc||fpd[pk]!=td)&&(int)ops.size()<99990){\n        char mv='.';\n        if(rx!=tr||ry!=tc){if(rx<tr)mv='D';else if(rx>tr)mv='U';else if(ry<tc)mv='R';else mv='L';}\n        if(mv=='D')rx++;else if(mv=='U')rx--;else if(mv=='R')ry++;else if(mv=='L')ry--;\n        string op(2*Vp,'.');op[0]=mv;\n        if(fpd[pk]!=td){int cw=(td-fpd[pk]+4)%4;if(cw<=2){fpd[pk]=(fpd[pk]+1)%4;op[1+pk]='R';}else{fpd[pk]=(fpd[pk]+3)%4;op[1+pk]='L';}}\n        for(int k=0;k<nfp;k++){\n            int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];\n            if(fr<0||fr>=N||fc<0||fc>=N)continue;\n            if(hld[k]<0){if(k==rfp)continue;auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n            else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n        }\n        ops.push_back(op);\n    }\n    return rx==tr&&ry==tc&&fpd[pk]==td;\n}\nint pickfp(int di,int r,int c){\n    sm.erase({r,c});\n    int bk=-1,br=-1,bc=-1,bdir=-1,bv=INT_MAX;\n    for(int k=0;k<nfp;k++){\n        if(hld[k]>=0)continue;\n        for(int d=0;d<4;d++){\n            int ar=r-DR[d],ac=c-DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;\n            int md=abs(rx-ar)+abs(ry-ac),rot=min((d-fpd[k]+4)%4,(fpd[k]-d+4)%4),v=max(md,rot);\n            if(v<bv){bv=v;bk=k;br=ar;bc=ac;bdir=d;}\n        }\n    }\n    if(bk<0){sm[{r,c}]=di;return -1;}\n    rfp=bk;bool ok=navto(br,bc,bk,bdir);rfp=-1;\n    if(!ok){sm[{r,c}]=di;return -1;}\n    if((int)ops.size()>=99990){sm[{r,c}]=di;return -1;}\n    string op(2*Vp,'.');bool picked=false;\n    for(int k=0;k<nfp;k++){\n        int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k==bk&&fr==r&&fc==c&&g[r][c]==1&&hld[k]<0){hld[k]=di;g[r][c]=0;op[Vp+1+k]='P';picked=true;}\n        else if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n        else if(hld[k]>=0){int di2=hld[k];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n    }\n    ops.push_back(op);if(!picked){sm[{r,c}]=di;return -1;}return bk;\n}\nbool dropfp(int k,int di){\n    if(hld[k]!=di)return true;\n    int r=P[di].tr,c=P[di].tc;\n    int bdir=-1,bar=-1,bac=-1,bv=INT_MAX;\n    for(int d=0;d<4;d++){\n        int ar=r-DR[d],ac=c-DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;\n        int md=abs(rx-ar)+abs(ry-ac),rot=min((d-fpd[k]+4)%4,(fpd[k]-d+4)%4),v=max(md,rot);\n        if(v<bv){bv=v;bdir=d;bar=ar;bac=ac;}\n    }\n    if(bdir<0)return false;\n    navto(bar,bac,k,bdir);if(hld[k]!=di)return true;\n    if((int)ops.size()>=99990)return false;\n    string op(2*Vp,'.');bool ok=false;\n    for(int k2=0;k2<nfp;k2++){\n        int fr=rx+DR[fpd[k2]],fc=ry+DC[fpd[k2]];if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k2==k&&fr==r&&fc==c&&g[r][c]==0&&hld[k2]==di){g[r][c]=1;P[di].done=true;hld[k2]=-1;op[Vp+1+k2]='P';ok=true;}\n        else if(hld[k2]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k2]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k2]='P';}}\n        else if(hld[k2]>=0){int di2=hld[k2];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k2]=-1;op[Vp+1+k2]='P';}}\n    }\n    ops.push_back(op);return ok;\n}\nbool cbh(int bk){\n    if(hld[bk]<0)return false;int di=hld[bk];\n    pair<int,int>tmp={-1,-1};\n    {set<pair<int,int>>ts;for(auto&d:P)if(!d.done)ts.insert({d.tr,d.tc});\n    int bdist=INT_MAX;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(!g[i][j]&&!ts.count({i,j})){int dist=abs(rx-i)+abs(ry-j);if(dist<bdist){bdist=dist;tmp={i,j};}}}\n    if(tmp.first<0){bdist=INT_MAX;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(!g[i][j]){int dist=abs(rx-i)+abs(ry-j);if(dist<bdist){bdist=dist;tmp={i,j};}}}}}\n    if(tmp.first<0)return false;\n    int otr=P[di].tr,otc=P[di].tc;P[di].tr=tmp.first;P[di].tc=tmp.second;g[tmp.first][tmp.second]=0;\n    if(dropfp(bk,di)){P[di].done=false;P[di].tr=otr;P[di].tc=otc;P[di].sr=tmp.first;P[di].sc=tmp.second;sm[{tmp.first,tmp.second}]=di;return true;}\n    else{P[di].tr=otr;P[di].tc=otc;if(!g[tmp.first][tmp.second])g[tmp.first][tmp.second]=1;hld[bk]=-1;return false;}\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>V;\n    vector<string>sg(N),tg(N);for(auto&s:sg)cin>>s;for(auto&s:tg)cin>>s;\n    vector<pair<int,int>>S,T;g.assign(N,vector<int>(N,0));\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(sg[i][j]=='1'){S.push_back({i,j});g[i][j]=1;}if(tg[i][j]=='1')T.push_back({i,j});}\n    int m=M;nfp=min(V-1,4);Vp=nfp+1;\n    cout<<Vp<<\"\\n\";for(int k=0;k<nfp;k++)cout<<\"0 1\\n\";cout<<\"0 0\\n\";\n    rx=ry=0;for(int k=0;k<nfp;k++){hld[k]=-1;fpd[k]=0;}\n    vector<int>mt(m,-1);\n    {vector<bool>su(m,false),tu(m,false);\n    for(int i=0;i<m;i++)if(!su[i])for(int j=0;j<m;j++)if(!tu[j]&&S[i]==T[j]){mt[i]=j;su[i]=tu[j]=true;break;}\n    for(int i=0;i<m;i++){if(su[i])continue;int bj=-1,bd=INT_MAX;for(int j=0;j<m;j++){if(tu[j])continue;int d=abs(S[i].first-T[j].first)+abs(S[i].second-T[j].second);if(d<bd){bd=d;bj=j;}}mt[i]=bj;su[i]=tu[bj]=true;}\n    bool imp=true;while(imp){imp=false;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int si0=S[i].first,si1=S[i].second,sj0=S[j].first,sj1=S[j].second,ti0=T[mt[i]].first,ti1=T[mt[i]].second,tj0=T[mt[j]].first,tj1=T[mt[j]].second;if(abs(si0-tj0)+abs(si1-tj1)+abs(sj0-ti0)+abs(sj1-ti1)<abs(si0-ti0)+abs(si1-ti1)+abs(sj0-tj0)+abs(sj1-tj1)){swap(mt[i],mt[j]);imp=true;}}}}\n    P.clear();for(int i=0;i<m;i++)if(S[i]!=T[mt[i]])P.push_back({S[i].first,S[i].second,T[mt[i]].first,T[mt[i]].second,false});\n    np=(int)P.size();sm.clear();for(int i=0;i<np;i++)sm[{P[i].sr,P[i].sc}]=i;\n    auto och=[&](string&op){for(int k=0;k<nfp;k++){int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];if(fr<0||fr>=N||fc<0||fc>=N)continue;if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}}};\n    if(nfp>=2){string op(2*Vp,'.');if(nfp>=2){op[2]='R';fpd[1]=1;}if(nfp>=3){op[3]='R';fpd[2]=1;}if(nfp>=4){op[4]='L';fpd[3]=3;}och(op);ops.push_back(op);}\n    if(nfp>=3){string op(2*Vp,'.');op[3]='R';fpd[2]=2;och(op);ops.push_back(op);}\n    vector<int>tsp(np);\n    if(np>0){\n        {vector<bool>used(np,false);int cr=0,cc=0;for(int s=0;s<np;s++){int best=-1,bd=INT_MAX;for(int i=0;i<np;i++){if(used[i])continue;int d=abs(cr-P[i].sr)+abs(cc-P[i].sc);if(d<bd){bd=d;best=i;}}tsp[s]=best;used[best]=true;cr=P[best].tr;cc=P[best].tc;}}\n        auto dc=[&](int a,int b)->int{if(b<0||b>=np)return 0;int r0=(a<0||a>=np)?0:P[tsp[a]].tr,c0=(a<0||a>=np)?0:P[tsp[a]].tc;return abs(r0-P[tsp[b]].sr)+abs(c0-P[tsp[b]].sc);};\n        {bool imp=true;while(imp){imp=false;for(int i=0;i<np;i++)for(int j=i+1;j<np;j++){int oc,nc;if(j==i+1){oc=dc(i-1,i)+dc(i,j)+dc(j,j+1);swap(tsp[i],tsp[j]);nc=dc(i-1,i)+dc(i,j)+dc(j,j+1);swap(tsp[i],tsp[j]);}else{oc=dc(i-1,i)+dc(i,i+1)+dc(j-1,j)+dc(j,j+1);swap(tsp[i],tsp[j]);nc=dc(i-1,i)+dc(i,i+1)+dc(j-1,j)+dc(j,j+1);swap(tsp[i],tsp[j]);}if(nc<oc){swap(tsp[i],tsp[j]);imp=true;}}}}\n        {bool imp=true;while(imp){imp=false;int bi=-1,bj=-1,bdelta=0;for(int i=0;i<np;i++){int pi=i-1,ni=i+1,rc=dc(pi,i)+dc(i,ni),bridge=dc(pi,ni);for(int j=0;j<np;j++){if(j==pi||j==i)continue;int nj=j+1,rj=dc(j,nj),ic=dc(j,i)+dc(i,nj),delta=bridge+ic-rc-rj;if(delta<bdelta){bdelta=delta;bi=i;bj=j;}}}if(bi>=0){imp=true;int val=tsp[bi];if(bj>bi){tsp.erase(tsp.begin()+bi);tsp.insert(tsp.begin()+bj,val);}else{tsp.erase(tsp.begin()+bi);tsp.insert(tsp.begin()+bj+1,val);}}}}\n    }\n    vector<int>tsp_rank(np,np);for(int s=0;s<np;s++)tsp_rank[tsp[s]]=s;\n    int stall=0;\n    while((int)ops.size()<97000){\n        int tdone=0;for(auto&d:P)if(d.done)tdone++;if(tdone==np)break;\n        bool prog=false;\n        // Step 1: greedy mini-TSP drop (recompute optimal at each step)\n        {bool any=true;\n        while(any&&(int)ops.size()<97000){\n            any=false;\n            vector<pair<int,int>>dr;\n            for(int k=0;k<nfp;k++){if(hld[k]<0)continue;int di=hld[k];if(g[P[di].tr][P[di].tc]!=0)continue;dr.push_back({k,di});}\n            if(dr.empty())break;\n            int n=dr.size();\n            vector<int>perm(n);iota(perm.begin(),perm.end(),0);\n            vector<int>best=perm;int bc=INT_MAX;\n            do{int cost=0,cr=rx,cc=ry;for(int i:perm){int r=P[dr[i].second].tr,c=P[dr[i].second].tc;cost+=abs(cr-r)+abs(cc-c);cr=r;cc=c;}if(cost<bc){bc=cost;best=perm;}}while(next_permutation(perm.begin(),perm.end()));\n            auto[k,di]=dr[best[0]];\n            if(hld[k]==di&&g[P[di].tr][P[di].tc]==0){if(!dropfp(k,di))cbh(k);any=true;prog=true;}\n        }}\n        // Step 2: weighted score + extra pickups (no explicit drop - let Step 1 handle)\n        if(!prog){\n            double bv=1e18;int fi=-1;\n            for(auto&[src,di]:sm){\n                if(P[di].done||g[P[di].tr][P[di].tc]!=0)continue;\n                int d=abs(rx-src.first)+abs(ry-src.second);\n                double val=d+0.03*tsp_rank[di];\n                if(val<bv){bv=val;fi=di;}\n            }\n            if(fi>=0){\n                int k=pickfp(fi,P[fi].sr,P[fi].sc);\n                if(k>=0){\n                    for(int ex=0;ex<nfp-1;ex++){\n                        int fp=0;for(int j=0;j<nfp;j++)if(hld[j]<0)fp++;\n                        if(fp==0)break;\n                        int b2=-1,bd2=N;\n                        for(auto&[src2,di2]:sm){\n                            if(P[di2].done||g[P[di2].tr][P[di2].tc]!=0)continue;\n                            int d=abs(rx-src2.first)+abs(ry-src2.second);\n                            if(d<bd2){bd2=d;b2=di2;}\n                        }\n                        if(b2<0)break;\n                        pickfp(b2,P[b2].sr,P[b2].sc);\n                    }\n                    prog=true;\n                }\n            }\n        }\n        // Step 3: cycle break\n        if(!prog){for(int k=0;k<nfp;k++)if(hld[k]>=0){if(cbh(k))prog=true;break;}\n            if(!prog){int ci=-1,bd=INT_MAX;for(auto&[src,di]:sm){int d=abs(rx-src.first)+abs(ry-src.second);if(d<bd){bd=d;ci=di;}}if(ci>=0){int k=pickfp(ci,P[ci].sr,P[ci].sc);if(k>=0&&cbh(k))prog=true;}}}\n        if(prog)stall=0;\n        else{stall++;if(stall>300)break;\n            string op(2*Vp,'.');for(int k=0;k<nfp;k++){int fr=rx+DR[fpd[k]],fc=ry+DC[fpd[k]];if(fr<0||fr>=N||fc<0||fc>=N)continue;if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}}ops.push_back(op);}\n    }\n    for(auto&op:ops)cout<<op<<\"\\n\";\n    return 0;\n}","ahc039":"#include <bits/stdc++.h>\nusing namespace std;\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    using Clock=chrono::steady_clock;auto t0=Clock::now();\n    auto elMs=[&](){return(long long)chrono::duration_cast<chrono::milliseconds>(Clock::now()-t0).count();};\n    int N;cin>>N;int M=2*N;\n    vector<int>X(M),Y(M),W(M);\n    for(int i=0;i<M;i++){cin>>X[i]>>Y[i];W[i]=(i<N)?1:-1;}\n    const int CMAX=100000;\n    {int x1=X[0],x2=(x1<CMAX)?x1+1:x1-1,y1=Y[0],y2=(y1<CMAX)?y1+1:y1-1;\n     if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n     cout<<4<<\"\\n\"<<x1<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y2<<\"\\n\"<<x1<<\" \"<<y2<<\"\\n\";}\n    struct FE{int key,other,w;};\n    vector<FE>bx(M),by(M);\n    {vector<int>idx(M);iota(idx.begin(),idx.end(),0);\n     sort(idx.begin(),idx.end(),[&](int a,int b){return X[a]<X[b];});\n     for(int i=0;i<M;i++)bx[i]={X[idx[i]],Y[idx[i]],W[idx[i]]};\n     iota(idx.begin(),idx.end(),0);\n     sort(idx.begin(),idx.end(),[&](int a,int b){return Y[a]<Y[b];});\n     for(int i=0;i<M;i++)by[i]={Y[idx[i]],X[idx[i]],W[idx[i]]};}\n    auto kadane=[](const vector<FE>&f,int lo,int hi)->pair<int,int>{\n        int cur=0,cs=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n        for(int i=0,n=(int)f.size();i<n;){int xv=f[i].key,gs=0;\n            while(i<n&&f[i].key==xv){if(f[i].other>=lo&&f[i].other<=hi)gs+=f[i].w;i++;}\n            if(!ir){if(gs>0){cs=xv;cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs;bhi=xv;}}}\n            else{cur+=gs;if(cur>mx){mx=cur;blo=cs;bhi=xv;}if(cur<0){cur=0;ir=false;}}}\n        return{blo,bhi};};\n    auto evalRect=[&](int x1,int x2,int y1,int y2){int s=0;\n        for(int i=0;i<M;i++)if(X[i]>=x1&&X[i]<=x2&&Y[i]>=y1&&Y[i]<=y2)s+=W[i];return s;};\n    auto coordDescent=[&](int x1,int x2,int y1,int y2)->tuple<int,int,int,int,int>{\n        x1=max(0,min(CMAX,x1));x2=max(0,min(CMAX,x2));y1=max(0,min(CMAX,y1));y2=max(0,min(CMAX,y2));\n        if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n        int px1=-1,px2=-1,py1=-1,py2=-1;\n        for(int it=0;it<20;it++){if(x1==px1&&x2==px2&&y1==py1&&y2==py2)break;\n            px1=x1;px2=x2;py1=y1;py2=y2;\n            auto[nx1,nx2]=kadane(bx,y1,y2);if(nx1>=0){x1=nx1;x2=nx2;}\n            auto[ny1,ny2]=kadane(by,x1,x2);if(ny1>=0){y1=ny1;y2=ny2;}}\n        return make_tuple(evalRect(x1,x2,y1,y2),x1,x2,y1,y2);};\n    const int G=200,step=CMAX/G;\n    vector<vector<int>>grid(G,vector<int>(G,0));\n    for(int i=0;i<M;i++)grid[min(X[i]/step,G-1)][min(Y[i]/step,G-1)]+=W[i];\n    int bgx1=0,bgx2=0,bgy1=0,bgy2=0,bgs=0;\n    for(int gx1=0;gx1<G;gx1++){vector<int>cs(G,0);\n        for(int gx2=gx1;gx2<G;gx2++){for(int gy=0;gy<G;gy++)cs[gy]+=grid[gx2][gy];\n            int cur=0,cst=0,mx=0,ms=0,me=-1;\n            for(int gy=0;gy<G;gy++){cur+=cs[gy];if(cur>mx){mx=cur;ms=cst;me=gy;}if(cur<0){cur=0;cst=gy+1;}}\n            if(me>=0&&mx>bgs){bgs=mx;bgx1=gx1;bgx2=gx2;bgy1=ms;bgy2=me;}}}\n    int ix1=bgx1*step,ix2=min((bgx2+1)*step,CMAX),iy1=bgy1*step,iy2=min((bgy2+1)*step,CMAX);\n    int gscore=-1,rx1=0,rx2=1,ry1=0,ry2=1;\n    auto tryRun=[&](int x1,int x2,int y1,int y2){\n        auto[s,a,b,c,d]=coordDescent(x1,x2,y1,y2);\n        if(s>gscore){gscore=s;rx1=a;rx2=b;ry1=c;ry2=d;}};\n    tryRun(ix1,ix2,iy1,iy2);tryRun(0,CMAX,0,CMAX);\n    {long long cx=0,cy=0;for(int i=0;i<N;i++){cx+=X[i];cy+=Y[i];}cx/=N;cy/=N;\n     tryRun((int)cx-40000,(int)cx+40000,(int)cy-40000,(int)cy+40000);\n     tryRun((int)cx-15000,(int)cx+15000,(int)cy-15000,(int)cy+15000);}\n    mt19937 rng(42);\n    for(int trial=0;;trial++){\n        if(trial%100==0&&elMs()>1700)break;\n        int seed=rng()%N;int cx=X[seed],cy=Y[seed];int half;\n        switch(rng()%4){case 0:half=200+rng()%800;break;case 1:half=1000+rng()%9000;break;\n            case 2:half=10000+rng()%20000;break;default:half=30000+rng()%20000;break;}\n        tryRun(cx-half,cx+half,cy-half,cy+half);}\n    auto findArm=[&](const vector<tuple<int,int,int>>&fish,int clo,int chi)->tuple<int,int,int,int>{\n        vector<int>xs;\n        for(auto&[s,c,w]:fish)if(c>=clo&&c<=chi)xs.push_back(c);\n        sort(xs.begin(),xs.end());xs.erase(unique(xs.begin(),xs.end()),xs.end());\n        if(xs.empty())return{0,-1,-1,0};\n        int kx=(int)xs.size();vector<int>cum(kx,0);int bsc=0,bc1=-1,bc2=-1,bsw=0;\n        for(int i=0,n=(int)fish.size();i<n;){int csw=get<0>(fish[i]);\n            while(i<n&&get<0>(fish[i])==csw){auto&[s2,c,w]=fish[i];++i;\n                if(c>=clo&&c<=chi)cum[(int)(lower_bound(xs.begin(),xs.end(),c)-xs.begin())]+=w;}\n            int cur=0,cs2=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n            for(int j=0;j<kx;j++){int gs=cum[j];\n                if(!ir){if(gs>0){cs2=xs[j];cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs2;bhi=xs[j];}}}\n                else{cur+=gs;if(cur>mx){mx=cur;blo=cs2;bhi=xs[j];}if(cur<0){cur=0;ir=false;}}}\n            if(mx>bsc){bsc=mx;bc1=blo;bc2=bhi;bsw=csw;}}\n        return{bsc,bc1,bc2,bsw};};\n    vector<tuple<int,int,int>>ft,fb,fr,fl;\n    for(int i=0;i<M;i++){\n        if(Y[i]>ry2&&X[i]>=rx1&&X[i]<=rx2)ft.emplace_back(Y[i],X[i],W[i]);\n        if(Y[i]<ry1&&X[i]>=rx1&&X[i]<=rx2)fb.emplace_back(-Y[i],X[i],W[i]);\n        if(X[i]>rx2&&Y[i]>=ry1&&Y[i]<=ry2)fr.emplace_back(X[i],Y[i],W[i]);\n        if(X[i]<rx1&&Y[i]>=ry1&&Y[i]<=ry2)fl.emplace_back(-X[i],Y[i],W[i]);}\n    sort(ft.begin(),ft.end());sort(fb.begin(),fb.end());sort(fr.begin(),fr.end());sort(fl.begin(),fl.end());\n    auto[ts,tax1,tax2,tay2]=findArm(ft,rx1,rx2);\n    auto[bms,bax1,bax2,neg_bay]=findArm(fb,rx1,rx2);int bay1=-neg_bay;\n    auto[rms,ray1,ray2,rax2]=findArm(fr,ry1,ry2);\n    auto[ls,lay1,lay2,neg_lax]=findArm(fl,ry1,ry2);int lax1=-neg_lax;\n    bool ht=ts>0&&tax1>=rx1&&tax2<=rx2&&tax1<tax2&&tay2>ry2;\n    bool hb=bms>0&&bax1>=rx1&&bax2<=rx2&&bax1<bax2&&bay1<ry1;\n    bool hr=rms>0&&ray1>=ry1&&ray2<=ry2&&ray1<ray2&&rax2>rx2;\n    bool hl=ls>0&&lay1>=ry1&&lay2<=ry2&&lay1<lay2&&lax1<rx1;\n    int ct=ht?2*(tay2-ry2):0,cb=hb?2*(ry1-bay1):0,cr_=hr?2*(rax2-rx2):0,cl=hl?2*(rx1-lax1):0;\n    int P_base=2*(rx2-rx1)+2*(ry2-ry1),budget=400000-P_base;\n    int total_cost=ct+cb+cr_+cl;\n    if(total_cost>budget){\n        vector<pair<double,int>>ae;\n        if(ht&&ct>0)ae.push_back({(double)ts/ct,0});\n        if(hb&&cb>0)ae.push_back({(double)bms/cb,1});\n        if(hr&&cr_>0)ae.push_back({(double)rms/cr_,2});\n        if(hl&&cl>0)ae.push_back({(double)ls/cl,3});\n        sort(ae.begin(),ae.end());\n        for(auto&[e,idx]:ae){if(total_cost<=budget)break;\n            if(idx==0){ht=false;total_cost-=ct;}else if(idx==1){hb=false;total_cost-=cb;}\n            else if(idx==2){hr=false;total_cost-=cr_;}else{hl=false;total_cost-=cl;}}}\n    struct AI{int c1,c2,sw,score,side;};\n    vector<AI>all_arms;\n    if(ht)all_arms.push_back({tax1,tax2,tay2,ts,0});\n    if(hb)all_arms.push_back({bax1,bax2,-bay1,bms,1});\n    if(hr)all_arms.push_back({ray1,ray2,rax2,rms,2});\n    if(hl)all_arms.push_back({lay1,lay2,-lax1,ls,3});\n    int used_budget=total_cost,used_vtx=4*(int)all_arms.size();\n    auto armCostFn=[&](const AI&a)->int{\n        if(a.side==0)return 2*(a.sw-ry2);if(a.side==1)return 2*(ry1+a.sw);\n        if(a.side==2)return 2*(a.sw-rx2);return 2*(rx1+a.sw);};\n    vector<AI>sub_cands;\n    function<void(const vector<tuple<int,int,int>>&,int,int,int,int)>far;\n    far=[&](const vector<tuple<int,int,int>>&fish,int clo,int chi,int side,int dep){\n        if(clo>chi||dep<=0||elMs()>1920)return;\n        auto[sc,c1,c2,sw]=findArm(fish,clo,chi);\n        if(sc<=0||c1<0||c1>=c2)return;\n        sub_cands.push_back({c1,c2,sw,sc,side});\n        far(fish,clo,c1-1,side,dep-1);far(fish,c2+1,chi,side,dep-1);};\n    // Depth=3 for richer sub-arm search\n    if(ht){far(ft,rx1,tax1-1,0,3);far(ft,tax2+1,rx2,0,3);}\n    if(hb){far(fb,rx1,bax1-1,1,3);far(fb,bax2+1,rx2,1,3);}\n    if(hr){far(fr,ry1,ray1-1,2,3);far(fr,ray2+1,ry2,2,3);}\n    if(hl){far(fl,ry1,lay1-1,3,3);far(fl,lay2+1,ry2,3,3);}\n    sort(sub_cands.begin(),sub_cands.end(),[](const AI&a,const AI&b){return a.score>b.score;});\n    for(auto&sc:sub_cands){int c=armCostFn(sc);\n        if(c<=0||used_budget+c>budget||used_vtx+4>996)continue;\n        all_arms.push_back(sc);used_budget+=c;used_vtx+=4;}\n    auto outR=[&](int x1,int x2,int y1,int y2){\n        if(x1>=x2){if(x2<CMAX)x2++;else x1--;}if(y1>=y2){if(y2<CMAX)y2++;else y1--;}\n        cout<<4<<\"\\n\"<<x1<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y2<<\"\\n\"<<x1<<\" \"<<y2<<\"\\n\";};\n    if(all_arms.empty()){if(gscore>=1)outR(rx1,rx2,ry1,ry2);return 0;}\n    vector<AI>ta,ba,ra,la;\n    for(auto&a:all_arms){if(a.side==0)ta.push_back(a);else if(a.side==1)ba.push_back(a);\n        else if(a.side==2)ra.push_back(a);else la.push_back(a);}\n    sort(ba.begin(),ba.end(),[](const AI&a,const AI&b){return a.c1<b.c1;});\n    sort(ra.begin(),ra.end(),[](const AI&a,const AI&b){return a.c1<b.c1;});\n    sort(ta.begin(),ta.end(),[](const AI&a,const AI&b){return a.c2>b.c2;});\n    sort(la.begin(),la.end(),[](const AI&a,const AI&b){return a.c2>b.c2;});\n    vector<pair<int,int>>v;\n    v.push_back({rx1,ry1});\n    {int cx=rx1;for(auto&a:ba){int b1=-a.sw;if(a.c1>cx)v.push_back({a.c1,ry1});\n        v.push_back({a.c1,b1});v.push_back({a.c2,b1});v.push_back({a.c2,ry1});cx=a.c2;}}\n    v.push_back({rx2,ry1});\n    {int cy=ry1;for(auto&a:ra){if(a.c1>cy)v.push_back({rx2,a.c1});\n        v.push_back({a.sw,a.c1});v.push_back({a.sw,a.c2});v.push_back({rx2,a.c2});cy=a.c2;}}\n    v.push_back({rx2,ry2});\n    {int cx=rx2;for(auto&a:ta){if(a.c2<cx)v.push_back({a.c2,ry2});\n        v.push_back({a.c2,a.sw});v.push_back({a.c1,a.sw});v.push_back({a.c1,ry2});cx=a.c1;}}\n    v.push_back({rx1,ry2});\n    {int cy=ry2;for(auto&a:la){int lx=-a.sw;if(a.c2<cy)v.push_back({rx1,a.c2});\n        v.push_back({lx,a.c2});v.push_back({lx,a.c1});v.push_back({rx1,a.c1});cy=a.c1;}}\n    vector<pair<int,int>>res;\n    for(auto&p:v){if(res.empty()||res.back()!=p)res.push_back(p);}\n    while(res.size()>1&&res.front()==res.back())res.pop_back();\n    if((int)res.size()<4){outR(rx1,rx2,ry1,ry2);return 0;}\n    {set<pair<int,int>>vs(res.begin(),res.end());\n     if((int)vs.size()!=(int)res.size()){outR(rx1,rx2,ry1,ry2);return 0;}}\n    cout<<(int)res.size()<<\"\\n\";\n    for(auto&[x,y]:res)cout<<x<<\" \"<<y<<\"\\n\";\n    return 0;}","ahc040":"#pragma GCC optimize(\"O3,unroll-loops\")\n#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint N, T;\nvector<double> W, H;\ndouble sW, sH, mxW, mxH, totA;\n\nstruct Op { int p, r; char d; int b; };\n\npair<ll,ll> simulate(const vector<Op>& ops) {\n    vector<ll> x0(N,0),y0(N,0),x1(N,0),y1(N,0);\n    vector<bool> pl(N,false);\n    for (const auto& o : ops) {\n        int p = o.p;\n        ll w = max(1LL, llround(o.r ? H[p] : W[p]));\n        ll h = max(1LL, llround(o.r ? W[p] : H[p]));\n        if (o.d == 'U') {\n            ll xl = o.b >= 0 ? x1[o.b] : 0LL;\n            ll yt = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && x0[i] < xl+w && x1[i] > xl)\n                    yt = max(yt, y1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        } else {\n            ll yt = o.b >= 0 ? y1[o.b] : 0LL;\n            ll xl = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && y0[i] < yt+h && y1[i] > yt)\n                    xl = max(xl, x1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        }\n        pl[p] = true;\n    }\n    ll rW=0, rH=0;\n    for (int i = 0; i < N; i++)\n        if (pl[i]) { rW=max(rW,x1[i]); rH=max(rH,y1[i]); }\n    return {rW, rH};\n}\n\n// col=false: shelf packing (rows); col=true: column packing\n// For col=false, line0 uses U, rest use L\n// For col=true,  line0 uses L, rest use U\nvector<Op> make_pack(const vector<int>& rot, double tgt, bool col) {\n    vector<Op> ops; ops.reserve(N);\n    int cl = -1; double cm = 0;\n    vector<int> lr; vector<double> lc;\n    int p0 = -1;\n    for (int i = 0; i < N; i++) {\n        double m = col ? (rot[i] ? W[i] : H[i]) : (rot[i] ? H[i] : W[i]);\n        double c = col ? (rot[i] ? H[i] : W[i]) : (rot[i] ? W[i] : H[i]);\n        if (cl < 0 || cm + m > tgt) {\n            cl++; cm = m;\n            lr.push_back(i); lc.push_back(c);\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', -1});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        } else {\n            cm += m;\n            if (c > lc[cl]) { lc[cl]=c; lr[cl]=i; }\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', p0});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        }\n    }\n    return ops;\n}\n\ndouble calc_score(const vector<int>& rot, double tgt, bool col) {\n    auto [a,b] = simulate(make_pack(rot, tgt, col));\n    return (double)(a+b);\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    double sigma;\n    cin >> N >> T >> sigma;\n    W.resize(N); H.resize(N);\n    for (int i = 0; i < N; i++) cin >> W[i] >> H[i];\n\n    sW=sH=mxW=mxH=totA=0;\n    for (int i = 0; i < N; i++) {\n        sW+=W[i]; sH+=H[i];\n        mxW=max(mxW,W[i]); mxH=max(mxH,H[i]);\n        totA+=W[i]*H[i];\n    }\n\n    const double BUDGET = 2600.0;\n    auto t0 = chrono::steady_clock::now();\n    auto now = [&]() {\n        return chrono::duration<double,milli>(chrono::steady_clock::now()-t0).count();\n    };\n\n    vector<int> g_rot;\n    double g_tgt=0, g_score=1e18;\n    bool g_col=false;\n\n    for (int t = 0; t < T; t++) {\n        double ts = now();\n        double per = max(1.0, (BUDGET - ts) / (T - t));\n        double dl = ts + per * 0.95;\n\n        mt19937 rng(t * 1234567891u ^ 987654321u);\n        uniform_real_distribution<double> uni(0,1);\n\n        bool col;\n        double lo, hi, tgt;\n        vector<int> rot(N);\n\n        if (t < (T+1)/2) {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            // Init rotation: minimize cross-dim\n            for (int i = 0; i < N; i++)\n                rot[i] = col ? (H[i]<W[i] ? 1:0) : (W[i]<H[i] ? 1:0);\n            int nf = max(1, (int)sqrt((double)t+0.1));\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.4)));\n        } else if (g_score < 1e17) {\n            rot=g_rot; col=g_col; tgt=g_tgt;\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            int nf = max(1, N/8);\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.12)));\n        } else {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            for (int i = 0; i < N; i++) rot[i] = rng()%2;\n        }\n\n        // Greedy rotation improvement\n        double cur = calc_score(rot, tgt, col);\n        for (int i = 0; i < N; i++) {\n            rot[i] ^= 1;\n            double ns = calc_score(rot, tgt, col);\n            if (ns < cur) cur = ns;\n            else rot[i] ^= 1;\n        }\n\n        vector<int> br=rot;\n        double bt=tgt;\n        bool bc=col;\n        double bs=cur;\n\n        double Th = cur*0.05+1.0;\n        double Tl = max(1.0, cur*1e-5);\n\n        // Simulated Annealing\n        for (int it=0; ; it++) {\n            if ((it&63)==0 && now()>=dl) break;\n            double frac = max(0.0, min(1.0, (now()-ts)/per));\n            double Tc = max(Tl, Th * pow(Tl/Th, frac));\n\n            int mv = rng()%10, fi=-1;\n            double ot=tgt;\n            bool oc=col;\n            double olo=lo, ohi=hi;\n\n            if (mv < 7) {\n                fi = rng()%N;\n                rot[fi] ^= 1;\n            } else if (mv < 9) {\n                tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.35)));\n            } else {\n                col ^= 1;\n                lo = col ? mxH : mxW;\n                hi = col ? sH  : sW;\n                tgt = max(lo, min(hi, ot));\n            }\n\n            double ns = calc_score(rot, tgt, col);\n            double d = ns - cur;\n            if (d <= 0 || uni(rng) < exp(-d/Tc)) {\n                cur = ns;\n                if (ns < bs) { bs=ns; br=rot; bt=tgt; bc=col; }\n            } else {\n                if (fi >= 0) rot[fi] ^= 1;\n                else if (mv < 9) tgt = ot;\n                else { col=oc; lo=olo; hi=ohi; tgt=ot; }\n            }\n        }\n\n        // Final greedy passes\n        for (int pass=0; pass<3; pass++) {\n            bool imp=false;\n            for (int i=0; i<N; i++) {\n                br[i] ^= 1;\n                double ns = calc_score(br, bt, bc);\n                if (ns < bs) { bs=ns; imp=true; }\n                else br[i] ^= 1;\n            }\n            if (!imp) break;\n        }\n\n        if (bs < g_score) { g_score=bs; g_rot=br; g_tgt=bt; g_col=bc; }\n\n        auto ops = make_pack(br, bt, bc);\n        cout << (int)ops.size() << \"\\n\";\n        for (const auto& op : ops)\n            cout << op.p << \" \" << op.r << \" \" << op.d << \" \" << op.b << \"\\n\";\n        cout.flush();\n\n        ll Wf, Hf;\n        cin >> Wf >> Hf;\n    }\n\n    return 0;\n}","ahc041":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\nint N,M,H,A[1000];\nvector<int>G[1000];\nint par[1000],dep[1000],ssm[1000],mdn[1000];\nvector<int>ch[1000];\nvoid dfs_init(int v){ssm[v]=A[v];mdn[v]=0;for(int c:ch[v]){dfs_init(c);ssm[v]+=ssm[c];mdn[v]=max(mdn[v],mdn[c]+1);}}\nvoid push_dep(int v,int d){dep[v]=d;for(int c:ch[v])push_dep(c,d+1);}\nbool in_sub(int w,int v){for(;w!=-1;w=par[w])if(w==v)return true;return false;}\nvoid pull_ssm(int v){for(;v!=-1;v=par[v]){int s=A[v];for(int c:ch[v])s+=ssm[c];ssm[v]=s;}}\nvoid pull_mdn(int v){for(;v!=-1;v=par[v]){int m=0;for(int c:ch[v])m=max(m,mdn[c]+1);mdn[v]=m;}}\nvoid do_move(int v,int np){int op=par[v];if(op!=-1){auto&c=ch[op];c.erase(find(c.begin(),c.end(),v));}par[v]=np;if(np!=-1){ch[np].push_back(v);push_dep(v,dep[np]+1);}else push_dep(v,0);if(op!=-1){pull_ssm(op);pull_mdn(op);}if(np!=-1){pull_ssm(np);pull_mdn(np);}}\nvoid rebuild(){for(int i=0;i<N;i++)ch[i].clear();fill(dep,dep+N,0);for(int v=0;v<N;v++)if(par[v]!=-1)ch[par[v]].push_back(v);for(int v=0;v<N;v++)if(par[v]==-1){queue<int>q;q.push(v);while(!q.empty()){int u=q.front();q.pop();for(int c:ch[u]){dep[c]=dep[u]+1;q.push(c);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nll compute_score(){ll s=0;for(int i=0;i<N;i++)s+=(ll)(dep[i]+1)*A[i];return s;}\nvoid run_greedy(mt19937&rng){for(int iter=0;;iter++){bool ok=false;vector<int>p(N);iota(p.begin(),p.end(),0);if(iter==0)sort(p.begin(),p.end(),[](int a,int b){return A[a]>A[b];});else shuffle(p.begin(),p.end(),rng);for(int v:p){int lim=H-1-mdn[v];if(lim<0)continue;int bp=par[v];ll bg=0;for(int w:G[v]){if(dep[w]>lim||in_sub(w,v))continue;ll g=(ll)(dep[w]+1-dep[v])*ssm[v];if(g>bg){bg=g;bp=w;}}if(bg>0){do_move(v,bp);ok=true;}}if(!ok)break;}}\nvoid build_bfs(vector<int>&ord){fill(par,par+N,-1);fill(dep,dep+N,0);for(int i=0;i<N;i++)ch[i].clear();vector<bool>vis(N,false);for(int s:ord){if(vis[s])continue;queue<int>q;q.push(s);vis[s]=true;while(!q.empty()){int v=q.front();q.pop();if(dep[v]>=H)continue;for(int u:G[v])if(!vis[u]){vis[u]=true;par[u]=v;dep[u]=dep[v]+1;ch[v].push_back(u);q.push(u);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nvoid greedy_one(int v,ll&cur){if(dep[v]+mdn[v]>=H)return;int lim=H-1-mdn[v];int bp=par[v];ll bg=0;for(int w:G[v]){if(dep[w]>lim||in_sub(w,v))continue;ll g=(ll)(dep[w]+1-dep[v])*ssm[v];if(g>bg){bg=g;bp=w;}}if(bg>0){do_move(v,bp);cur+=bg;}}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>H;for(int i=0;i<N;i++)cin>>A[i];\n    for(int i=0;i<M;i++){int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}\n    for(int i=0;i<N;i++){int x,y;cin>>x>>y;}\n    auto t0=chrono::steady_clock::now();\n    mt19937 rng(42);\n    ll best_sc=-1;vector<int>best_par(N);\n    for(int trial=0;;trial++){\n        if(chrono::duration<double>(chrono::steady_clock::now()-t0).count()>0.3)break;\n        vector<int>ord(N);iota(ord.begin(),ord.end(),0);\n        if(trial==0)sort(ord.begin(),ord.end(),[](int a,int b){return A[a]<A[b];});\n        else shuffle(ord.begin(),ord.end(),rng);\n        build_bfs(ord);run_greedy(rng);\n        ll sc=compute_score();if(sc>best_sc){best_sc=sc;copy(par,par+N,best_par.begin());}\n    }\n    copy(best_par.begin(),best_par.end(),par);rebuild();ll cur=best_sc;\n    uniform_real_distribution<double>uni(0,1);\n    auto ts=chrono::steady_clock::now();\n    double sa_t=max(0.05,1.82-chrono::duration<double>(ts-t0).count());\n    double T=1000.0;\n    for(long long step=0;;step++){\n        if(step%10000==0){double t=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(t>=sa_t)break;T=1000.0*pow(0.001,t/sa_t);}\n        int v=rng()%N;int lim=H-1-mdn[v];if(lim<0)continue;\n        if(G[v].empty())continue;int w=G[v][rng()%G[v].size()];\n        if(w==par[v]||dep[w]>lim||in_sub(w,v))continue;\n        ll gain=(ll)(dep[w]+1-dep[v])*ssm[v];\n        if(gain>0||(T>0.01&&uni(rng)<exp((double)gain/T))){\n            int op=par[v];\n            do_move(v,w);cur+=gain;\n            if(op!=-1)greedy_one(op,cur);\n            if(gain>0)greedy_one(v,cur);\n            if(cur>best_sc){best_sc=cur;copy(par,par+N,best_par.begin());}\n        }\n    }\n    copy(best_par.begin(),best_par.end(),par);rebuild();\n    run_greedy(rng);{ll sc=compute_score();if(sc>best_sc)copy(par,par+N,best_par.begin());}\n    for(int v=0;v<N;v++){if(v)cout<<' ';cout<<best_par[v];}cout<<'\\n';\n}","ahc042":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,OR_[42],OC_[42],ctop_[21],cbot_[21],rleft_[21],rright_[21];\nint gcost(int d,int dep){return(d==0||d==2)?2*(dep+1):2*(N-dep);}\nint odep(int k,int d){return(d<=1)?OR_[k]:OC_[k];}\nint ad_[42],ax_[42];\nvector<int>gv[4][21];\nvoid ins(int d,int ax,int v){auto&vec=gv[d][ax];vec.insert(lower_bound(vec.begin(),vec.end(),v),v);}\nvoid del(int d,int ax,int v){auto&vec=gv[d][ax];vec.erase(lower_bound(vec.begin(),vec.end(),v));}\nint gcv(int d,int ax){if(gv[d][ax].empty())return 0;return gcost(d,(d==0||d==2)?gv[d][ax].back():gv[d][ax].front());}\nbool vgrp(int k,int d,int ax){int r=OR_[k],c=OC_[k],kd=(d<=1)?r:c;if(d==0)return ax==c&&kd<ctop_[ax];if(d==1)return ax==c&&kd>cbot_[ax];if(d==2)return ax==r&&kd<rleft_[ax];return ax==r&&kd>rright_[ax];}\nint tc(){int t=0;for(int d=0;d<4;d++)for(int i=0;i<N;i++)t+=gcv(d,i);return t;}\nint g1(int k,int nd,int nx){if((ad_[k]==nd&&ax_[k]==nx)||!vgrp(k,nd,nx))return 0;int od=ad_[k],ox=ax_[k],kdo=odep(k,od),ndo=odep(k,nd);int oc=gcv(od,ox)+gcv(nd,nx);del(od,ox,kdo);ins(nd,nx,ndo);int nc=gcv(od,ox)+gcv(nd,nx);ins(od,ox,kdo);del(nd,nx,ndo);return oc-nc;}\nint g2(int a,int b,int nd,int nx){if(!vgrp(a,nd,nx)||!vgrp(b,nd,nx))return 0;bool at=(ad_[a]==nd&&ax_[a]==nx),bt=(ad_[b]==nd&&ax_[b]==nx);if(at&&bt)return 0;if(at)return g1(b,nd,nx);if(bt)return g1(a,nd,nx);int da=ad_[a],dax=ax_[a],db=ad_[b],dbx=ax_[b];bool sm=(da==db&&dax==dbx);int oc=gcv(da,dax);if(!sm)oc+=gcv(db,dbx);oc+=gcv(nd,nx);int ao=odep(a,da),bo=odep(b,db),an=odep(a,nd),bn=odep(b,nd);del(da,dax,ao);del(db,dbx,bo);ins(nd,nx,an);ins(nd,nx,bn);int nc=gcv(da,dax);if(!sm)nc+=gcv(db,dbx);nc+=gcv(nd,nx);del(nd,nx,an);del(nd,nx,bn);ins(da,dax,ao);ins(db,dbx,bo);return oc-nc;}\nvoid mv1(int k,int nd,int nx){del(ad_[k],ax_[k],odep(k,ad_[k]));ad_[k]=nd;ax_[k]=nx;ins(nd,nx,odep(k,nd));}\nvoid mv2(int a,int b,int nd,int nx){del(ad_[a],ax_[a],odep(a,ad_[a]));del(ad_[b],ax_[b],odep(b,ad_[b]));ad_[a]=nd;ax_[a]=nx;ad_[b]=nd;ax_[b]=nx;ins(nd,nx,odep(a,nd));ins(nd,nx,odep(b,nd));}\nvector<int>co[21],ro[21];\nvoid ls(){bool imp=true;while(imp){imp=false;int bg=0,bt=-1,bk=-1,ba=-1,bb=-1,bd=-1,bx=-1;for(int k=0;k<M;k++){int r=OR_[k],c=OC_[k];auto t=[&](int d,int ax){int gg=g1(k,d,ax);if(gg>bg){bg=gg;bt=1;bk=k;bd=d;bx=ax;}};if(r<ctop_[c])t(0,c);if(r>cbot_[c])t(1,c);if(c<rleft_[r])t(2,r);if(c>rright_[r])t(3,r);}for(int j=0;j<N;j++){int n=co[j].size();for(int ai=0;ai<n;ai++)for(int bi=ai+1;bi<n;bi++){int a=co[j][ai],b=co[j][bi];auto t=[&](int d,int ax){int gg=g2(a,b,d,ax);if(gg>bg){bg=gg;bt=2;ba=a;bb=b;bd=d;bx=ax;}};t(0,j);t(1,j);}}for(int i=0;i<N;i++){int n=ro[i].size();for(int ai=0;ai<n;ai++)for(int bi=ai+1;bi<n;bi++){int a=ro[i][ai],b=ro[i][bi];auto t=[&](int d,int ax){int gg=g2(a,b,d,ax);if(gg>bg){bg=gg;bt=2;ba=a;bb=b;bd=d;bx=ax;}};t(2,i);t(3,i);}}if(bg>0){if(bt==1)mv1(bk,bd,bx);else mv2(ba,bb,bd,bx);imp=true;}}}\nint main(){ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N;vector<string>brd(N);for(int i=0;i<N;i++)cin>>brd[i];M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(brd[i][j]=='x'){OR_[M]=i;OC_[M]=j;M++;}if(!M)return 0;fill(ctop_,ctop_+N,N);fill(cbot_,cbot_+N,-1);fill(rleft_,rleft_+N,N);fill(rright_,rright_+N,-1);for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(brd[i][j]=='o'){ctop_[j]=min(ctop_[j],i);cbot_[j]=max(cbot_[j],i);rleft_[i]=min(rleft_[i],j);rright_[i]=max(rright_[i],j);}for(int k=0;k<M;k++){co[OC_[k]].push_back(k);ro[OR_[k]].push_back(k);}\nmt19937 rng(42);int bc=INT_MAX;int bad[42],bax[42];\nfor(int trial=0;trial<30;trial++){for(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int ki=0;ki<M;ki++){int r=OR_[ki],c=OC_[ki];vector<pair<int,int>>opts;if(r<ctop_[c])opts.push_back({0,c});if(r>cbot_[c])opts.push_back({1,c});if(c<rleft_[r])opts.push_back({2,r});if(c>rright_[r])opts.push_back({3,r});int gd,gax;if(trial==0){int bcc=INT_MAX;gd=-1;gax=-1;for(auto[d,ax]:opts){int cc=gcost(d,odep(ki,d));if(cc<bcc){bcc=cc;gd=d;gax=ax;}}}else{auto[d,ax]=opts[rng()%opts.size()];gd=d;gax=ax;}ad_[ki]=gd;ax_[ki]=gax;ins(gd,gax,odep(ki,gd));}ls();int t=tc();if(t<bc){bc=t;for(int k=0;k<M;k++){bad[k]=ad_[k];bax[k]=ax_[k];}}}\nfor(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int k=0;k<M;k++){ad_[k]=bad[k];ax_[k]=bax[k];ins(ad_[k],ax_[k],odep(k,ad_[k]));}\nconst char dirs[]=\"UDLR\",revs[]=\"DURL\";for(int d=0;d<4;d++)for(int ax=0;ax<N;ax++){if(gv[d][ax].empty())continue;int rep=(d==0||d==2)?gv[d][ax].back():gv[d][ax].front();int s=(d==0||d==2)?rep+1:N-rep;for(int k=0;k<s;k++)cout<<dirs[d]<<' '<<ax<<'\\n';for(int k=0;k<s;k++)cout<<revs[d]<<' '<<ax<<'\\n';}return 0;}","ahc044":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=100;\nint N,L,T[MAXN],a[MAXN],b[MAXN],cv[MAXN],fv[MAXN],flow[MAXN];\nvoid computeFlow(){fill(flow,flow+N,0);for(int i=0;i<N;i++){flow[a[i]]+=cv[i];flow[b[i]]+=fv[i];}flow[0]++;}\nlong long flowErr(){long long e=0;for(int j=0;j<N;j++)e+=abs(flow[j]-T[j]);return e;}\nbool checkFwd(){bool vis[MAXN]={};int q[MAXN],qh=0,qt=0;vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];if(!vis[a[x]]){vis[a[x]]=true;q[qt++]=a[x];}if(!vis[b[x]]){vis[b[x]]=true;q[qt++]=b[x];}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nbool checkBwd(){if(T[0]==0)return true;static int rl[MAXN][2*MAXN],rc[MAXN];static bool vis[MAXN];int q[MAXN],qh=0,qt=0;fill(rc,rc+N,0);for(int i=0;i<N;i++){rl[a[i]][rc[a[i]]++]=i;rl[b[i]][rc[b[i]]++]=i;}fill(vis,vis+N,false);vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];for(int k=0;k<rc[x];k++){int y=rl[x][k];if(!vis[y]){vis[y]=true;q[qt++]=y;}}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nvoid fixFwdConn(){for(int pass=0;pass<N;pass++){bool vis[MAXN]={};int q[MAXN],qh=0,qt=0;vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];if(!vis[a[x]]){vis[a[x]]=true;q[qt++]=a[x];}if(!vis[b[x]]){vis[b[x]]=true;q[qt++]=b[x];}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bd=(long long)4e18;int bi=-1;bool bA=false;for(int i=0;i<N;i++){if(!vis[i])continue;if(a[i]!=u){int oa=a[i],w=cv[i];long long d=(w>0)?((long long)(abs(flow[oa]-w-T[oa])-abs(flow[oa]-T[oa]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bd){bd=d;bi=i;bA=true;}}if(b[i]!=u){int ob=b[i],w=fv[i];long long d=(w>0)?((long long)(abs(flow[ob]-w-T[ob])-abs(flow[ob]-T[ob]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bd){bd=d;bi=i;bA=false;}}}if(bi<0)break;if(bA){if(cv[bi]>0){flow[a[bi]]-=cv[bi];flow[u]+=cv[bi];}a[bi]=u;}else{if(fv[bi]>0){flow[b[bi]]-=fv[bi];flow[u]+=fv[bi];}b[bi]=u;}}}\nvoid fixBwdConn(){if(T[0]==0)return;for(int pass=0;pass<N;pass++){static int rl[MAXN][2*MAXN],rc[MAXN];static bool vis[MAXN];int q[MAXN],qh=0,qt=0;fill(rc,rc+N,0);for(int i=0;i<N;i++){rl[a[i]][rc[a[i]]++]=i;rl[b[i]][rc[b[i]]++]=i;}fill(vis,vis+N,false);vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];for(int k=0;k<rc[x];k++){int y=rl[x][k];if(!vis[y]){vis[y]=true;q[qt++]=y;}}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bd=(long long)4e18;int bk=-1;bool bA=false;for(int k=0;k<N;k++){if(!vis[k])continue;if(a[u]!=k){int oa=a[u];a[u]=k;bool fok=checkFwd();a[u]=oa;if(!fok)continue;int w=cv[u];long long d=(w>0)?((long long)(abs(flow[oa]-w-T[oa])-abs(flow[oa]-T[oa]))+(long long)(abs(flow[k]+w-T[k])-abs(flow[k]-T[k]))):0LL;if(d<bd){bd=d;bk=k;bA=true;}}if(b[u]!=k){int ob=b[u];b[u]=k;bool fok=checkFwd();b[u]=ob;if(!fok)continue;int w=fv[u];long long d=(w>0)?((long long)(abs(flow[ob]-w-T[ob])-abs(flow[ob]-T[ob]))+(long long)(abs(flow[k]+w-T[k])-abs(flow[k]-T[k]))):0LL;if(d<bd){bd=d;bk=k;bA=false;}}}if(bk<0)break;if(bA){if(cv[u]>0){flow[a[u]]-=cv[u];flow[bk]+=cv[u];}a[u]=bk;}else{if(fv[u]>0){flow[b[u]]-=fv[u];flow[bk]+=fv[u];}b[u]=bk;}}}\nvoid flowSearch(){long long ce=flowErr();bool imp=true;while(imp){imp=false;for(int i=0;i<N;i++)for(int t2=0;t2<2;t2++){int old=t2?b[i]:a[i],w=t2?fv[i]:cv[i];int bj=-1;long long bd=0;for(int j=0;j<N;j++){if(j==old)continue;long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[j]+w-T[j])-abs(flow[j]-T[j]))):0LL;if(d<bd){bd=d;bj=j;}}if(bj>=0){if(w>0){flow[old]-=w;flow[bj]+=w;}ce+=bd;if(t2)b[i]=bj;else a[i]=bj;imp=true;}}}}\nlong long simulateFull(int co[],int od[],int ed[]){int cnt[MAXN]={},vc[MAXN]={};fill(od,od+N,0);fill(ed,ed+N,0);int cur=0;cnt[0]=vc[0]=1;for(int w=2;w<=L;w++){if(vc[cur]&1){od[cur]++;cur=a[cur];}else{ed[cur]++;cur=b[cur];}cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++){co[j]=cnt[j];e+=abs(cnt[j]-T[j]);}return e;}\nlong long simulate(){int cnt[MAXN]={},vc[MAXN]={};int cur=0;cnt[0]=vc[0]=1;for(int w=2;w<=L;w++){int nxt=(vc[cur]&1)?a[cur]:b[cur];cur=nxt;cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++)e+=abs(cnt[j]-T[j]);return e;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>L;for(int i=0;i<N;i++)cin>>T[i];\n    for(int i=0;i<N;i++){cv[i]=(T[i]+1)/2;fv[i]=T[i]/2;}\n    for(int i=0;i<N;i++)a[i]=b[i]=0;\n    vector<tuple<int,int,int>>items;\n    for(int i=0;i<N;i++){items.emplace_back(cv[i],0,i);items.emplace_back(fv[i],1,i);}\n    sort(items.rbegin(),items.rend());\n    int rem[MAXN];for(int j=0;j<N;j++)rem[j]=T[j];if(rem[0]>0)rem[0]--;\n    priority_queue<pair<int,int>>pq;for(int j=0;j<N;j++)pq.push({rem[j],j});\n    for(auto&[w,type,emp]:items){auto[cap,bin]=pq.top();pq.pop();if(type==0)a[emp]=bin;else b[emp]=bin;rem[bin]-=w;pq.push({rem[bin],bin});}\n    computeFlow();flowSearch();fixFwdConn();flowSearch();fixBwdConn();flowSearch();fixFwdConn();\n    int co[MAXN],od[MAXN],ed[MAXN];\n    long long curErr=simulateFull(co,od,ed),bestErr=curErr;\n    int ba[MAXN],bb[MAXN];copy(a,a+N,ba);copy(b,b+N,bb);\n    mt19937 rng(42);\n    auto t0=chrono::steady_clock::now();\n    auto el=[&](){return chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now()-t0).count();};\n    struct Cand{long long d;int i,t,j;bool operator<(const Cand&o)const{return d<o.d;}};\n    vector<Cand>cands;cands.reserve(20001);\n    int noImp=0;\n    while(el()<1750000LL){\n        cands.clear();\n        for(int i=0;i<N;i++){\n            if(od[i]>0){int oj=a[i];for(int j=0;j<N;j++){if(j==oj)continue;long long d2=(long long)(abs(co[oj]-od[i]-T[oj])-abs(co[oj]-T[oj]))+(long long)(abs(co[j]+od[i]-T[j])-abs(co[j]-T[j]));cands.push_back({d2,i,0,j});}}\n            if(ed[i]>0){int oj=b[i];for(int j=0;j<N;j++){if(j==oj)continue;long long d2=(long long)(abs(co[oj]-ed[i]-T[oj])-abs(co[oj]-T[oj]))+(long long)(abs(co[j]+ed[i]-T[j])-abs(co[j]-T[j]));cands.push_back({d2,i,1,j});}}\n        }\n        int K=min((int)cands.size(),50);\n        if(K>0)partial_sort(cands.begin(),cands.begin()+K,cands.end());\n        bool found=false;\n        for(int k=0;k<K&&!found;k++){auto&[d2,i,t,j]=cands[k];int&ptr=t?b[i]:a[i];int old=ptr;ptr=j;if(!checkFwd()){ptr=old;continue;}long long err=simulate();if(err<curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}curErr=simulateFull(co,od,ed);found=true;}else ptr=old;}\n        if(!found)for(int att=0;att<20&&!found;att++){int i=rng()%N,t=rng()%2,j=(int)(rng()%N);int&ptr=t?b[i]:a[i];int old=ptr;if(j==old)continue;ptr=j;if(!checkFwd()){ptr=old;continue;}long long err=simulate();if(err<curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}curErr=simulateFull(co,od,ed);found=true;}else ptr=old;}\n        if(found)noImp=0;\n        else{noImp++;\n            if(noImp>=15){\n                // Enhanced ILS perturbation: random changes + re-optimization\n                bool pittBetter=false;\n                for(int ptry=0;ptry<3&&!pittBetter;ptry++){\n                    copy(ba,ba+N,a);copy(bb,bb+N,b);\n                    for(int p=0;p<8;p++){int i=rng()%N,t=rng()%2,j=(int)(rng()%N);if(t)b[i]=j;else a[i]=j;}\n                    computeFlow();flowSearch();fixFwdConn();\n                    long long err=simulate();\n                    if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);curErr=simulateFull(co,od,ed);pittBetter=true;}\n                }\n                if(!pittBetter){copy(ba,ba+N,a);copy(bb,bb+N,b);curErr=simulateFull(co,od,ed);}\n                noImp=0;\n            }\n        }\n    }\n    copy(ba,ba+N,a);copy(bb,bb+N,b);\n    for(int i=0;i<N;i++)cout<<a[i]<<\" \"<<b[i]<<\"\\n\";\n    return 0;\n}","ahc045":"#include <bits/stdc++.h>\nusing namespace std;\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,Q,L,W; cin>>N>>M>>Q>>L>>W;\n    vector<int>G(M);for(int&g:G)cin>>g;\n    vector<double>cx(N),cy(N);\n    for(int i=0;i<N;i++){int lx,rx,ly,ry;cin>>lx>>rx>>ly>>ry;cx[i]=(lx+rx)/2.0;cy[i]=(ly+ry)/2.0;}\n    auto ed2=[&](int a,int b)->double{double dx=cx[a]-cx[b],dy=cy[a]-cy[b];return dx*dx+dy*dy;};\n    vector<int>mpar(N,-1);vector<double>mkey(N,0);\n    {vector<bool>vis(N,false);vector<double>key(N,1e18);key[0]=0;\n    for(int it=0;it<N;it++){int u=-1;for(int v=0;v<N;v++)if(!vis[v]&&(u==-1||key[v]<key[u]))u=v;\n    vis[u]=true;mkey[u]=key[u];for(int v=0;v<N;v++)if(!vis[v]){double d=ed2(u,v);if(d<key[v]){key[v]=d;mpar[v]=u;}}}}\n    vector<vector<int>>mch(N);for(int v=1;v<N;v++)mch[mpar[v]].push_back(v);\n    for(int v=0;v<N;v++)sort(mch[v].begin(),mch[v].end(),[&](int a,int b){return mkey[a]<mkey[b];});\n    vector<int>post,preord;\n    {stack<pair<int,int>>s;s.push({0,0});while(!s.empty()){auto&[v,ci]=s.top();if(ci<(int)mch[v].size())s.push({mch[v][ci++],0});else{post.push_back(v);s.pop();}}}\n    {stack<int>s;s.push(0);while(!s.empty()){int v=s.top();s.pop();preord.push_back(v);for(int i=(int)mch[v].size()-1;i>=0;i--)s.push(mch[v][i]);}}\n    vector<int>esz(N,1);for(int v:post)for(int c:mch[v])esz[v]+=esz[c];\n    vector<pair<double,int>>elist;for(int v=1;v<N;v++)elist.push_back({mkey[v],v});\n    sort(elist.begin(),elist.end(),greater<>());\n    multiset<int>remG(G.begin(),G.end());map<int,queue<int>>szg;for(int i=0;i<M;i++)szg[G[i]].push(i);\n    vector<bool>scut(N,false),asgn(N,false);vector<vector<int>>groups(M);\n    for(auto&[w,v]:elist){if(asgn[v])continue;int s=esz[v];if(s<=0||!remG.count(s))continue;\n        remG.erase(remG.find(s));int u=mpar[v];while(u!=-1&&!scut[u]){esz[u]-=s;u=mpar[u];}scut[v]=true;\n        int gid=szg[s].front();szg[s].pop();queue<int>q;q.push(v);\n        while(!q.empty()){int nu=q.front();q.pop();if(asgn[nu])continue;groups[gid].push_back(nu);asgn[nu]=true;for(int c:mch[nu])if(!asgn[c])q.push(c);}}\n    {vector<int>rem;for(int v:preord)if(!asgn[v])rem.push_back(v);\n    int pos=0;for(int i=0;i<M;i++)if(groups[i].empty())for(int j=0;j<G[i];j++)groups[i].push_back(rem[pos++]);}\n    vector<vector<int>>sc(M);\n    for(int i=0;i<M;i++){\n        int g=G[i];auto&v=groups[i];if(g<=1){sc[i]=v;continue;}\n        int lxi=0,rxi=0,lyi=0,ryi=0,ceni=0;double avgx=0,avgy=0;\n        for(int k=0;k<g;k++){avgx+=cx[v[k]];avgy+=cy[v[k]];\n            if(cx[v[k]]<cx[v[lxi]])lxi=k;if(cx[v[k]]>cx[v[rxi]])rxi=k;\n            if(cy[v[k]]<cy[v[lyi]])lyi=k;if(cy[v[k]]>cy[v[ryi]])ryi=k;}\n        avgx/=g;avgy/=g;double cd=1e18;\n        for(int k=0;k<g;k++){double d=(cx[v[k]]-avgx)*(cx[v[k]]-avgx)+(cy[v[k]]-avgy)*(cy[v[k]]-avgy);if(d<cd){cd=d;ceni=k;}}\n        auto nn=[&](int s0)->vector<int>{\n            vector<bool>used(g,false);vector<int>p;p.reserve(g);p.push_back(v[s0]);used[s0]=true;\n            for(int k=1;k<g;k++){int cur=p.back();double best=1e18;int bj=-1;\n                for(int j=0;j<g;j++)if(!used[j]){double d=ed2(cur,v[j]);if(d<best){best=d;bj=j;}}\n                p.push_back(v[bj]);used[bj]=true;}return p;};\n        auto plen=[&](const vector<int>&p)->double{double l=0;for(int k=1;k<g;k++)l+=ed2(p[k-1],p[k]);return l;};\n        auto topt=[&](vector<int>&p){\n            for(int it=0;it<30;it++){bool imp=false;\n                for(int a=0;a<g-1;a++)for(int b=a+2;b<g;b++){\n                    double dold=ed2(p[a],p[a+1]);if(b+1<g)dold+=ed2(p[b],p[b+1]);\n                    double dnew=ed2(p[a],p[b]);if(b+1<g)dnew+=ed2(p[a+1],p[b+1]);\n                    if(dnew<dold-1e-9){reverse(p.begin()+a+1,p.begin()+b+1);imp=true;}}\n                if(!imp)break;}};\n        vector<int>starts={lxi,rxi,lyi,ryi,ceni};\n        sort(starts.begin(),starts.end());starts.erase(unique(starts.begin(),starts.end()),starts.end());\n        double bestl=1e18;\n        for(int s:starts){auto p=nn(s);topt(p);double l=plen(p);if(l<bestl){bestl=l;sc[i]=p;}}\n        // Also try groups[i] order (preorder/BFS) as additional starting path\n        {vector<int>p(v);topt(p);double l=plen(p);if(l<bestl){bestl=l;sc[i]=p;}}\n        // Or-opt-1 (best improvement, cap 10 iterations)\n        if(g>=4){\n            for(int it=0;it<10;it++){\n                double bg=1e-9;int ba=-1,bj=-1;\n                for(int a=1;a<g-1;a++){int c=sc[i][a];\n                    double rg=ed2(sc[i][a-1],c)+ed2(c,sc[i][a+1])-ed2(sc[i][a-1],sc[i][a+1]);\n                    for(int j=1;j<g;j++){if(abs(j-a)<=1)continue;\n                        double ic=ed2(sc[i][j-1],c)+ed2(c,sc[i][j])-ed2(sc[i][j-1],sc[i][j]);\n                        if(rg-ic>bg){bg=rg-ic;ba=a;bj=j;}}}\n                if(ba<0)break;\n                int moved=sc[i][ba];\n                if(bj<ba){for(int k=ba;k>bj;k--)sc[i][k]=sc[i][k-1];sc[i][bj]=moved;}\n                else{for(int k=ba;k<bj-1;k++)sc[i][k]=sc[i][k+1];sc[i][bj-1]=moved;}\n            }\n        }\n        topt(sc[i]);\n    }\n    int qrem=Q;vector<vector<pair<double,pair<int,int>>>>ae(M);\n    auto dq=[&](const vector<int>&qc,int gi){if((int)qc.size()<2||qrem<=0)return;qrem--;\n        cout<<\"? \"<<qc.size();for(int c:qc)cout<<\" \"<<c;cout<<\"\\n\"<<flush;\n        for(int k=0;k+1<(int)qc.size();k++){int a,b;cin>>a>>b;ae[gi].push_back({ed2(a,b),{a,b}});}};\n    auto nw=[&](int g)->int{if(g<=1)return 0;if(g<=L)return 1;return(g-2)/(L-1)+1;};\n    int tmand=0;for(int i=0;i<M;i++)tmand+=nw(G[i]);int xtra=Q-tmand;\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;if(g<=L){dq(sc[i],i);continue;}\n        int st=0;while(true){int en=min(st+L,g);bool last=(en>=g);if(last&&en-st<L){st=g-L;en=g;}\n            dq(vector<int>(sc[i].begin()+st,sc[i].begin()+en),i);if(last)break;st+=L-1;}}\n    {vector<int>lg;for(int i=0;i<M;i++)if(G[i]>L)lg.push_back(i);\n    if(!lg.empty()&&xtra>0)for(int qi=0;qi<xtra&&qrem>0;qi++){int gi=lg[qi%(int)lg.size()];int g=G[gi];\n        int stride=max(1,g/L),off=(qi/(int)lg.size())%stride;\n        vector<int>win;for(int k=off;k<g&&(int)win.size()<L;k+=stride)win.push_back(sc[gi][k]);\n        if((int)win.size()>=2)dq(win,gi);}}\n    vector<int>par(N);auto fu=[&](int x)->int{while(par[x]!=x){par[x]=par[par[x]];x=par[x];}return x;};\n    vector<vector<pair<int,int>>>ans(M);\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;for(int k:sc[i])par[k]=k;sort(ae[i].begin(),ae[i].end());\n        for(auto&[d,e]:ae[i]){int ra=fu(e.first),rb=fu(e.second);if(ra!=rb){par[ra]=rb;ans[i].push_back(e);}}\n        for(int k=1;k<g;k++){int ra=fu(sc[i][k]),rb=fu(sc[i][k-1]);if(ra!=rb){par[ra]=rb;ans[i].push_back({sc[i][k],sc[i][k-1]});}}}\n    cout<<\"!\\n\";\n    for(int i=0;i<M;i++){for(int j=0;j<G[i];j++){if(j>0)cout<<\" \";cout<<groups[i][j];}cout<<\"\\n\";\n        for(auto&[a,b]:ans[i])cout<<a<<\" \"<<b<<\"\\n\";}\n    return 0;\n}","ahc046":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20;bool grid[N][N];\nconst int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\ninline bool inB(int r,int c){return(unsigned)r<(unsigned)N&&(unsigned)c<(unsigned)N;}\n// O(1) slide: assumes grid always empty (invariant maintained throughout)\ninline void slE(int r,int c,int d,int er,int ec,int &sr,int &sc){\n    switch(d){\n        case 0:sr=(ec==c&&er>=0&&er<r)?er+1:0;sc=c;return;\n        case 1:sr=(ec==c&&er>r&&er<N)?er-1:N-1;sc=c;return;\n        case 2:sr=r;sc=(er==r&&ec>=0&&ec<c)?ec+1:0;return;\n        default:sr=r;sc=(er==r&&ec>c&&ec<N)?ec-1:N-1;\n    }\n}\nconst int NS1=N*N*21*21;static int d1[NS1],p1[NS1],q1[NS1];static uint8_t a1[NS1];\nvector<pair<char,char>> fp1(int r0,int c0,int tr,int tc){\n    memset(d1,-1,sizeof(d1));int S=(r0*N+c0)*441,G=(tr*N+tc)*441;if(S==G)return{};\n    d1[S]=0;int qh=0,qt=0;q1[qt++]=S;\n    while(qh<qt&&d1[G]==-1){int s=q1[qh++],t=s,ec=t%21-1;t/=21;int er=t%21-1;t/=21;int c=t%N,r=t/N,dv=d1[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];\n            if(inB(nr,nc)&&!grid[nr][nc]&&!(nr==er&&nc==ec)){int ns=(nr*N+nc)*441+(er+1)*21+(ec+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(0<<2)|d;q1[qt++]=ns;}}\n            int sr,sc;slE(r,c,d,er,ec,sr,sc);if(sr!=r||sc!=c){int ns=(sr*N+sc)*441+(er+1)*21+(ec+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(1<<2)|d;q1[qt++]=ns;}}\n            if(inB(nr,nc)){if(nr==er&&nc==ec){int ns=(r*N+c)*441;if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}else if(er==-1&&!grid[nr][nc]){int ns=(r*N+c)*441+(nr+1)*21+(nc+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}}}}\n    if(d1[G]==-1){vector<pair<char,char>> res;int r=r0,c=c0;while(r!=tr){res.push_back({'M',r<tr?'D':'U'});r+=(r<tr?1:-1);}while(c!=tc){res.push_back({'M',c<tc?'R':'L'});c+=(c<tc?1:-1);}return res;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p1[cur])path.push_back({\"MSA\"[a1[cur]>>2],\"UDLR\"[a1[cur]&3]});reverse(path.begin(),path.end());return path;}\nconst int NS2=N*N*2*21*21;static int d2[NS2],p2[NS2],q2[NS2];static uint8_t a2[NS2];\nvector<pair<char,char>> fp2(int r0,int c0,int t1r,int t1c,int t2r,int t2c){\n    memset(d2,-1,sizeof(d2));auto E=[](int r,int c,int v,int er,int ec){return (r*N+c)*2*441+v*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(t2r,t2c,1,-1,-1);d2[S]=0;int qh=0,qt=0;q2[qt++]=S;\n    while(qh<qt&&d2[G]==-1){int s=q2[qh++],t=s,ec=t%21-1;t/=21;int er=t%21-1;t/=21;int v=t%2;t/=2;int c=t%N,r=t/N,dv=d2[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];\n            if(inB(nr,nc)&&!grid[nr][nc]&&!(nr==er&&nc==ec)){int nv=v|(nr==t1r&&nc==t1c);int ns=E(nr,nc,nv,er,ec);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(0<<2)|d;q2[qt++]=ns;}}\n            int sr,sc;slE(r,c,d,er,ec,sr,sc);if(sr!=r||sc!=c){int nv=v|(sr==t1r&&sc==t1c);int ns=E(sr,sc,nv,er,ec);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(1<<2)|d;q2[qt++]=ns;}}\n            if(inB(nr,nc)){if(nr==er&&nc==ec){int ns=E(r,c,v,-1,-1);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(2<<2)|d;q2[qt++]=ns;}}else if(er==-1&&!grid[nr][nc]){int ns=E(r,c,v,nr,nc);if(d2[ns]==-1){d2[ns]=dv;p2[ns]=s;a2[ns]=(2<<2)|d;q2[qt++]=ns;}}}}}\n    if(d2[G]==-1){auto a=fp1(r0,c0,t1r,t1c),b=fp1(t1r,t1c,t2r,t2c);a.insert(a.end(),b.begin(),b.end());return a;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p2[cur])path.push_back({\"MSA\"[a2[cur]>>2],\"UDLR\"[a2[cur]&3]});reverse(path.begin(),path.end());return path;}\nconst int NS3=N*N*3*21*21;static int d3[NS3],p3[NS3],q3[NS3];static uint8_t a3[NS3];\nvector<pair<char,char>> fp3(int r0,int c0,int t1r,int t1c,int t2r,int t2c,int t3r,int t3c){\n    memset(d3,-1,sizeof(d3));auto E=[](int r,int c,int ph,int er,int ec){return (r*N+c)*3*441+ph*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(t3r,t3c,2,-1,-1);d3[S]=0;int qh=0,qt=0;q3[qt++]=S;\n    while(qh<qt&&d3[G]==-1){int s=q3[qh++],t=s,ec=t%21-1;t/=21;int er=t%21-1;t/=21;int ph=t%3;t/=3;int c=t%N,r=t/N,dv=d3[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];\n            if(inB(nr,nc)&&!grid[nr][nc]&&!(nr==er&&nc==ec)){int np=ph;if(ph==0&&nr==t1r&&nc==t1c)np=1;else if(ph==1&&nr==t2r&&nc==t2c)np=2;int ns=E(nr,nc,np,er,ec);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(0<<2)|d;q3[qt++]=ns;}}\n            int sr,sc;slE(r,c,d,er,ec,sr,sc);if(sr!=r||sc!=c){int np=ph;if(ph==0&&sr==t1r&&sc==t1c)np=1;else if(ph==1&&sr==t2r&&sc==t2c)np=2;int ns=E(sr,sc,np,er,ec);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(1<<2)|d;q3[qt++]=ns;}}\n            if(inB(nr,nc)){if(nr==er&&nc==ec){int ns=E(r,c,ph,-1,-1);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(2<<2)|d;q3[qt++]=ns;}}else if(er==-1&&!grid[nr][nc]){int ns=E(r,c,ph,nr,nc);if(d3[ns]==-1){d3[ns]=dv;p3[ns]=s;a3[ns]=(2<<2)|d;q3[qt++]=ns;}}}}}\n    if(d3[G]==-1){auto a=fp1(r0,c0,t1r,t1c),b=fp1(t1r,t1c,t2r,t2c),cb=fp1(t2r,t2c,t3r,t3c);a.insert(a.end(),b.begin(),b.end());a.insert(a.end(),cb.begin(),cb.end());return a;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p3[cur])path.push_back({\"MSA\"[a3[cur]>>2],\"UDLR\"[a3[cur]&3]});reverse(path.begin(),path.end());return path;}\nconst int NS4=N*N*4*21*21;static int d4[NS4],p4[NS4],q4[NS4];static uint8_t a4[NS4];\nvector<pair<char,char>> fp4(int r0,int c0,int t1r,int t1c,int t2r,int t2c,int t3r,int t3c,int t4r,int t4c){\n    memset(d4,-1,sizeof(d4));auto E=[](int r,int c,int ph,int er,int ec){return (r*N+c)*4*441+ph*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(t4r,t4c,3,-1,-1);d4[S]=0;int qh=0,qt=0;q4[qt++]=S;\n    while(qh<qt&&d4[G]==-1){int s=q4[qh++],t=s,ec=t%21-1;t/=21;int er=t%21-1;t/=21;int ph=t%4;t/=4;int c=t%N,r=t/N,dv=d4[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];\n            if(inB(nr,nc)&&!grid[nr][nc]&&!(nr==er&&nc==ec)){int np=ph;if(ph==0&&nr==t1r&&nc==t1c)np=1;else if(ph==1&&nr==t2r&&nc==t2c)np=2;else if(ph==2&&nr==t3r&&nc==t3c)np=3;int ns=E(nr,nc,np,er,ec);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(0<<2)|d;q4[qt++]=ns;}}\n            int sr,sc;slE(r,c,d,er,ec,sr,sc);if(sr!=r||sc!=c){int np=ph;if(ph==0&&sr==t1r&&sc==t1c)np=1;else if(ph==1&&sr==t2r&&sc==t2c)np=2;else if(ph==2&&sr==t3r&&sc==t3c)np=3;int ns=E(sr,sc,np,er,ec);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(1<<2)|d;q4[qt++]=ns;}}\n            if(inB(nr,nc)){if(nr==er&&nc==ec){int ns=E(r,c,ph,-1,-1);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(2<<2)|d;q4[qt++]=ns;}}else if(er==-1&&!grid[nr][nc]){int ns=E(r,c,ph,nr,nc);if(d4[ns]==-1){d4[ns]=dv;p4[ns]=s;a4[ns]=(2<<2)|d;q4[qt++]=ns;}}}}}\n    if(d4[G]==-1){auto a=fp1(r0,c0,t1r,t1c),b=fp1(t1r,t1c,t2r,t2c),cb=fp1(t2r,t2c,t3r,t3c),e=fp1(t3r,t3c,t4r,t4c);a.insert(a.end(),b.begin(),b.end());a.insert(a.end(),cb.begin(),cb.end());a.insert(a.end(),e.begin(),e.end());return a;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p4[cur])path.push_back({\"MSA\"[a4[cur]>>2],\"UDLR\"[a4[cur]&3]});reverse(path.begin(),path.end());return path;}\nint cr,cc,eebr=-1,eebc=-1;\nvoid execPath(const vector<pair<char,char>>&path){\n    for(auto[a,d]:path){cout<<a<<' '<<d<<'\\n';int di=d=='U'?0:d=='D'?1:d=='L'?2:3;int nr=cr+DR[di],nc=cc+DC[di];\n        if(a=='M'){cr=nr;cc=nc;}\n        else if(a=='S'){int sr,sc;slE(cr,cc,di,eebr,eebc,sr,sc);cr=sr;cc=sc;}\n        else{if(nr==eebr&&nc==eebc){eebr=eebc=-1;}else if(eebr==-1&&!grid[nr][nc]){eebr=nr;eebc=nc;}else grid[nr][nc]^=1;}}\n    eebr=eebc=-1;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int Nin,M;cin>>Nin>>M;vector<pair<int,int>> pts(M);\n    for(int i=0;i<M;i++)cin>>pts[i].first>>pts[i].second;\n    memset(grid,0,sizeof(grid));cr=pts[0].first;cc=pts[0].second;eebr=eebc=-1;\n    int k=1;\n    while(k<M){\n        int tr=pts[k].first,tc=pts[k].second;auto pk=fp1(cr,cc,tr,tc);\n        if(k+1<M){\n            int tr2=pts[k+1].first,tc2=pts[k+1].second;\n            auto pk1=fp1(tr,tc,tr2,tc2);auto pkk1=fp2(cr,cc,tr,tc,tr2,tc2);\n            if(k+2<M){\n                int tr3=pts[k+2].first,tc3=pts[k+2].second;\n                auto pk2=fp1(tr2,tc2,tr3,tc3);\n                auto pk1k2=fp2(tr,tc,tr2,tc2,tr3,tc3);\n                auto pkkk=fp3(cr,cc,tr,tc,tr2,tc2,tr3,tc3);\n                int oA=(int)pkk1.size()+(int)pk2.size();\n                int oB=(int)pk.size()+(int)pk1k2.size();\n                int g3=min(oA,oB);\n                int eg3=min((int)pkkk.size(),g3);\n                if(k+3<M){\n                    int tr4=pts[k+3].first,tc4=pts[k+3].second;\n                    auto pk3=fp1(tr3,tc3,tr4,tc4);\n                    auto pk2k3=fp2(tr2,tc2,tr3,tc3,tr4,tc4);\n                    auto pkkkk=fp4(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4);\n                    int o22=(int)pkk1.size()+(int)pk2k3.size();\n                    int g4=min(eg3+(int)pk3.size(),o22);\n                    if((int)pkkkk.size()<g4){execPath(pkkkk);cr=tr4;cc=tc4;k+=4;continue;}\n                }\n                if((int)pkkk.size()<g3){execPath(pkkk);cr=tr3;cc=tc3;k+=3;continue;}\n                if(oA<oB){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                else{execPath(pk);cr=tr;cc=tc;k+=1;}\n            }else{\n                if((int)pkk1.size()<(int)pk.size()+(int)pk1.size()){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                else{execPath(pk);cr=tr;cc=tc;k+=1;}\n            }\n        }else{execPath(pk);cr=tr;cc=tc;k+=1;}\n    }\n    return 0;\n}"},"16":{"ahc001":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=205;\nint n,px[MAXN],py[MAXN];long long pr[MAXN];\ndouble score_pi(double si,long long ri){if(si<=0)return 0;double r=(si<=(double)ri)?si/ri:(double)ri/si;return 1-(1-r)*(1-r);}\nstruct Split{int x1,y1,x2,y2,dir,sp,lo,hi;vector<int>L,R;};\nvector<Split>splits;int rx1[MAXN],ry1[MAXN],rx2[MAXN],ry2[MAXN];\nvoid recompute(){for(int i=0;i<n;i++){rx1[i]=0;ry1[i]=0;rx2[i]=10000;ry2[i]=10000;}for(auto&s:splits){for(int i:s.L){if(s.dir==0)rx2[i]=min(rx2[i],s.sp);else ry2[i]=min(ry2[i],s.sp);}for(int j:s.R){if(s.dir==0)rx1[j]=max(rx1[j],s.sp);else ry1[j]=max(ry1[j],s.sp);}}}\ndouble evalAt(const Split&s,int sp){double t=0;for(int i:s.L){int nx2=(s.dir==0&&rx2[i]==s.sp)?sp:rx2[i];int ny2=(s.dir==1&&ry2[i]==s.sp)?sp:ry2[i];t+=score_pi((double)max(0,nx2-rx1[i])*max(0,ny2-ry1[i]),pr[i]);}for(int j:s.R){int nx1=(s.dir==0&&rx1[j]==s.sp)?sp:rx1[j];int ny1=(s.dir==1&&ry1[j]==s.sp)?sp:ry1[j];t+=score_pi((double)max(0,rx2[j]-nx1)*max(0,ry2[j]-ny1),pr[j]);}return t;}\nmt19937 rng(42);double p_rand=0;\nvoid doBuild(vector<int>comp,int x1,int y1,int x2,int y2){\n    int nc=(int)comp.size();if(nc==1)return;\n    long long tr=0;for(int i:comp)tr+=pr[i];long long H=y2-y1,W=x2-x1;\n    vector<int>bx(comp),by(comp);\n    sort(bx.begin(),bx.end(),[](int a,int b){return px[a]<px[b];});\n    sort(by.begin(),by.end(),[](int a,int b){return py[a]<py[b];});\n    struct Cand{double sc;int dir,k,sp,lo,hi;};vector<Cand>cands;\n    auto ss=[](long long AL,long long RL,int nL,long long AR,long long RR,int nR){double a=(RL<=0||AL>=RL)?(double)nL:nL*(1-pow(1-(double)AL/RL,2));double b=(RR<=0||AR>=RR)?(double)nR:nR*(1-pow(1-(double)AR/RR,2));return a+b;};\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[bx[k-1]];if(px[bx[k-1]]>=px[bx[k]])continue;int lo=max(px[bx[k-1]]+1,x1+1),hi=min(px[bx[k]],x2-1);if(lo>hi)continue;int sp=(int)round(x1+(double)W*pf/tr);sp=max(lo,min(hi,sp));cands.push_back({ss((long long)(sp-x1)*H,pf,k,(long long)(x2-sp)*H,tr-pf,nc-k),0,k,sp,lo,hi});}}\n    {long long pf=0;for(int k=1;k<nc;k++){pf+=pr[by[k-1]];if(py[by[k-1]]>=py[by[k]])continue;int lo=max(py[by[k-1]]+1,y1+1),hi=min(py[by[k]],y2-1);if(lo>hi)continue;int sp=(int)round(y1+(double)H*pf/tr);sp=max(lo,min(hi,sp));cands.push_back({ss((long long)(sp-y1)*W,pf,k,(long long)(y2-sp)*W,tr-pf,nc-k),1,k,sp,lo,hi});}}\n    if(cands.empty())return;\n    sort(cands.begin(),cands.end(),[](const Cand&a,const Cand&b){return a.sc>b.sc;});\n    int ch=0;\n    if(p_rand>0&&(int)cands.size()>1){int K=min((int)cands.size(),5);if(uniform_real_distribution<double>(0,1)(rng)<p_rand)ch=rng()%K;}\n    auto&c=cands[ch];Split s;s.x1=x1;s.y1=y1;s.x2=x2;s.y2=y2;s.dir=c.dir;s.sp=c.sp;s.lo=c.lo;s.hi=c.hi;\n    if(c.dir==0){for(int i=0;i<c.k;i++)s.L.push_back(bx[i]);for(int i=c.k;i<nc;i++)s.R.push_back(bx[i]);splits.push_back(s);doBuild(s.L,x1,y1,s.sp,y2);doBuild(s.R,s.sp,y1,x2,y2);}\n    else{for(int i=0;i<c.k;i++)s.L.push_back(by[i]);for(int i=c.k;i<nc;i++)s.R.push_back(by[i]);splits.push_back(s);doBuild(s.L,x1,y1,x2,s.sp);doBuild(s.R,x1,s.sp,x2,y2);}\n}\nbool lsPass(){bool imp=false;for(auto&s:splits){if(s.lo>=s.hi)continue;int bsp=s.sp;double bs=evalAt(s,s.sp);int lo=s.lo,hi=s.hi;while(hi-lo>=3){int m1=lo+(hi-lo)/3,m2=hi-(hi-lo)/3;double s1=evalAt(s,m1),s2=evalAt(s,m2);if(s1<s2-1e-9)lo=m1+1;else if(s2<s1-1e-9)hi=m2-1;else{lo=m1;hi=m2;}}for(int sp=lo;sp<=hi;sp++){double sc=evalAt(s,sp);if(sc>bs){bs=sc;bsp=sp;}}if(bsp!=s.sp){s.sp=bsp;recompute();imp=true;}}return imp;}\ndouble computeScore(){double t=0;for(int i=0;i<n;i++){long long A=(long long)(rx2[i]-rx1[i])*(ry2[i]-ry1[i]);t+=score_pi((double)min(A,(long long)pr[i]),pr[i]);}return t;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>n;for(int i=0;i<n;i++)cin>>px[i]>>py[i]>>pr[i];\n    vector<int>all(n);iota(all.begin(),all.end(),0);\n    auto t0=chrono::steady_clock::now();\n    auto msf=[&](){return(int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    const double prs[]={0.0,0.1,0.2,0.3,0.4,0.5};\n    double best=-1;int bx1[MAXN],by1[MAXN],bx2[MAXN],by2[MAXN];\n    auto save=[&](){for(int i=0;i<n;i++){bx1[i]=rx1[i];by1[i]=ry1[i];bx2[i]=rx2[i];by2[i]=ry2[i];}};\n    struct TrialData{double score;vector<Split>saved;};\n    vector<TrialData>ph1data;ph1data.reserve(600);\n    for(int trial=0;msf()<2200;trial++){\n        uint32_t seed=(uint32_t)(trial*7919+12345);double pr=prs[trial==0?0:1+(trial-1)%5];\n        splits.clear();rng.seed(seed);p_rand=pr;\n        doBuild(all,0,0,10000,10000);recompute();\n        for(int p=0;p<2&&msf()<2200;p++)if(!lsPass())break;\n        double q=computeScore();ph1data.push_back({q,splits});\n        if(q>best){best=q;save();}\n    }\n    sort(ph1data.begin(),ph1data.end(),[](const TrialData&a,const TrialData&b){return a.score>b.score;});\n    for(auto&td:ph1data){\n        if(msf()>4500)break;\n        splits=td.saved;recompute();\n        while(msf()<4500)if(!lsPass())break;\n        double sc=computeScore();if(sc>best){best=sc;save();}\n    }\n    for(int extra=0;msf()<4500;extra++){\n        uint32_t seed=(uint32_t)(extra*54321+987654321);double pr=prs[1+extra%5];\n        splits.clear();rng.seed(seed);p_rand=pr;\n        doBuild(all,0,0,10000,10000);recompute();\n        while(msf()<4500)if(!lsPass())break;\n        double sc=computeScore();if(sc>best){best=sc;save();}\n    }\n    // Initial post-processing\n    int fa_a[MAXN],fa_b[MAXN],fa_c[MAXN],fa_d[MAXN];\n    for(int i=0;i<n;i++){\n        int x1=bx1[i],y1=by1[i],x2=bx2[i],y2=by2[i],W=x2-x1,H=y2-y1;\n        long long A=(long long)W*H,ri=pr[i];int xi=px[i],yi=py[i];\n        double br=0;int bw=W,bh=H;bool done=false;\n        if(A>(long long)ri){for(int w=1;w<=W&&!done;w++){long long h0=ri/w;for(int dh=0;dh<=1;dh++){long long hh=h0+dh;if(hh<1||hh>(long long)H)continue;long long area=(long long)w*hh;double ratio=(area<=(long long)ri)?(double)area/ri:(double)ri/area;if(ratio>br){br=ratio;bw=w;bh=(int)hh;if(br>=1-1e-9){done=true;break;}}}}}\n        int a=max(x1,xi+1-bw),b=max(y1,yi+1-bh);\n        fa_a[i]=a;fa_b[i]=b;fa_c[i]=a+bw;fa_d[i]=b+bh;\n    }\n    // Expansion: grow deficit companies into free space\n    for(int pass=0;pass<20;pass++){\n        bool changed=false;\n        vector<int>ord(n);iota(ord.begin(),ord.end(),0);\n        sort(ord.begin(),ord.end(),[&](int a,int b){return max(0LL,pr[a]-(long long)(fa_c[a]-fa_a[a])*(fa_d[a]-fa_b[a]))>max(0LL,pr[b]-(long long)(fa_c[b]-fa_a[b])*(fa_d[b]-fa_b[b]));});\n        for(int ii:ord){\n            long long ri=pr[ii];int xi=px[ii],yi=py[ii];\n            int a0=fa_a[ii],b0=fa_b[ii],c0=fa_c[ii],d0=fa_d[ii];\n            long long si=(long long)(c0-a0)*(d0-b0);if(si>=(long long)ri)continue;\n            // Width expansion (keep height)\n            int cur_h=d0-b0,amin=0,cmax=10000;\n            for(int j=0;j<n;j++){if(j==ii)continue;if(max(b0,fa_b[j])<min(d0,fa_d[j])){if(fa_a[j]>=c0)cmax=min(cmax,fa_a[j]);if(fa_c[j]<=a0)amin=max(amin,fa_c[j]);}}\n            amin=min(amin,xi);cmax=max(cmax,xi+1);\n            double bst_rw=score_pi((double)si,ri);int bst_bw=c0-a0,bst_aw=a0;\n            for(int bw=bst_bw;bw<=cmax-amin;bw++){long long area=(long long)bw*cur_h;double r=(area<=(long long)ri)?(double)area/ri:(double)ri/area;if(r>bst_rw+1e-12){bst_rw=r;bst_bw=bw;bst_aw=max(amin,xi+1-bw);bst_aw=min(bst_aw,cmax-bw);bst_aw=max(bst_aw,amin);}if(area>=(long long)ri)break;}\n            if(bst_bw!=c0-a0||bst_aw!=a0){fa_a[ii]=bst_aw;fa_c[ii]=bst_aw+bst_bw;changed=true;}\n            // Height expansion (keep updated width)\n            int a1=fa_a[ii],c1=fa_c[ii];si=(long long)(c1-a1)*(d0-b0);if(si>=(long long)ri)continue;\n            int cur_w=c1-a1,bmin=0,dmax=10000;\n            for(int j=0;j<n;j++){if(j==ii)continue;if(max(a1,fa_a[j])<min(c1,fa_c[j])){if(fa_b[j]>=d0)dmax=min(dmax,fa_b[j]);if(fa_d[j]<=b0)bmin=max(bmin,fa_d[j]);}}\n            bmin=min(bmin,yi);dmax=max(dmax,yi+1);\n            double bst_rh=score_pi((double)si,ri);int bst_bh=d0-b0,bst_b=b0;\n            for(int bh=bst_bh;bh<=dmax-bmin;bh++){long long area=(long long)cur_w*bh;double r=(area<=(long long)ri)?(double)area/ri:(double)ri/area;if(r>bst_rh+1e-12){bst_rh=r;bst_bh=bh;bst_b=max(bmin,yi+1-bh);bst_b=min(bst_b,dmax-bh);bst_b=max(bst_b,bmin);}if(area>=(long long)ri)break;}\n            if(bst_bh!=d0-b0||bst_b!=b0){fa_b[ii]=bst_b;fa_d[ii]=bst_b+bst_bh;changed=true;}\n        }\n        if(!changed)break;\n    }\n    for(int i=0;i<n;i++)cout<<fa_a[i]<<\" \"<<fa_b[i]<<\" \"<<fa_c[i]<<\" \"<<fa_d[i]<<\"\\n\";\n    return 0;\n}","ahc002":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef chrono::steady_clock Clock;\nconst int N=50,MAXM=N*N+1;\nint si,sj,M,tid[N][N],pval[N][N];\nconst int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\nconst char dc[]={'U','D','L','R'};\nmt19937 rng;\nbool tu[MAXM],btu[MAXM];\nint pi_[MAXM],pj_[MAXM],pt_[MAXM],bpi[MAXM],bpj[MAXM],bpt[MAXM];\nchar pmv[MAXM],bpmv[MAXM];\nint plen,blen;long long cscore,bscore;int ci,cj;\nint g_seen[MAXM]={};int g_ts=0;\nvoid save_best(){if(cscore<=bscore)return;bscore=cscore;blen=plen;memcpy(btu,tu,M);memcpy(bpi,pi_,plen*4);memcpy(bpj,pj_,plen*4);memcpy(bpt,pt_,plen*4);if(plen>1)memcpy(bpmv,pmv,plen-1);}\nvoid restore_best(){cscore=bscore;plen=blen;memcpy(tu,btu,M);memcpy(pi_,bpi,plen*4);memcpy(pj_,bpj,plen*4);memcpy(pt_,bpt,plen*4);if(plen>1)memcpy(pmv,bpmv,plen-1);ci=pi_[plen-1];cj=pj_[plen-1];}\nvoid walk_init(){fill(tu,tu+M,false);plen=1;ci=si;cj=sj;pi_[0]=si;pj_[0]=sj;pt_[0]=tid[si][sj];tu[tid[si][sj]]=true;cscore=pval[si][sj];}\nbool walk_step(double a,double b,double g,double g2,double g3){\n    int bd=-1;double bh=-1e18;bool g3pos=(g3>0);\n    for(int d=0;d<4;d++){\n        int ni=ci+dx[d],nj=cj+dy[d];\n        if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;\n        int t=tid[ni][nj];if(tu[t])continue;\n        tu[t]=true;++g_ts;g_seen[t]=g_ts;\n        int cnt=0;double nv=0,nv2=0,nv3=0;\n        for(int d2=0;d2<4;d2++){\n            int nni=ni+dx[d2],nnj=nj+dy[d2];\n            if((unsigned)nni>=(unsigned)N||(unsigned)nnj>=(unsigned)N)continue;\n            int t2=tid[nni][nnj];if(tu[t2]||g_seen[t2]==g_ts)continue;\n            g_seen[t2]=g_ts;cnt++;nv+=pval[nni][nnj];\n            for(int d3=0;d3<4;d3++){\n                int n3i=nni+dx[d3],n3j=nnj+dy[d3];\n                if((unsigned)n3i>=(unsigned)N||(unsigned)n3j>=(unsigned)N)continue;\n                int t3=tid[n3i][n3j];if(tu[t3]||g_seen[t3]==g_ts)continue;\n                g_seen[t3]=g_ts;nv2+=pval[n3i][n3j];\n                if(g3pos){for(int d4=0;d4<4;d4++){\n                    int n4i=n3i+dx[d4],n4j=n3j+dy[d4];\n                    if((unsigned)n4i>=(unsigned)N||(unsigned)n4j>=(unsigned)N)continue;\n                    int t4=tid[n4i][n4j];if(tu[t4]||g_seen[t4]==g_ts)continue;\n                    g_seen[t4]=g_ts;nv3+=pval[n4i][n4j];\n                }}\n            }\n        }\n        tu[t]=false;\n        double h=a*pval[ni][nj]+g*nv+g2*nv2+g3*nv3-b*cnt+(cnt==0?-1e6:0.0)\n               +uniform_real_distribution<double>(-0.5,0.5)(rng);\n        if(h>bh){bh=h;bd=d;}\n    }\n    if(bd==-1)return false;\n    int ni=ci+dx[bd],nj=cj+dy[bd];\n    tu[tid[ni][nj]]=true;cscore+=pval[ni][nj];pmv[plen-1]=dc[bd];\n    pi_[plen]=ni;pj_[plen]=nj;pt_[plen]=tid[ni][nj];plen++;ci=ni;cj=nj;return true;\n}\nvoid walk_extend(double a,double b,double g,double g2,double g3){while(walk_step(a,b,g,g2,g3));}\nvoid walk_undo(int s){s=min(s,plen-1);while(s-->0){plen--;tu[pt_[plen]]=false;cscore-=pval[pi_[plen]][pj_[plen]];}ci=pi_[plen-1];cj=pj_[plen-1];}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    rng.seed(chrono::steady_clock::now().time_since_epoch().count());\n    cin>>si>>sj;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>tid[i][j];\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>pval[i][j];\n    M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)M=max(M,tid[i][j]+1);\n    bscore=pval[si][sj];blen=1;bpi[0]=si;bpj[0]=sj;bpt[0]=tid[si][sj];\n    fill(btu,btu+M,false);btu[tid[si][sj]]=true;\n    auto t0=Clock::now();\n    auto deadline=t0+chrono::milliseconds(1850);\n    auto phase2=t0+chrono::milliseconds(1295);\n    for(int iter=0;Clock::now()<deadline;iter++){\n        bool p2=(Clock::now()>=phase2);\n        double a=uniform_real_distribution<double>(0.5,2.0)(rng);\n        double b=uniform_real_distribution<double>(0,25)(rng);\n        double g=uniform_real_distribution<double>(0,1.0)(rng);\n        double g2,g3;\n        if(!p2){g2=uniform_real_distribution<double>(0,0.1)(rng);g3=0.0;}\n        else{g2=uniform_real_distribution<double>(0,0.15)(rng);g3=(rng()%3==0)?0.0:uniform_real_distribution<double>(0,0.02)(rng);}\n        if(iter%4==0||blen<=1){walk_init();}\n        else{restore_best();int mb=blen-1,back,r=rng()%10;\n            if(r<5)back=uniform_int_distribution<int>(1,max(1,mb/10))(rng);\n            else if(r<8)back=uniform_int_distribution<int>(max(1,mb/10),max(1,mb/3))(rng);\n            else back=uniform_int_distribution<int>(max(1,mb/3),mb)(rng);\n            walk_undo(back);}\n        walk_extend(a,b,g,g2,g3);save_best();\n    }\n    cout<<string(bpmv,bpmv+blen-1)<<\"\\n\";\n}","ahc003":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30;\nconst double DELTA_VAR=1e6,INIT_SIG2R=1e8,INIT_SIG2E=1e7,MIN_SIG2=1e4;\nconst double UCB_A=0.03;\ndouble mu_row[N],sig2_row[N],mu_col[N],sig2_col[N];\ndouble mu_h[N][N-1],sig2_h[N][N-1],mu_v[N-1][N],sig2_v[N-1][N];\nbool obs_h[N][N-1],obs_v[N-1][N];\nstring dijkstra(int sr,int sc,int tr,int tc){\n    static double wu_h[N][N-1],wu_v[N-1][N],dist[N*N];\n    static int par[N*N];static char pdir[N*N];\n    for(int i=0;i<N;i++)for(int j=0;j<N-1;j++)\n        wu_h[i][j]=max(100.0,obs_h[i][j]?mu_h[i][j]-UCB_A*sqrt(sig2_h[i][j]):mu_row[i]-UCB_A*sqrt(sig2_row[i]+DELTA_VAR));\n    for(int i=0;i<N-1;i++)for(int j=0;j<N;j++)\n        wu_v[i][j]=max(100.0,obs_v[i][j]?mu_v[i][j]-UCB_A*sqrt(sig2_v[i][j]):mu_col[j]-UCB_A*sqrt(sig2_col[j]+DELTA_VAR));\n    fill(dist,dist+N*N,1e18);\n    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>> pq;\n    int src=sr*N+sc,dst=tr*N+tc;dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){\n        auto[d,u]=pq.top();pq.pop();\n        if(d>dist[u]+1e-9)continue;if(u==dst)break;\n        int r=u/N,c=u%N;\n        auto go=[&](int nr,int nc,char dir,double w){int nv=nr*N+nc;double nd=d+w;if(nd<dist[nv]){dist[nv]=nd;par[nv]=u;pdir[nv]=dir;pq.push({nd,nv});}};\n        if(r>0)go(r-1,c,'U',wu_v[r-1][c]);\n        if(r<N-1)go(r+1,c,'D',wu_v[r][c]);\n        if(c>0)go(r,c-1,'L',wu_h[r][c-1]);\n        if(c<N-1)go(r,c+1,'R',wu_h[r][c]);\n    }\n    string path;for(int cur=dst;cur!=src;cur=par[cur])path+=pdir[cur];\n    reverse(path.begin(),path.end());return path;\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    for(int i=0;i<N;i++){mu_row[i]=5000;sig2_row[i]=INIT_SIG2R;}\n    for(int j=0;j<N;j++){mu_col[j]=5000;sig2_col[j]=INIT_SIG2R;}\n    for(int q=0;q<1000;q++){\n        int sr,sc,tr,tc;cin>>sr>>sc>>tr>>tc;\n        string path=dijkstra(sr,sc,tr,tc);cout<<path<<\"\\n\";cout.flush();\n        int obs;cin>>obs;\n        double noise_var=(double)obs*obs/300.0;\n        int kh[N]={},lv[N]={};\n        struct E{bool is_h;int i,j;};vector<E> edges;\n        int r=sr,c=sc;\n        for(char ch:path){\n            if(ch=='U'){edges.push_back({false,r-1,c});lv[c]++;r--;}\n            else if(ch=='D'){edges.push_back({false,r,c});lv[c]++;r++;}\n            else if(ch=='L'){edges.push_back({true,r,c-1});kh[r]++;c--;}\n            else{edges.push_back({true,r,c});kh[r]++;c++;}\n        }\n        double pred_r=0,pvar_r=0;\n        for(int i=0;i<N;i++)if(kh[i]>0){pred_r+=kh[i]*mu_row[i];pvar_r+=(double)kh[i]*kh[i]*sig2_row[i]+kh[i]*DELTA_VAR;}\n        for(int j=0;j<N;j++)if(lv[j]>0){pred_r+=lv[j]*mu_col[j];pvar_r+=(double)lv[j]*lv[j]*sig2_col[j]+lv[j]*DELTA_VAR;}\n        double tvr=pvar_r+noise_var,resr=(double)obs-pred_r;\n        for(int i=0;i<N;i++)if(kh[i]>0){double K=sig2_row[i]*kh[i]/tvr;mu_row[i]=clamp(mu_row[i]+K*resr,1000.0,9000.0);sig2_row[i]=max(sig2_row[i]*(1.0-K*kh[i]),MIN_SIG2);}\n        for(int j=0;j<N;j++)if(lv[j]>0){double K=sig2_col[j]*lv[j]/tvr;mu_col[j]=clamp(mu_col[j]+K*resr,1000.0,9000.0);sig2_col[j]=max(sig2_col[j]*(1.0-K*lv[j]),MIN_SIG2);}\n        for(auto& e:edges){\n            if(e.is_h&&!obs_h[e.i][e.j]){obs_h[e.i][e.j]=true;mu_h[e.i][e.j]=mu_row[e.i];sig2_h[e.i][e.j]=INIT_SIG2E;}\n            else if(!e.is_h&&!obs_v[e.i][e.j]){obs_v[e.i][e.j]=true;mu_v[e.i][e.j]=mu_col[e.j];sig2_v[e.i][e.j]=INIT_SIG2E;}\n        }\n        double pred_e=0,pvar_e=0;\n        for(auto& e:edges){pred_e+=(e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j]);pvar_e+=(e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j]);}\n        double tve=pvar_e+noise_var,rese=(double)obs-pred_e;\n        for(auto& e:edges){\n            double& mu=e.is_h?mu_h[e.i][e.j]:mu_v[e.i][e.j];\n            double& s2=e.is_h?sig2_h[e.i][e.j]:sig2_v[e.i][e.j];\n            double K=s2/tve;mu=clamp(mu+K*rese,1000.0,9000.0);s2=max(s2*(1.0-K),MIN_SIG2);\n        }\n    }\n    return 0;\n}","ahc004":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20,MAXM=800,MAXL=12;\nint M,bs,score;\nint8_t grid[N][N],bg[N][N],h_mm[N][MAXM][N],v_mm[N][MAXM][N];\nint match_count[MAXM],slen[MAXM];\nint8_t S[MAXM][MAXL],char_pos[MAXM][8][MAXL],char_pos_cnt[MAXM][8];\nuint8_t char_appears[MAXM];\nint unsat_arr[MAXM],unsat_cnt,unsat_pos[MAXM];\nvoid unsat_remove(int k){int pos=unsat_pos[k];if(pos<0)return;int last=unsat_arr[--unsat_cnt];unsat_arr[pos]=last;unsat_pos[last]=pos;unsat_pos[k]=-1;}\nvoid unsat_add(int k){if(unsat_pos[k]>=0)return;unsat_pos[k]=unsat_cnt;unsat_arr[unsat_cnt++]=k;}\nvoid apply_cell(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int om=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;match_count[k]-=(h_mm[r][k][j]==0);h_mm[r][k][j]++;match_count[k]-=(v_mm[c][k][i2]==0);v_mm[c][k][i2]++;}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi],j=(c-p+N)%N,i2=(r-p+N)%N;h_mm[r][k][j]--;match_count[k]+=(h_mm[r][k][j]==0);v_mm[c][k][i2]--;match_count[k]+=(v_mm[c][k][i2]==0);}\n        int nm=match_count[k];if(om>0&&nm==0){unsat_add(k);score--;}else if(om==0&&nm>0){unsat_remove(k);score++;}}grid[r][c]=nc;}\nint compute_delta(int r,int c,int oc,int nc){\n    uint8_t mask=(1u<<oc)|(1u<<nc);int d=0;\n    for(int k=0;k<M;k++){if(!(char_appears[k]&mask))continue;int mc=match_count[k];\n        for(int pi=0;pi<char_pos_cnt[k][oc];pi++){int p=char_pos[k][oc][pi];mc-=(h_mm[r][k][(c-p+N)%N]==0);mc-=(v_mm[c][k][(r-p+N)%N]==0);}\n        for(int pi=0;pi<char_pos_cnt[k][nc];pi++){int p=char_pos[k][nc][pi];mc+=(h_mm[r][k][(c-p+N)%N]==1);mc+=(v_mm[c][k][(r-p+N)%N]==1);}\n        d+=(mc>0)-(match_count[k]>0);}return d;}\nvoid recompute(){score=0;unsat_cnt=0;fill(unsat_pos,unsat_pos+M,-1);\n    for(int r=0;r<N;r++)for(int k=0;k<M;k++)for(int j=0;j<N;j++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[r][(j+p)%N]!=S[k][p]);h_mm[r][k][j]=mm;}\n    for(int c=0;c<N;c++)for(int k=0;k<M;k++)for(int i=0;i<N;i++){int mm=0;for(int p=0;p<slen[k];p++)mm+=(grid[(i+p)%N][c]!=S[k][p]);v_mm[c][k][i]=mm;}\n    for(int k=0;k<M;k++){match_count[k]=0;for(int r=0;r<N;r++)for(int j=0;j<N;j++)match_count[k]+=(h_mm[r][k][j]==0);for(int c=0;c<N;c++)for(int i=0;i<N;i++)match_count[k]+=(v_mm[c][k][i]==0);if(match_count[k]>0)score++;else unsat_add(k);}}\nvoid safe_refresh(){\n    int votes[N][N][8];memset(votes,0,sizeof(votes));\n    for(int k=0;k<M;k++){int bm=INT_MAX,br=0,bj=0,bd=0;\n        for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n        for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n        int rthr=max(0,min(3,slen[k]>=7?slen[k]-4:slen[k]-5));if(bm>rthr)continue;\n        for(int p=0;p<slen[k];p++){int rr=bd?(br+p)%N:br,cc=bd?bj:(bj+p)%N;votes[rr][cc][S[k][p]]++;}}\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int bc=0,bv=votes[r][c][0];\n        for(int ch=1;ch<8;ch++)if(votes[r][c][ch]>bv){bv=votes[r][c][ch];bc=ch;}\n        if(bv>0&&grid[r][c]!=bc){int d=compute_delta(r,c,grid[r][c],bc);\n            if(d>0){apply_cell(r,c,grid[r][c],bc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}}}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int n;cin>>n>>M;\n    for(int k=0;k<M;k++){string s;cin>>s;slen[k]=s.size();char_appears[k]=0;memset(char_pos_cnt[k],0,8);\n        for(int p=0;p<slen[k];p++){int ch=s[p]-'A';S[k][p]=ch;char_pos[k][ch][char_pos_cnt[k][ch]++]=p;char_appears[k]|=(1u<<ch);}}\n    mt19937 rng(42);\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)grid[i][j]=rng()%8;\n    recompute();bs=score;memcpy(bg,grid,sizeof(grid));\n    auto t0=chrono::steady_clock::now();const double TL=2.85;\n    if(score<M*5/100){\n        while(unsat_cnt>0){double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=0.15||score>=M*2/5)break;\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int r=0;r<N;r++)for(int j=0;j<N;j++)if(h_mm[r][k][j]<bm){bm=h_mm[r][k][j];br=r;bj=j;bd=0;}\n            for(int c=0;c<N;c++)for(int i=0;i<N;i++)if(v_mm[c][k][i]<bm){bm=v_mm[c][k][i];br=i;bj=c;bd=1;}\n            for(int p=0;p<slen[k];p++){int rr=bd?(br+p)%N:br,cc=bd?bj:(bj+p)%N;int nc=S[k][p],oc=grid[rr][cc];if(nc!=oc)apply_cell(rr,cc,oc,nc);}\n            if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));}}\n        if(score!=bs){memcpy(grid,bg,sizeof(grid));recompute();}}\n    double sa0=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n    double sad=max(0.1,TL-sa0);\n    double phase1_end=sa0+sad*0.50,phase2_end=sa0+sad*0.75;\n    bool p1t=false,p1d=false,p2t=false,p2d=false;\n    int bs_last_upd=0;double T=5.0,phase3_T_start=1.5;\n    for(int iter=0;;iter++){\n        if((iter&0xFFF)==0){\n            double el=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(el>=TL)break;\n            if(!p1t&&el>=phase1_end){p1t=true;\n                if(bs<M*90/100){p1d=true;memcpy(grid,bg,sizeof(grid));recompute();\n                    for(int i=0;i<5;i++){int r=rng()%N,c=rng()%N,nc=rng()%8;if(nc!=grid[r][c])apply_cell(r,c,grid[r][c],nc);}\n                    bs_last_upd=iter;}}\n            if(p1d&&!p2t&&el>=phase2_end){p2t=true;\n                if(bs<M*90/100&&iter-bs_last_upd>=100000){p2d=true;bs_last_upd=iter;\n                    memcpy(grid,bg,sizeof(grid));recompute();\n                    if(bs<M*50/100){\n                        // Truly stuck: aggressive exploration\n                        for(int i=0;i<2;i++){int r=rng()%N,c=rng()%N,nc=rng()%8;if(nc!=grid[r][c])apply_cell(r,c,grid[r][c],nc);}\n                        phase3_T_start=1.5;\n                    }else{\n                        // Good progress: gentle nudge (1-cell) + moderate T\n                        for(int i=0;i<1;i++){int r=rng()%N,c=rng()%N,nc=rng()%8;if(nc!=grid[r][c])apply_cell(r,c,grid[r][c],nc);}\n                        phase3_T_start=0.8;\n                    }}}\n            if(p2d){double prog=min(1.0,max(0.0,(el-phase2_end)/(TL-phase2_end)));T=phase3_T_start*pow(0.001/phase3_T_start,prog);}\n            else if(p1d){double prog=min(1.0,max(0.0,(el-phase1_end)/(sad*0.5)));T=2.0*pow(0.001/2.0,prog);}\n            else{double prog=min(1.0,max(0.0,(el-sa0)/sad));T=5.0*pow(0.001/5.0,prog);}\n        }\n        if(iter>0&&(iter%100000)==0&&bs<M*95/100){int pb=bs;safe_refresh();if(bs>pb)bs_last_upd=iter;}\n        bool guided=false;int r,c,nc,oc;\n        if(unsat_cnt>0&&rng()%(uint32_t)M<(uint32_t)unsat_cnt){\n            int k=unsat_arr[rng()%(uint32_t)unsat_cnt];int bm=INT_MAX,br=0,bj=0,bd=0;\n            for(int rr=0;rr<N;rr++)for(int jj=0;jj<N;jj++)if(h_mm[rr][k][jj]<bm){bm=h_mm[rr][k][jj];br=rr;bj=jj;bd=0;}\n            for(int cc=0;cc<N;cc++)for(int ii=0;ii<N;ii++)if(v_mm[cc][k][ii]<bm){bm=v_mm[cc][k][ii];br=ii;bj=cc;bd=1;}\n            int thr=max(0,min(3,slen[k]>=7?slen[k]-4:slen[k]-5));\n            if(bm>=1&&bm<=thr)for(int p=0;p<slen[k]&&!guided;p++){int rr=bd?(br+p)%N:br,cc2=bd?bj:(bj+p)%N;if(grid[rr][cc2]!=S[k][p]){r=rr;c=cc2;nc=S[k][p];oc=grid[rr][cc2];guided=true;}}\n        }\n        if(!guided){r=rng()%N;c=rng()%N;nc=rng()%8;oc=grid[r][c];if(nc==oc)continue;}\n        int d=compute_delta(r,c,oc,nc);\n        if(d>=0||(double)rng()<exp((double)d/T)*4294967295.0){apply_cell(r,c,oc,nc);if(score>bs){bs=score;memcpy(bg,grid,sizeof(grid));bs_last_upd=iter;}}\n    }\n    for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<(char)('A'+bg[i][j]);cout<<'\\n';}\n}","ahc005":"#include <bits/stdc++.h>\nusing namespace std;\nint N,si,sj;vector<string> grid;\nbool isRoad(int r,int c){return r>=0&&r<N&&c>=0&&c<N&&grid[r][c]!='#';}\nconst int INF=1e9;\npair<vector<int>,vector<int>> dijkstra(int src){\n    vector<int> d(N*N,INF),p(N*N,-1);priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;\n    d[src]=0;pq.push({0,src});const int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\n    while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;int r=u/N,c=u%N;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!isRoad(nr,nc))continue;int v=nr*N+nc,nd=dd+(grid[nr][nc]-'0');if(nd<d[v]){d[v]=nd;p[v]=u;pq.push({nd,v});}}}\n    return{d,p};}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    auto t0=chrono::steady_clock::now();\n    auto ms=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    cin>>N>>si>>sj;grid.resize(N);for(int i=0;i<N;i++)cin>>grid[i];\n    vector<int> roads;vector<int> rIdx(N*N,-1);\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)if(isRoad(r,c)){rIdx[r*N+c]=roads.size();roads.push_back(r*N+c);}\n    int R=roads.size();\n    vector<vector<int>> vis(R);\n    for(int i=0;i<R;i++){int r=roads[i]/N,c=roads[i]%N;vis[i].push_back(i);\n        for(int d=1;c+d<N&&isRoad(r,c+d);d++)vis[i].push_back(rIdx[r*N+(c+d)]);\n        for(int d=1;c-d>=0&&isRoad(r,c-d);d++)vis[i].push_back(rIdx[r*N+(c-d)]);\n        for(int d=1;r+d<N&&isRoad(r+d,c);d++)vis[i].push_back(rIdx[(r+d)*N+c]);\n        for(int d=1;r-d>=0&&isRoad(r-d,c);d++)vis[i].push_back(rIdx[(r-d)*N+c]);}\n    vector<bool> cov(R,false);int uncov=R;\n    vector<int> cnt(R);for(int i=0;i<R;i++)cnt[i]=vis[i].size();\n    priority_queue<pair<int,int>> pqsc;for(int i=0;i<R;i++)pqsc.push({cnt[i],i});\n    vector<int> sents;\n    while(uncov>0){int best=-1;while(!pqsc.empty()){auto[cv,id]=pqsc.top();pqsc.pop();if(cv==cnt[id]){best=id;break;}}if(best<0)break;sents.push_back(roads[best]);for(int j:vis[best])if(!cov[j]){cov[j]=true;uncov--;for(int k:vis[j]){cnt[k]--;pqsc.push({cnt[k],k});}}}\n    int stSq=si*N+sj;{auto it=find(sents.begin(),sents.end(),stSq);if(it==sents.end())sents.insert(sents.begin(),stSq);else swap(*it,sents[0]);}\n    int S=sents.size();\n    {vector<int> cc(R,0);for(int sq:sents)for(int j:vis[rIdx[sq]])cc[j]++;bool ch=true;while(ch){ch=false;for(int i=S-1;i>=1;i--){if(sents[i]<0)continue;int idx=rIdx[sents[i]];bool red=true;for(int j:vis[idx])if(cc[j]<=1){red=false;break;}if(red){for(int j:vis[idx])cc[j]--;sents[i]=-1;ch=true;}}}sents.erase(remove(sents.begin(),sents.end(),-1),sents.end());S=sents.size();}\n    vector<vector<int>> aD(S),aP(S);for(int i=0;i<S;i++){auto[d,p]=dijkstra(sents[i]);aD[i]=move(d);aP[i]=move(p);}\n    vector<vector<int>> dm(S,vector<int>(S,INF));for(int i=0;i<S;i++)for(int j=0;j<S;j++)dm[i][j]=aD[i][sents[j]];\n    vector<int> tour;\n    auto do2opt=[&](){int sz=tour.size();for(bool imp=true;imp;){imp=false;for(int i=0;i<sz-1;i++)for(int j=i+2;j<sz;j++){if(i==0&&j==sz-1)continue;int a=tour[i],b=tour[i+1],c=tour[j],d=tour[(j+1)%sz];if(dm[a][c]+dm[b][d]<dm[a][b]+dm[c][d]){reverse(tour.begin()+i+1,tour.begin()+j+1);imp=true;}}}};\n    auto doOrOpt=[&]()->bool{int sz=tour.size();int bg=0,bi=-1,bj=-1;for(int i=1;i<sz;i++){int pi=tour[(i-1+sz)%sz],ci=tour[i],ni=tour[(i+1)%sz];int rmv=dm[pi][ci]+dm[ci][ni]-dm[pi][ni];for(int j=0;j<sz;j++){if(j==i||j==(i-1+sz)%sz)continue;int nj=tour[(j+1)%sz];int ins=dm[tour[j]][ci]+dm[ci][nj]-dm[tour[j]][nj];if(rmv-ins>bg){bg=rmv-ins;bi=i;bj=j;}}}if(bi!=-1){int nd=tour[bi];tour.erase(tour.begin()+bi);int ip=(bj<bi)?bj+1:bj;tour.insert(tour.begin()+ip,nd);return true;}return false;};\n    auto doOrOpt2=[&]()->bool{int sz=tour.size();if(sz<5)return false;int bg=0,bi=-1,bj=-1;for(int i=1;i<sz-1;i++){int a=tour[(i-1+sz)%sz],ci=tour[i],ni=tour[i+1],b=tour[(i+2)%sz];int rmv=dm[a][ci]+dm[ni][b]-dm[a][b];for(int j=0;j<sz;j++){if(j==(i-1+sz)%sz||j==i||j==i+1)continue;int k=tour[(j+1)%sz];int ins=dm[tour[j]][ci]+dm[ni][k]-dm[tour[j]][k];if(rmv-ins>bg){bg=rmv-ins;bi=i;bj=j;}}}if(bi!=-1){int ci=tour[bi],ni=tour[bi+1];tour.erase(tour.begin()+bi,tour.begin()+bi+2);int ip=(bj<bi)?bj+1:bj-1;tour.insert(tour.begin()+ip,ni);tour.insert(tour.begin()+ip,ci);return true;}return false;};\n    auto doOrOpt3=[&]()->bool{int sz=tour.size();if(sz<6)return false;int bg=0,bi=-1,bj=-1;for(int i=1;i<sz-2;i++){int a=tour[(i-1+sz)%sz],ci=tour[i],ni=tour[i+1],ni2=tour[i+2],b=tour[(i+3)%sz];int rmv=dm[a][ci]+dm[ni2][b]-dm[a][b];for(int j=0;j<sz;j++){if(j==(i-1+sz)%sz||j==i||j==i+1||j==i+2)continue;int k=tour[(j+1)%sz];int ins=dm[tour[j]][ci]+dm[ni2][k]-dm[tour[j]][k];if(rmv-ins>bg){bg=rmv-ins;bi=i;bj=j;}}}if(bi!=-1){int ci=tour[bi],ni=tour[bi+1],ni2=tour[bi+2];tour.erase(tour.begin()+bi,tour.begin()+bi+3);int ip=(bj<bi)?bj+1:bj-2;tour.insert(tour.begin()+ip,ni2);tour.insert(tour.begin()+ip,ni);tour.insert(tour.begin()+ip,ci);return true;}return false;};\n    auto tourCost=[&](){int sz=tour.size(),c=0;for(int i=0;i<sz;i++)c+=dm[tour[i]][tour[(i+1)%sz]];return c;};\n    auto runLS=[&](){do2opt();for(int k=0;k<150;k++)if(!doOrOpt())break;do2opt();for(int k=0;k<20;k++){if(!doOrOpt())break;do2opt();}for(int k=0;k<20;k++){if(!doOrOpt2())break;do2opt();}for(int k=0;k<15;k++){if(!doOrOpt3())break;do2opt();}do2opt();};\n    auto checkCovers=[&](const vector<int>& t)->bool{\n        vector<bool> cv(R,false);int sz=t.size();\n        for(int i=0;i<sz;i++){int fi=t[i],toSq=sents[t[(i+1)%sz]],srcSq=sents[fi];\n            int si2=rIdx[srcSq];if(si2>=0)for(int j:vis[si2])cv[j]=true;\n            for(int c=toSq;c!=srcSq;c=aP[fi][c]){int ci=rIdx[c];if(ci>=0)for(int j:vis[ci])cv[j]=true;}}\n        for(int j=0;j<R;j++)if(!cv[j])return false;return true;};\n    mt19937 rng(42);\n    int bestCost=INF;vector<int> bestTour;\n    auto trySave=[&](){runLS();int c=tourCost();if(c<bestCost){bestCost=c;bestTour=tour;}};\n    {vector<bool> tv(S,false);tour={0};tv[0]=true;for(int s=1;s<S;s++){int cur=tour.back(),best=-1,bd=INF;for(int j=0;j<S;j++)if(!tv[j]&&dm[cur][j]<bd){bd=dm[cur][j];best=j;}tour.push_back(best);tv[best]=true;}trySave();}\n    {tour={0};vector<bool> inT(S,false);inT[0]=true;while((int)tour.size()<S){int bn=-1,bp=-1,bi2=INF;int sz=tour.size();for(int node=1;node<S;node++){if(inT[node])continue;for(int pos=0;pos<sz;pos++){int a=tour[pos],b=tour[(pos+1)%sz];int inc=dm[a][node]+dm[node][b]-dm[a][b];if(inc<bi2){bi2=inc;bn=node;bp=pos;}}}tour.insert(tour.begin()+bp+1,bn);inT[bn]=true;}trySave();}\n    {tour={0};vector<bool> inT(S,false);inT[0]=true;while((int)tour.size()<S){int fn=-1,fd=0;for(int node=1;node<S;node++){if(inT[node])continue;int minD=INF;for(int t:tour)minD=min(minD,dm[t][node]);if(minD>fd){fd=minD;fn=node;}}int sz=tour.size(),bp=-1,bi2=INF;for(int pos=0;pos<sz;pos++){int a=tour[pos],b=tour[(pos+1)%sz];int inc=dm[a][fn]+dm[fn][b]-dm[a][b];if(inc<bi2){bi2=inc;bp=pos;}}tour.insert(tour.begin()+bp+1,fn);inT[fn]=true;}trySave();}\n    for(int r=0;r<3;r++){vector<int> rem;for(int i=1;i<S;i++)rem.push_back(i);shuffle(rem.begin(),rem.end(),rng);tour={0};for(int x:rem)tour.push_back(x);trySave();}\n    auto doubleBridge=[&](){int sz=tour.size();if(sz<8)return;int a=1+rng()%(max(1,sz/4));int b=a+1+rng()%(max(1,sz/4));int p3=b+1+rng()%(max(1,sz/4));if(p3>=sz)p3=sz-1;if(b>=p3)b=p3-1;if(a>=b)a=b-1;if(a<1)a=1;vector<int> nt;nt.reserve(sz);for(int i=0;i<a;i++)nt.push_back(tour[i]);for(int i=b;i<p3;i++)nt.push_back(tour[i]);for(int i=a;i<b;i++)nt.push_back(tour[i]);for(int i=p3;i<sz;i++)nt.push_back(tour[i]);tour=nt;};\n    while(ms()<2200){tour=bestTour;doubleBridge();runLS();int c=tourCost();if(c<bestCost){bestCost=c;bestTour=tour;}}\n    // Direct sim removal (FINAL - no reordering after)\n    tour=bestTour;\n    for(int pass=0;pass<1000&&ms()<2600;pass++){\n        bool removed=false;int sz=tour.size();\n        for(int ti=sz-1;ti>=1&&ms()<2600;ti--){\n            auto nt=tour;nt.erase(nt.begin()+ti);\n            if(checkCovers(nt)){tour=nt;removed=true;break;}\n        }\n        if(!removed)break;\n    }\n    // Coverage-preserving local search\n    {auto cp2opt=[&]()->bool{int sz=tour.size();for(int i=0;i<sz-1;i++)for(int j=i+2;j<sz;j++){if(i==0&&j==sz-1)continue;int a=tour[i],b=tour[i+1],c=tour[j],d=tour[(j+1)%sz];if(dm[a][c]+dm[b][d]<dm[a][b]+dm[c][d]){auto nt=tour;reverse(nt.begin()+i+1,nt.begin()+j+1);if(checkCovers(nt)){tour=nt;return true;}}}return false;};\n    auto cpOrOpt=[&]()->bool{int sz=tour.size();for(int i=1;i<sz;i++){int pi=tour[(i-1+sz)%sz],ci=tour[i],ni=tour[(i+1)%sz];int rmv=dm[pi][ci]+dm[ci][ni]-dm[pi][ni];if(rmv<=0)continue;for(int j=0;j<sz;j++){if(j==i||j==(i-1+sz)%sz)continue;int nj=tour[(j+1)%sz];if(rmv-dm[tour[j]][ci]-dm[ci][nj]+dm[tour[j]][nj]>0){auto nt=tour;nt.erase(nt.begin()+i);int ip=(j<i)?j+1:j;nt.insert(nt.begin()+ip,ci);if(checkCovers(nt)){tour=nt;return true;}}}}return false;};\n    auto cpOrOpt2=[&]()->bool{int sz=tour.size();if(sz<5)return false;for(int i=1;i<sz-1;i++){int a=tour[(i-1+sz)%sz],ci=tour[i],ni=tour[i+1],b=tour[(i+2)%sz];int rmv=dm[a][ci]+dm[ni][b]-dm[a][b];if(rmv<=0)continue;for(int j=0;j<sz;j++){if(j==(i-1+sz)%sz||j==i||j==i+1)continue;int k=tour[(j+1)%sz];if(rmv-dm[tour[j]][ci]-dm[ni][k]+dm[tour[j]][k]>0){auto nt=tour;nt.erase(nt.begin()+i,nt.begin()+i+2);int ip=(j<i)?j+1:j-1;nt.insert(nt.begin()+ip,ni);nt.insert(nt.begin()+ip,ci);if(checkCovers(nt)){tour=nt;return true;}}}}return false;};\n    bool any=true;while(any&&ms()<2900){any=false;if(cp2opt())any=true;if(cpOrOpt())any=true;if(cpOrOpt2())any=true;}}\n    int finS=tour.size();string res;\n    for(int i=0;i<finS;i++){int fi=tour[i],tSq=sents[tour[(i+1)%finS]],sSq=sents[fi];\n        vector<int> path;for(int c=tSq;c!=sSq;c=aP[fi][c])path.push_back(c);\n        reverse(path.begin(),path.end());\n        int pp=sSq;for(int nx:path){int pr=pp/N,pc=pp%N,nr=nx/N,nc=nx%N;if(nr<pr)res+='U';else if(nr>pr)res+='D';else if(nc<pc)res+='L';else res+='R';pp=nx;}}\n    cout<<res<<\"\\n\";return 0;\n}","future-contest-2022-qual":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,K,R;\nvector<vector<int>> d,succs,preds;\nvector<int> task_st,task_pre,task_w,worker_t,task_sd;\nvector<vector<double>> sk,et;\nvector<vector<int>> lb;\nvector<vector<pair<int,int>>> obs;\nvector<double> cp;\nint cur_day;double prior_sk;\nvoid upd_et(int w){for(int i=0;i<N;i++){double ww=0;for(int k=0;k<K;k++){double df=d[i][k]-sk[w][k];if(df>0)ww+=df;}et[i][w]=ww<0.5?1.0:ww;}}\nvoid calc_cp(){cp.assign(N,0.0);for(int i=N-1;i>=0;i--){if(task_st[i]==2)continue;double mn;if(task_st[i]==1){double rem=task_sd[i]+et[i][task_w[i]]-cur_day;mn=max(1.0,rem);}else{mn=et[i][0];for(int j=1;j<M;j++)mn=min(mn,et[i][j]);}double mx=0;for(int v:succs[i])mx=max(mx,cp[v]);cp[i]=mn+mx;}}\nvoid refit(int w){int n=(int)obs[w].size();double decay=exp(-0.1*n);for(int k=0;k<K;k++)sk[w][k]=max((double)lb[w][k],prior_sk*decay);double lr=1.0;for(int it=0;it<200;it++){double delta[20]={};double loss=0;for(auto&[ti,to]:obs[w]){double wh=0;for(int k=0;k<K;k++){double df=d[ti][k]-sk[w][k];if(df>0)wh+=df;}double tgt=to==1?0.0:(double)to,err=wh-tgt;loss+=err*err;for(int k=0;k<K;k++){if(d[ti][k]>sk[w][k])delta[k]+=err;else if(err<-0.5&&d[ti][k]>0)delta[k]+=0.3*err;}}bool ch=false;for(int k=0;k<K;k++){double ns=max((double)lb[w][k],max(0.0,sk[w][k]+lr*delta[k]/n));if(ns!=sk[w][k]){sk[w][k]=ns;ch=true;}}if(!ch||loss/n<0.1)break;lr*=0.95;}upd_et(w);}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    cin>>N>>M>>K>>R;d.assign(N,vector<int>(K));for(int i=0;i<N;i++)for(int k=0;k<K;k++)cin>>d[i][k];\n    succs.assign(N,{});preds.assign(N,{});task_pre.assign(N,0);\n    for(int r=0;r<R;r++){int u,v;cin>>u>>v;u--;v--;succs[u].push_back(v);preds[v].push_back(u);task_pre[v]++;}\n    task_st.assign(N,0);task_w.assign(N,-1);worker_t.assign(M,-1);task_sd.assign(N,0);\n    prior_sk=40.0/sqrt((double)K);sk.assign(M,vector<double>(K,prior_sk));lb.assign(M,vector<int>(K,0));obs.resize(M);\n    et.assign(N,vector<double>(M));for(int j=0;j<M;j++)upd_et(j);\n    set<int>avail,idle;for(int i=0;i<N;i++)if(!task_pre[i])avail.insert(i);for(int j=0;j<M;j++)idle.insert(j);\n    cur_day=0;\n    while(true){\n        cur_day++;calc_cp();\n        vector<int>av(avail.begin(),avail.end());sort(av.begin(),av.end(),[](int a,int b){return cp[a]>cp[b];});\n        // Extended reservation: check ALL tasks with 1-2 in-progress prerequisites\n        map<int,double>res_cp;\n        if(!av.empty()){\n            double maxcp=cp[av[0]];\n            for(int nxt=0;nxt<N;nxt++){\n                if(task_st[nxt]!=0||cp[nxt]<maxcp*0.5)continue;\n                if(task_pre[nxt]<1||task_pre[nxt]>2)continue;\n                double max_rem=0;bool ok=true;\n                for(int p:preds[nxt]){\n                    if(task_st[p]==2)continue;\n                    if(task_st[p]==0){ok=false;break;}\n                    int el=cur_day-task_sd[p];\n                    max_rem=max(max_rem,max(1.0,et[p][task_w[p]]-el));\n                }\n                if(!ok||max_rem<0.5||max_rem>3.0)continue;\n                int bw=-1;double bet=1e18;\n                for(int j:idle)if(et[nxt][j]<bet){bet=et[nxt][j];bw=j;}\n                if(bw==-1||bet>1.5)continue;\n                double sec=1e18;for(int j=0;j<M;j++)if(j!=bw)sec=min(sec,et[nxt][j]);\n                double savings=sec-bet;\n                if(savings>=2.0&&savings>max_rem+0.5){if(!res_cp.count(bw)||res_cp[bw]<cp[nxt])res_cp[bw]=cp[nxt];}\n            }\n        }\n        vector<pair<int,int>>asgn;set<int>id=idle;\n        for(int t:av){if(id.empty())break;int bw=-1;double bt=1e18;for(int j:id){if(res_cp.count(j)&&cp[t]<res_cp[j]*0.85)continue;if(et[t][j]<bt){bt=et[t][j];bw=j;}}if(bw==-1){for(int j:id)if(et[t][j]<bt){bt=et[t][j];bw=j;}}if(bw==-1)break;asgn.push_back({bw,t});id.erase(bw);}\n        {bool sub_any=true;while(sub_any){sub_any=false;set<int>asgn_set;for(auto&[w,t]:asgn)asgn_set.insert(t);for(int i=0;i<(int)asgn.size();i++){int wi=asgn[i].first,ti=asgn[i].second;if(et[ti][wi]<=3.0)continue;double rcp_ti=0;for(int v:succs[ti])rcp_ti=max(rcp_ti,cp[v]);double curr_cost=et[ti][wi]+rcp_ti;int best_tj=-1;double best_nc=curr_cost-2.0;for(int tj:avail){if(asgn_set.count(tj))continue;if(cp[tj]<cp[ti]*0.9)continue;if(et[tj][wi]>1.0)continue;double rcp_tj=0;for(int v:succs[tj])rcp_tj=max(rcp_tj,cp[v]);double nc=et[tj][wi]+rcp_tj;if(nc<best_nc){best_nc=nc;best_tj=tj;}}if(best_tj!=-1){asgn[i]={wi,best_tj};asgn_set.erase(ti);asgn_set.insert(best_tj);sub_any=true;}}}}\n        int na=asgn.size();\n        if(na>=2){vector<double>rcp_a(na,0.0);for(int i=0;i<na;i++)for(int v:succs[asgn[i].second])rcp_a[i]=max(rcp_a[i],cp[v]);bool impr=true;while(impr){impr=false;for(int i=0;i<na;i++)for(int j=i+1;j<na;j++){int wi=asgn[i].first,ti=asgn[i].second,wj=asgn[j].first,tj=asgn[j].second;double ci=et[ti][wi]+rcp_a[i],cj=et[tj][wj]+rcp_a[j],cs=max(et[ti][wj]+rcp_a[i],et[tj][wi]+rcp_a[j]);if(cs<max(ci,cj)-1e-9){swap(asgn[i].first,asgn[j].first);impr=true;}}}}\n        cout<<asgn.size();for(auto[w,t]:asgn){cout<<' '<<w+1<<' '<<t+1;task_w[t]=w;worker_t[w]=t;task_sd[t]=cur_day;task_st[t]=1;avail.erase(t);idle.erase(w);}\n        cout<<'\\n';cout.flush();\n        int nc;cin>>nc;if(nc==-1)break;\n        for(int i=0;i<nc;i++){int w;cin>>w;w--;int t=worker_t[w];int tk=cur_day-task_sd[t]+1;obs[w].push_back({t,tk});if(tk==1)for(int k=0;k<K;k++)lb[w][k]=max(lb[w][k],d[t][k]);refit(w);task_st[t]=2;task_w[t]=-1;worker_t[w]=-1;idle.insert(w);for(int v:succs[t])if(!--task_pre[v])avail.insert(v);}\n    }\n}","ahc006":"#include <bits/stdc++.h>\nusing namespace std;\nconst int OX=400,OY=400,TOT=1000,K=50,NN=2*K+1;\nint A[TOT],B[TOT],C[TOT],D[TOT],sel[K],NX[NN],NY[NN];\nint md(int x1,int y1,int x2,int y2){return abs(x1-x2)+abs(y1-y2);}\nint ec(int u,int v){return md(NX[u],NY[u],NX[v],NY[v]);}\nvoid refresh(){NX[0]=OX;NY[0]=OY;for(int i=0;i<K;i++){NX[i+1]=A[sel[i]];NY[i+1]=B[sel[i]];NX[K+i+1]=C[sel[i]];NY[K+i+1]=D[sel[i]];}}\nint tcost(const vector<int>&r){int s=0;for(int i=0;i+1<(int)r.size();i++)s+=ec(r[i],r[i+1]);return s;}\nbool feasible(const vector<int>&r){bool p[K+1]={};for(int v:r){if(v>=1&&v<=K)p[v]=true;else if(v>K&&!p[v-K])return false;}return true;}\nvector<int> build_nn(){bool vis[NN]={},has[K+1]={};vector<int> r={0};vis[0]=true;for(int s=0;s<2*K;s++){int cur=r.back(),bv=-1,bd=INT_MAX;for(int v=1;v<NN;v++){if(vis[v]||(v>K&&!has[v-K]))continue;int dd=ec(cur,v);if(dd<bd){bd=dd;bv=v;}}r.push_back(bv);vis[bv]=true;if(bv<=K)has[bv]=true;}r.push_back(0);return r;}\nbool two_opt_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++)for(int j=i+1;j<n-1;j++)if(ec(r[i-1],r[j])+ec(r[i],r[j+1])<ec(r[i-1],r[i])+ec(r[j],r[j+1])){reverse(r.begin()+i,r.begin()+j+1);if(feasible(r))any=true;else reverse(r.begin()+i,r.begin()+j+1);}return any;}\nbool or1_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-1;i++){int v=r[i];int rem=ec(r[i-1],v)+ec(v,r[i+1])-ec(r[i-1],r[i+1]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i)continue;int ins=ec(r[j],v)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i)nr.push_back(r[k]);nr.insert(nr.begin()+((bj<i)?bj+1:bj),v);if(feasible(nr)){r=nr;any=true;}}return any;}\nbool or2_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-2;i++){int u=r[i],v=r[i+1];int rem=ec(r[i-1],u)+ec(v,r[i+2])-ec(r[i-1],r[i+2]);if(rem<=0)continue;int bj=-1,bd=0;for(int j=0;j<n-1;j++){if(j==i-1||j==i||j==i+1)continue;int ins=ec(r[j],u)+ec(v,r[j+1])-ec(r[j],r[j+1]);if(rem-ins>bd){bd=rem-ins;bj=j;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i&&k!=i+1)nr.push_back(r[k]);int pos=(bj<i)?bj+1:bj-1;nr.insert(nr.begin()+pos,u);nr.insert(nr.begin()+pos+1,v);if(feasible(nr)){r=nr;any=true;}}return any;}\nbool or3_pass(vector<int>&r){int n=r.size();bool any=false;for(int i=1;i<n-3;i++){int u=r[i],v=r[i+1],w=r[i+2];int rem=ec(r[i-1],u)+ec(w,r[i+3])-ec(r[i-1],r[i+3]);if(rem<=0)continue;int bj=-1,bd=0;bool rev=false;for(int j=0;j<n-1;j++){if(j>=i-1&&j<=i+2)continue;int inf=ec(r[j],u)+ec(w,r[j+1])-ec(r[j],r[j+1]);if(rem-inf>bd){bd=rem-inf;bj=j;rev=false;}int inr=ec(r[j],w)+ec(u,r[j+1])-ec(r[j],r[j+1]);if(rem-inr>bd){bd=rem-inr;bj=j;rev=true;}}if(bj<0)continue;vector<int> nr;nr.reserve(n);for(int k=0;k<n;k++)if(k!=i&&k!=i+1&&k!=i+2)nr.push_back(r[k]);int pos=(bj<i)?bj+1:bj-2;if(!rev){nr.insert(nr.begin()+pos,u);nr.insert(nr.begin()+pos+1,v);nr.insert(nr.begin()+pos+2,w);}else{nr.insert(nr.begin()+pos,w);nr.insert(nr.begin()+pos+1,v);nr.insert(nr.begin()+pos+2,u);}if(feasible(nr)){r=nr;any=true;}}return any;}\nvoid full_search(vector<int>&r){for(;;){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvoid quick_search(vector<int>&r,int it=5){for(int i=0;i<it;i++){bool a=two_opt_pass(r),b=or1_pass(r),c=or2_pass(r);if(!a&&!b&&!c)break;}}\nvector<int> build_perturbed(const vector<int>&base,int si){int pi=si+1,di=K+si+1;vector<int> r;r.reserve(base.size()-2);for(int v:base)if(v!=pi&&v!=di)r.push_back(v);int n=r.size();int bc=INT_MAX,bp=0,bd2=1;for(int p=0;p<n-1;p++){int cp=md(NX[r[p]],NY[r[p]],NX[pi],NY[pi])+md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]])-md(NX[r[p]],NY[r[p]],NX[r[p+1]],NY[r[p+1]]);{int cd=md(NX[pi],NY[pi],NX[di],NY[di])+md(NX[di],NY[di],NX[r[p+1]],NY[r[p+1]])-md(NX[pi],NY[pi],NX[r[p+1]],NY[r[p+1]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=p+1;}}for(int d=p+2;d<n;d++){int cd=md(NX[r[d-1]],NY[r[d-1]],NX[di],NY[di])+md(NX[di],NY[di],NX[r[d]],NY[r[d]])-md(NX[r[d-1]],NY[r[d-1]],NX[r[d]],NY[r[d]]);if(cp+cd<bc){bc=cp+cd;bp=p;bd2=d;}}}vector<int> res=r;res.insert(res.begin()+bp+1,pi);res.insert(res.begin()+bd2+1,di);return res;}\nvector<int> double_bridge(const vector<int>&r,mt19937&rng){int n=r.size();if(n<8)return r;int pos[4];do{for(int i=0;i<4;i++)pos[i]=1+rng()%(n-2);}while(pos[0]==pos[1]||pos[0]==pos[2]||pos[0]==pos[3]||pos[1]==pos[2]||pos[1]==pos[3]||pos[2]==pos[3]);sort(pos,pos+4);int a=pos[0],b=pos[1],c=pos[2],d=pos[3];vector<int> nr;nr.reserve(n);for(int i=0;i<a;i++)nr.push_back(r[i]);for(int i=c;i<d;i++)nr.push_back(r[i]);for(int i=b;i<c;i++)nr.push_back(r[i]);for(int i=a;i<b;i++)nr.push_back(r[i]);for(int i=d;i<n;i++)nr.push_back(r[i]);return nr;}\nvoid emit(const vector<int>&r){cout<<K;for(int i=0;i<K;i++)cout<<\" \"<<(sel[i]+1);cout<<\"\\n\"<<r.size();for(int v:r)cout<<\" \"<<NX[v]<<\" \"<<NY[v];cout<<\"\\n\";cout.flush();}\nusing Clk=chrono::steady_clock;Clk::time_point T0;double esec(){return chrono::duration<double>(Clk::now()-T0).count();}\nint bcost=INT_MAX;vector<int> broute;int bsel[K];bool inS[TOT]={};\nvoid trysel(){refresh();auto r=build_nn();full_search(r);int c=tcost(r);if(c<bcost){bcost=c;broute=r;copy(sel,sel+K,bsel);}}\nbool greedy_step(){\n    int n=broute.size();vector<int> pos(NN,-1);for(int i=0;i<n;i++)pos[broute[i]]=i;\n    vector<int> rem(K);for(int i=0;i<K;i++){int pi=i+1,di=K+i+1,pp=pos[pi],dp=pos[di];rem[i]=ec(broute[pp-1],pi)+ec(pi,broute[pp+1])-ec(broute[pp-1],broute[pp+1])+ec(broute[dp-1],di)+ec(di,broute[dp+1])-ec(broute[dp-1],broute[dp+1]);}\n    vector<tuple<int,int,int>> cands;\n    for(int j=0;j<TOT;j++){if(inS[j])continue;int px=A[j],py=B[j],dx=C[j],dy=D[j];int ins=INT_MAX;for(int p=0;p<n-1;p++){int c=md(NX[broute[p]],NY[broute[p]],px,py)+md(px,py,dx,dy)+md(dx,dy,NX[broute[p+1]],NY[broute[p+1]])-ec(broute[p],broute[p+1]);if(c<ins)ins=c;}for(int si=0;si<K;si++){int g=rem[si]-ins;if(g>0)cands.emplace_back(g,si,j);}}\n    if(cands.empty())return false;\n    int tk=min(10,(int)cands.size());partial_sort(cands.begin(),cands.begin()+tk,cands.end(),greater<tuple<int,int,int>>());\n    for(int ci=0;ci<tk;ci++){auto&[g,si,j]=cands[ci];if(inS[j])continue;int old=sel[si];sel[si]=j;refresh();auto nr=build_perturbed(broute,si);quick_search(nr,10);int nc=tcost(nr);if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[j]=true;inS[old]=false;return true;}sel[si]=old;refresh();}\n    return false;\n}\nvoid run_max_cluster(){\n    vector<bool> used(TOT,false);vector<pair<int,int>> pts={{OX,OY}};\n    for(int k=0;k<K;k++){int bj=-1,bs=INT_MAX;for(int j=0;j<TOT;j++){if(used[j])continue;int mp=INT_MAX,md2=INT_MAX;for(auto&[px,py]:pts){mp=min(mp,md(A[j],B[j],px,py));md2=min(md2,md(C[j],D[j],px,py));}int s=max(mp,md2);if(s<bs){bs=s;bj=j;}}sel[k]=bj;used[bj]=true;pts.push_back({A[bj],B[bj]});pts.push_back({C[bj],D[bj]});}\n    trysel();\n}\nvoid try_sum_cluster_strict(int thresh){\n    vector<bool> used(TOT,false);vector<pair<int,int>> pts={{OX,OY}};\n    for(int k=0;k<K;k++){int bj=-1,bs=INT_MAX;for(int j=0;j<TOT;j++){if(used[j])continue;int mp=INT_MAX,md2=INT_MAX;for(auto&[px,py]:pts){mp=min(mp,md(A[j],B[j],px,py));md2=min(md2,md(C[j],D[j],px,py));}int s=mp+md2;if(s<bs){bs=s;bj=j;}}sel[k]=bj;used[bj]=true;pts.push_back({A[bj],B[bj]});pts.push_back({C[bj],D[bj]});}\n    refresh();auto rr=build_nn();full_search(rr);int c=tcost(rr);\n    if(c<bcost&&c<thresh){bcost=c;broute=rr;copy(sel,sel+K,bsel);}\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);T0=Clk::now();\n    for(int i=0;i<TOT;i++)cin>>A[i]>>B[i]>>C[i]>>D[i];\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(A[i],B[i],C[i],D[i])+md(C[i],D[i],OX,OY),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={md(OX,OY,A[i],B[i])+md(OX,OY,C[i],D[i]),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    {vector<pair<int,int>> sc(TOT);for(int i=0;i<TOT;i++)sc[i]={max(md(OX,OY,A[i],B[i]),md(OX,OY,C[i],D[i])),i};sort(sc.begin(),sc.end());for(int i=0;i<K;i++)sel[i]=sc[i].second;trysel();}\n    copy(bsel,bsel+K,sel);refresh();memset(inS,false,sizeof(inS));for(int i=0;i<K;i++)inS[sel[i]]=true;\n    emit(broute);\n    while(esec()<0.40) if(!greedy_step()) break;\n    int bcost_g1=bcost;\n    run_max_cluster(); // Conservative: beats phase-1 greedy\n    int bcost_after_max=bcost; // KEY CHANGE: use this as reference for sum-clustering\n    // Sum-clustering must beat the CURRENT BEST (including max-clustering) by 5%\n    // This is stricter when max-clustering already improved things (protects cases 42, 22)\n    try_sum_cluster_strict(bcost_after_max*95/100);\n    if(bcost<bcost_g1){\n        copy(bsel,bsel+K,sel);refresh();\n        memset(inS,false,sizeof(inS));for(int i=0;i<K;i++)inS[sel[i]]=true;\n        while(esec()<0.50) if(!greedy_step()) break;\n    }\n    mt19937 rng(42);\n    while(esec()<1.80){\n        copy(bsel,bsel+K,sel);refresh();\n        if(rng()%4!=0){\n            auto nr=double_bridge(broute,rng);\n            if(!feasible(nr)) continue;\n            full_search(nr);int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;}\n        } else {\n            int si=rng()%K,no;do{no=rng()%TOT;}while(inS[no]);\n            int oo=sel[si];sel[si]=no;refresh();\n            auto nr=build_perturbed(broute,si);quick_search(nr,5);\n            int nc=tcost(nr);\n            if(nc<bcost){bcost=nc;broute=nr;copy(sel,sel+K,bsel);inS[no]=true;inS[oo]=false;}\n        }\n    }\n    copy(bsel,bsel+K,sel);refresh();\n    while(esec()<1.90) if(!greedy_step()) break;\n    copy(bsel,bsel+K,sel);refresh();\n    for(;;){if(esec()>1.95)break;bool a=two_opt_pass(broute),b=or1_pass(broute),c=or2_pass(broute),d=or3_pass(broute);if(!a&&!b&&!c&&!d)break;}\n    emit(broute);\n    return 0;\n}","ahc007":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=400,M=1995;\nint px[N],py[N],eu[M],ev[M];long long ed[M];\nstruct UF{int p[N],r[N];\nvoid init(){for(int i=0;i<N;i++)p[i]=i,r[i]=0;}\nint find(int x){while(p[x]!=x)x=p[x]=p[p[x]];return x;}\nbool same(int x,int y){return find(x)==find(y);}\nvoid unite(int x,int y){x=find(x);y=find(y);if(x==y)return;if(r[x]<r[y])swap(x,y);p[y]=x;if(r[x]==r[y])r[x]++;}\nint ncomp(){int c=0;for(int i=0;i<N;i++)if(find(i)==i)c++;return c;}}uf;\ndouble compute_thr(int ie,int cu,int cv,int k,long long mn,long long max_eff_d,int eff_k){\n    int cid[N];fill(cid,cid+N,-1);int nc=0;\n    for(int v=0;v<N;v++){int r=uf.find(v);if(cid[r]==-1)cid[r]=nc++;}\n    int src=cid[cu],dst=cid[cv];\n    vector<vector<pair<int,double>>>cadj(nc);\n    for(int j=ie+1;j<M;j++){\n        int fu=uf.find(eu[j]),fv=uf.find(ev[j]);if(fu==fv)continue;\n        int a=cid[fu],b=cid[fv];\n        if(k>0&&((a==src&&b==dst)||(a==dst&&b==src)))continue;\n        double w=2.0*ed[j];cadj[a].push_back({b,w});cadj[b].push_back({a,w});\n    }\n    vector<double>dist(nc,1e18);vector<int>hops(nc,0);\n    {priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>>pq;\n    dist[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){auto[dv,u]=pq.top();pq.pop();\n        if(dv>dist[u]+1e-9)continue;if(u==dst)break;\n        for(auto&[v,w]:cadj[u]){double nd=dist[u]+w;if(nd<dist[v]){dist[v]=nd;hops[v]=hops[u]+1;pq.push({nd,v});}}}}\n    vector<double>bn(nc,1e18);\n    {priority_queue<pair<double,int>,vector<pair<double,int>>,greater<>>pq;\n    bn[src]=0;pq.push({0.0,src});\n    while(!pq.empty()){auto[bv,u]=pq.top();pq.pop();\n        if(bv>bn[u]+1e-9)continue;if(u==dst)break;\n        for(auto&[v,w]:cadj[u]){double nb=max(bn[u],w);if(nb<bn[v]){bn[v]=nb;pq.push({nb,v});}}}}\n    double sum_thr=1e18,bn_thr=1e18;\n    if(dist[dst]<1e17){int n=hops[dst];if(n>0)sum_thr=dist[dst]*(3.0*n+1.0)/(2.0*n*(n+1.0));}\n    if(bn[dst]<1e17)bn_thr=bn[dst];\n    double indir=min(sum_thr,bn_thr);\n    if(k==0)return(indir<1e17)?indir:2.0*ed[ie];\n    double mn_avg=(eff_k>0)?(double)(mn+max_eff_d)/2.0:(double)mn;\n    double ft;\n    if(eff_k==0)ft=3.0*mn_avg;\n    else if(eff_k==1)ft=2.0*mn_avg; // T=2, exact for 1 future\n    else if(eff_k==2){\n        // Exact optimal threshold for 2 future competitive alternatives [mn, max_eff_d]\n        double D=(double)mn,D2=(double)max_eff_d;\n        double pD=min(1.0,(2.0*D2-D)/(2.0*D));\n        double eD=(pD>0)?pD*(D+2.0*D2)/2.0+(1.0-pD)*2.0*D2:2.0*D2;\n        double pD2=max(0.0,(2.0*D-D2)/(2.0*D2));\n        double eD2=pD2*(D2+2.0*D)/2.0+(1.0-pD2)*2.0*D;\n        ft=0.5*eD+0.5*eD2;\n    }\n    else ft=mn_avg*(1.0+2.0/(eff_k+1.0)); // avg formula for eff_k>=3\n    return(indir<1e17)?min(ft,indir):ft;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++)cin>>px[i]>>py[i];\n    for(int i=0;i<M;i++){cin>>eu[i]>>ev[i];double dx=px[eu[i]]-px[ev[i]],dy=py[eu[i]]-py[ev[i]];ed[i]=llround(sqrt(dx*dx+dy*dy));}\n    uf.init();\n    for(int i=0;i<M;i++){\n        long long l;cin>>l;\n        if(uf.same(eu[i],ev[i])){cout<<0<<endl;continue;}\n        {UF tmp=uf;for(int j=i+1;j<M;j++)tmp.unite(eu[j],ev[j]);\n         if(tmp.ncomp()>1){cout<<1<<endl;uf.unite(eu[i],ev[i]);continue;}}\n        int cu=uf.find(eu[i]),cv=uf.find(ev[i]);\n        int k=0;long long mn=LLONG_MAX;\n        for(int j=i+1;j<M;j++){int fu=uf.find(eu[j]),fv=uf.find(ev[j]);if((fu==cu&&fv==cv)||(fu==cv&&fv==cu)){k++;mn=min(mn,ed[j]);}}\n        int eff_k=k;long long max_eff_d=mn;\n        if(k>0){\n            eff_k=0;max_eff_d=mn;\n            long long eff_thresh=mn+mn/2;\n            for(int j=i+1;j<M;j++){int fu=uf.find(eu[j]),fv=uf.find(ev[j]);if((fu==cu&&fv==cv)||(fu==cv&&fv==cu)){if(ed[j]<=eff_thresh){eff_k++;if(ed[j]>max_eff_d)max_eff_d=ed[j];}}}\n        }\n        double thr=compute_thr(i,cu,cv,k,mn,max_eff_d,eff_k);\n        if((double)l<=thr){cout<<1<<endl;uf.unite(eu[i],ev[i]);}else cout<<0<<endl;\n    }\n}","ahc008":"#include <bits/stdc++.h>\nusing namespace std;\nconst int G=30;\nint N,M,px[20],py[20],pt_arr[20],hx[10],hy[10];bool wall[G+2][G+2];\nint spx[20],spy[20],shx[10],shy[10];\nconst int ddx[]={-1,1,0,0},ddy[]={0,0,-1,1};\nconst char DIRS[]=\"UDLR\",WDIRS[]=\"udlr\";\nbool inb(int x,int y){return x>=1&&x<=G&&y>=1&&y<=G;}\nint dbuf[G+2][G+2];\nvoid bfs(int tx,int ty){\n    for(int i=0;i<=G+1;i++)fill(dbuf[i],dbuf[i]+G+2,-1);\n    dbuf[tx][ty]=0;queue<pair<int,int>>q;q.push({tx,ty});\n    while(!q.empty()){auto[x,y]=q.front();q.pop();for(int d=0;d<4;d++){int nx=x+ddx[d],ny=y+ddy[d];if(!inb(nx,ny)||wall[nx][ny]||dbuf[nx][ny]!=-1)continue;dbuf[nx][ny]=dbuf[x][y]+1;q.push({nx,ny});}}\n}\nchar gmv(int sx,int sy,int tx,int ty){\n    if(sx==tx&&sy==ty)return '.';bfs(tx,ty);if(dbuf[sx][sy]==-1)return '.';\n    for(int d=0;d<4;d++){int nx=sx+ddx[d],ny=sy+ddy[d];if(!inb(nx,ny)||wall[nx][ny])continue;if(dbuf[nx][ny]==dbuf[sx][sy]-1)return DIRS[d];}return '.';\n}\nbool cpl(int wx,int wy){\n    if(!inb(wx,wy)||wall[wx][wy])return false;\n    for(int i=0;i<N;i++)if(spx[i]==wx&&spy[i]==wy)return false;\n    for(int i=0;i<M;i++)if(shx[i]==wx&&shy[i]==wy)return false;\n    for(int d=0;d<4;d++){int ax=wx+ddx[d],ay=wy+ddy[d];for(int i=0;i<N;i++)if(spx[i]==ax&&spy[i]==ay)return false;}\n    return true;\n}\nint reg_r1=1,reg_r2=G,reg_c1=1,reg_c2=G;\nbool on_side(int h){return hx[h]>=reg_r1&&hx[h]<=reg_r2&&hy[h]>=reg_c1&&hy[h]<=reg_c2;}\nstruct Task{int wx,wy,sx,sy,wd;};\nvector<Task> tasks;vector<int> te(10),ct(10);\nint cur_wt=-1,cur_wp=-1;bool cur_hp=true;\nbool try_setup_phase(bool is_primary){\n    auto cp=[&](int r1,int c1,int r2,int c2)->int{int c=0;for(int i=0;i<N;i++)if(px[i]>=r1&&px[i]<=r2&&py[i]>=c1&&py[i]<=c2)c++;return c;};\n    auto ch_fn=[&](int r1,int c1,int r2,int c2)->int{int c=0;for(int i=0;i<M;i++)if(hx[i]>=r1&&hx[i]<=r2&&hy[i]>=c1&&hy[i]<=c2)c++;return c;};\n    int pr1=reg_r1,pr2=reg_r2,pc1=reg_c1,pc2=reg_c2;\n    int total=cp(pr1,pc1,pr2,pc2);\n    int prim_area=(pr2-pr1+1)*(pc2-pc1+1);\n    if(prim_area<4)return false;\n    double curr_score=(double)prim_area/900.0*pow(2.0,-(double)total);\n    auto contam_est=[&](int wt2,int wp2,bool hp2)->double{\n        if(is_primary)return 0.0;\n        double c=0;\n        for(int i=0;i<N;i++){\n            if(px[i]<pr1||px[i]>pr2||py[i]<pc1||py[i]>pc2)continue;\n            int d;bool on_pet;\n            if(wt2==0){on_pet=hp2?(py[i]>=wp2):(py[i]<wp2);d=hp2?py[i]-wp2:wp2-1-py[i];}\n            else{on_pet=hp2?(px[i]>=wp2):(px[i]<wp2);d=hp2?px[i]-wp2:wp2-1-px[i];}\n            if(!on_pet||d<0)continue;\n            double sp=1;if(pt_arr[i]==2)sp=2;if(pt_arr[i]==3)sp=3;if(pt_arr[i]==4)sp=2.5;if(pt_arr[i]==5)sp=1.5;\n            c+=exp(-(double)(d*d)/(2.0*sp*sp*30.0));\n        }\n        return c;\n    };\n    auto ev=[&](int area,int n,int hin,int wt2,int wp2,bool hp2)->double{\n        double eff_n=n+contam_est(wt2,wp2,hp2)*0.4;\n        return (double)area/900.0*pow(2.0,-eff_n)*(0.7+0.3*(double)hin/M);\n    };\n    double bv=-1e18;cur_wt=-1;cur_wp=-1;cur_hp=true;\n    for(int c=pc1+1;c<=pc2;c++){\n        int lp=cp(pr1,pc1,pr2,c-1),rp=cp(pr1,c,pr2,pc2);\n        int lh=ch_fn(pr1,pc1,pr2,c-1),rh=ch_fn(pr1,c,pr2,pc2);\n        double vl=ev((c-pc1)*(pr2-pr1+1),lp,lh,0,c,true),vr=ev((pc2-c+1)*(pr2-pr1+1),rp,rh,0,c,false);\n        if(vl>bv){bv=vl;cur_wt=0;cur_wp=c;cur_hp=true;}if(vr>bv){bv=vr;cur_wt=0;cur_wp=c;cur_hp=false;}\n    }\n    for(int r=pr1+1;r<=pr2;r++){\n        int tp=cp(pr1,pc1,r-1,pc2),bp=cp(r,pc1,pr2,pc2);\n        int th=ch_fn(pr1,pc1,r-1,pc2),bh=ch_fn(r,pc1,pr2,pc2);\n        double vt=ev((r-pr1)*(pc2-pc1+1),tp,th,1,r,true),vb=ev((pr2-r+1)*(pc2-pc1+1),bp,bh,1,r,false);\n        if(vt>bv){bv=vt;cur_wt=1;cur_wp=r;cur_hp=true;}if(vb>bv){bv=vb;cur_wt=1;cur_wp=r;cur_hp=false;}\n    }\n    if(cur_wt<0)return false;\n    if(!is_primary){\n        if(bv<curr_score*2.0)return false;\n        int sec_area;\n        if(cur_wt==0)sec_area=(pr2-pr1+1)*(cur_hp?cur_wp-pc1:pc2-cur_wp+1);\n        else sec_area=(cur_hp?cur_wp-pr1:pr2-cur_wp+1)*(pc2-pc1+1);\n        if(sec_area<prim_area*4/10)return false;\n    }\n    tasks.clear();\n    if(cur_wt==0){if(cur_hp)for(int r=pr1;r<=pr2;r++)tasks.push_back({r,cur_wp,r,cur_wp-1,3});else for(int r=pr1;r<=pr2;r++)tasks.push_back({r,cur_wp-1,r,cur_wp,2});}\n    else{if(cur_hp)for(int c=pc1;c<=pc2;c++)tasks.push_back({cur_wp,c,cur_wp-1,c,1});else for(int c=pc1;c<=pc2;c++)tasks.push_back({cur_wp-1,c,cur_wp,c,0});}\n    int TT=tasks.size();\n    vector<int>hord(M);iota(hord.begin(),hord.end(),0);\n    if(cur_wt==0)sort(hord.begin(),hord.end(),[&](int a,int b){return hx[a]<hx[b];});\n    else          sort(hord.begin(),hord.end(),[&](int a,int b){return hy[a]<hy[b];});\n    te.resize(M);ct.resize(M);\n    for(int i=0;i<M;i++){int h=hord[i];ct[h]=i*TT/M;te[h]=(i+1)*TT/M;}\n    if(cur_wt==0){reg_c1=cur_hp?pc1:cur_wp;reg_c2=cur_hp?cur_wp-1:pc2;}\n    else{reg_r1=cur_hp?pr1:cur_wp;reg_r2=cur_hp?cur_wp-1:pr2;}\n    return true;\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    memset(wall,false,sizeof(wall));\n    cin>>N;for(int i=0;i<N;i++)cin>>px[i]>>py[i]>>pt_arr[i];\n    cin>>M;for(int i=0;i<M;i++)cin>>hx[i]>>hy[i];\n    bool active=try_setup_phase(true);\n    for(int turn=0;turn<300;turn++){\n        for(int i=0;i<N;i++){spx[i]=px[i];spy[i]=py[i];}\n        for(int i=0;i<M;i++){shx[i]=hx[i];shy[i]=hy[i];}\n        if(active&&turn>0){\n            bool done=true;for(auto&t:tasks)if(!wall[t.wx][t.wy]){done=false;break;}\n            if(done){if(turn<250)active=try_setup_phase(false);else active=false;}\n        }\n        string acts(M,'.');\n        if(active){\n            int TT=tasks.size();\n            bool all_safe=true;for(int h=0;h<M;h++)if(!on_side(h)){all_safe=false;break;}\n            set<pair<int,int>>pw;vector<bool>isp(M,false);\n            for(int h=0;h<M;h++){\n                while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n                if(ct[h]>=(int)te[h])continue;\n                Task&t=tasks[ct[h]];bool ig=(ct[h]==TT-1)&&!all_safe;\n                if(hx[h]==t.sx&&hy[h]==t.sy&&!ig&&cpl(t.wx,t.wy)&&!pw.count({t.wx,t.wy})){\n                    acts[h]=WDIRS[t.wd];pw.insert({t.wx,t.wy});wall[t.wx][t.wy]=true;ct[h]++;isp[h]=true;\n                }\n            }\n            for(int h=0;h<M;h++){\n                if(isp[h])continue;\n                while(ct[h]<te[h]&&wall[tasks[ct[h]].wx][tasks[ct[h]].wy])ct[h]++;\n                if(ct[h]>=(int)te[h]){\n                    if(!on_side(h)){\n                        int tx,ty;\n                        if(cur_wt==0){tx=hx[h];ty=cur_hp?cur_wp-1:cur_wp;}\n                        else{tx=cur_hp?cur_wp-1:cur_wp;ty=hy[h];}\n                        char mv=gmv(hx[h],hy[h],tx,ty);\n                        acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}\n                    }\n                    continue;\n                }\n                Task&t=tasks[ct[h]];\n                if(hx[h]==t.sx&&hy[h]==t.sy){acts[h]='.';continue;}\n                char mv=gmv(hx[h],hy[h],t.sx,t.sy);\n                acts[h]=mv;if(mv!='.')for(int d=0;d<4;d++)if(DIRS[d]==mv){hx[h]+=ddx[d];hy[h]+=ddy[d];break;}\n            }\n        }\n        cout<<acts<<\"\\n\";cout.flush();\n        for(int i=0;i<N;i++){string s;cin>>s;for(char c:s){if(c=='U')px[i]--;else if(c=='D')px[i]++;else if(c=='L')py[i]--;else if(c=='R')py[i]++;}}\n    }\n    return 0;\n}","ahc009":"#include <bits/stdc++.h>\nusing namespace std;\nint si,sj,ti,tj; double pf;\nbool H[20][19],V[19][20];\nint nb[400][4],G;\ndouble PP[201][400],PE[201];\ndouble VA[201][400];\nvoid initNb(){for(int i=0;i<20;i++)for(int j=0;j<20;j++){int c=i*20+j;nb[c][0]=(i>0&&!V[i-1][j])?(i-1)*20+j:c;nb[c][1]=(i<19&&!V[i][j])?(i+1)*20+j:c;nb[c][2]=(j>0&&!H[i][j-1])?i*20+(j-1):c;nb[c][3]=(j<19&&!H[i][j])?i*20+(j+1):c;}}\nint dc(char c){return c=='U'?0:c=='D'?1:c=='L'?2:3;}\nvoid computeVA(){memset(VA,0,sizeof(VA));for(int t=199;t>=0;t--)for(int c=0;c<400;c++){if(c==G)continue;double best=-1e18;for(int d=0;d<4;d++){int nk=nb[c][d];double v=pf*VA[t+1][c]+(nk==G?(1-pf)*(400.-t):(1-pf)*VA[t+1][nk]);if(v>best)best=v;}VA[t][c]=best;}}\nvoid buildP(const string&s,int fr){for(int t=fr;t<200;t++){int d=dc(s[t]);double*a=PP[t],*b=PP[t+1];memset(b,0,3200);for(int k=0;k<400;k++){double v=a[k];if(v<1e-15)continue;b[k]+=v*pf;b[nb[k][d]]+=v*(1-pf);}double e=b[G]*(401.-(t+1));b[G]=0;PE[t+1]=PE[t]+e;}}\ndouble evalF(const string&s,int fr){double p[400],q[400];memcpy(p,PP[fr],3200);double E=PE[fr];for(int t=fr;t<200;t++){int d=dc(s[t]);memset(q,0,3200);for(int k=0;k<400;k++){double v=p[k];if(v<1e-15)continue;q[k]+=v*pf;q[nb[k][d]]+=v*(1-pf);}E+=q[G]*(401.-(t+1));q[G]=0;memcpy(p,q,3200);}return E;}\nvoid setP(const string&s){memset(PP[0],0,3200);PP[0][si*20+sj]=1;PE[0]=0;buildP(s,0);}\nchrono::time_point<chrono::steady_clock>T0;\ndouble el(){return chrono::duration<double>(chrono::steady_clock::now()-T0).count();}\ndouble hc(string&s,double E0,double tl){double be=E0;for(;;){if(el()>tl)break;bool imp=false;for(int t=0;t<200;t++){int od=dc(s[t]);for(int d=0;d<4;d++){if(d==od)continue;s[t]=\"UDLR\"[d];double e=evalF(s,t);if(e>be+1e-12){be=e;od=d;buildP(s,t);imp=true;}else s[t]=\"UDLR\"[od];}}if(!imp)break;}return be;}\nstring bfsPath(){int ds[400];fill(ds,ds+400,-1);int pr[400],pd[400];int src=si*20+sj;queue<int>q;q.push(src);ds[src]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||ds[nk]!=-1)continue;ds[nk]=ds[k]+1;pr[nk]=k;pd[nk]=d;q.push(nk);}}string r;for(int c=G;c!=src;c=pr[c])r+=\"UDLR\"[pd[c]];reverse(r.begin(),r.end());return r;}\nstring distanceGreedy(){int bd[400];fill(bd,bd+400,-1);queue<int>q;q.push(G);bd[G]=0;while(!q.empty()){int k=q.front();q.pop();for(int d=0;d<4;d++){int nk=nb[k][d];if(nk==k||bd[nk]!=-1)continue;bd[nk]=bd[k]+1;q.push(nk);}}double prob[400]={},np[400];prob[si*20+sj]=1.0;string s(200,'D');for(int t=0;t<200;t++){double best=-1e18;int bestd=0;for(int d=0;d<4;d++){double g=0;for(int k=0;k<400;k++){if(prob[k]<1e-15)continue;g+=prob[k]*(1-pf)*(bd[k]-bd[nb[k][d]]);}if(g>best){best=g;bestd=d;}}s[t]=\"UDLR\"[bestd];memset(np,0,3200);for(int k=0;k<400;k++){if(prob[k]<1e-15)continue;np[k]+=prob[k]*pf;np[nb[k][bestd]]+=prob[k]*(1-pf);}np[G]=0;memcpy(prob,np,3200);}return s;}\ndouble la_val(const double*prob,int t,int depth){if(depth==0||t>=200){double v=0;for(int k=0;k<400;k++)if(prob[k]>1e-15)v+=prob[k]*(t<200?VA[t][k]:0.);return v;}double best=-1e18,np[400];for(int d=0;d<4;d++){memset(np,0,3200);for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nb[k][d]]+=v*(1-pf);}double sc=np[G]*(400.-t);np[G]=0;double fv=la_val(np,t+1,depth-1);if(sc+fv>best)best=sc+fv;}return best;}\nstring kStepGreedy(int K){double prob[400]={},np[400];prob[si*20+sj]=1.0;string s(200,'D');for(int t=0;t<200;t++){double best=-1e18;int bestd=0;for(int d=0;d<4;d++){memset(np,0,3200);for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nb[k][d]]+=v*(1-pf);}double sc=np[G]*(400.-t);np[G]=0;double fv=la_val(np,t+1,K-1);if(sc+fv>best){best=sc+fv;bestd=d;}}s[t]=\"UDLR\"[bestd];memset(np,0,3200);for(int k=0;k<400;k++){double v=prob[k];if(v<1e-15)continue;np[k]+=v*pf;np[nb[k][bestd]]+=v*(1-pf);}np[G]=0;memcpy(prob,np,3200);}return s;}\nint main(){\n    ios::sync_with_stdio(0);cin.tie(0);\n    cin>>si>>sj>>ti>>tj>>pf;\n    for(int i=0;i<20;i++){string r;cin>>r;for(int j=0;j<19;j++)H[i][j]=(r[j]=='1');}\n    for(int i=0;i<19;i++){string r;cin>>r;for(int j=0;j<20;j++)V[i][j]=(r[j]=='1');}\n    initNb();G=ti*20+tj;T0=chrono::steady_clock::now();\n    computeVA();\n    string path=bfsPath();int K=(int)path.size();\n    string s1(200,'D');for(int i=0;i<200;i++)s1[i]=path[i%K];\n    string s2=kStepGreedy(3);\n    string s3=distanceGreedy();\n    setP(s1);double e1=hc(s1,PE[200],0.13);\n    setP(s2);double e2=hc(s2,PE[200],0.27);\n    setP(s3);double e3=hc(s3,PE[200],0.43);\n    string gb;double gbE;\n    if(e1>=e2&&e1>=e3){gb=s1;gbE=e1;}else if(e2>=e3){gb=s2;gbE=e2;}else{gb=s3;gbE=e3;}\n    setP(gb);\n    mt19937 rng(42);uniform_real_distribution<double>ud(0,1);\n    {string sc=gb;double scE=gbE;double T=2.0;int sa_st=0;const int SA_MAX=6000;\n    while(el()<1.2&&sa_st<SA_MAX){\n        int t=rng()%200,od=dc(sc[t]),nd=(od+1+(int)(rng()%3))%4;\n        sc[t]=\"UDLR\"[nd];double e=evalF(sc,t),dlt=e-scE;\n        if(dlt>0||ud(rng)<exp(dlt/T)){scE=e;buildP(sc,t);if(e>gbE){gbE=e;gb=sc;}}\n        else sc[t]=\"UDLR\"[od];\n        sa_st++;\n        if(sa_st%500==0){T=2.0*exp(-7.0*(double)sa_st/SA_MAX);if(scE<gbE-20.){sc=gb;scE=gbE;setP(sc);}}\n    }}\n    setP(gb);\n    // Alt SA 1 from s3 - T=2.0 for aggressive exploration (key upgrade from Round 11)\n    {setP(s3);string sc=s3;double scE=e3;\n    mt19937 a1(999);uniform_real_distribution<double>u1(0,1);\n    double T=2.0;int st=0;\n    while(st<500&&el()<1.23){\n        int t=a1()%200,od=dc(sc[t]),nd=(od+1+(int)(a1()%3))%4;\n        sc[t]=\"UDLR\"[nd];double e=evalF(sc,t),dlt=e-scE;\n        if(dlt>0||u1(a1)<exp(dlt/T)){scE=e;buildP(sc,t);if(e>gbE){gbE=e;gb=sc;}}\n        else sc[t]=\"UDLR\"[od];\n        st++;T=2.0*exp(-7.0*(double)st/500);\n        if(st%100==0&&scE<gbE-25.){sc=s3;scE=e3;setP(s3);}\n    }}\n    // Alt SA 2 from s2 - additional basin coverage\n    {setP(s2);string sc=s2;double scE=e2;\n    mt19937 a2(555);uniform_real_distribution<double>u2(0,1);\n    double T=1.0;int st=0;\n    while(st<200&&el()<1.26){\n        int t=a2()%200,od=dc(sc[t]),nd=(od+1+(int)(a2()%3))%4;\n        sc[t]=\"UDLR\"[nd];double e=evalF(sc,t),dlt=e-scE;\n        if(dlt>0||u2(a2)<exp(dlt/T)){scE=e;buildP(sc,t);if(e>gbE){gbE=e;gb=sc;}}\n        else sc[t]=\"UDLR\"[od];\n        st++;T=1.0*exp(-7.0*(double)st/200);\n    }}\n    setP(gb);\n    while(el()<1.87){string p2=gb;int st=rng()%3;\n    if(st==0){int M=5+(int)(rng()%21);for(int i=0;i<M;i++){int t=rng()%200;p2[t]=\"UDLR\"[(dc(p2[t])+1+(int)(rng()%3))%4];}}\n    else if(st==1){int ts=(int)(rng()%200),sl=10+(int)(rng()%41);for(int i=ts;i<min(200,ts+sl);i++)p2[i]=\"UDLR\"[rng()%4];}\n    else{int ts=(int)(rng()%200),sl=10+(int)(rng()%41),po=rng()%K;for(int i=ts;i<min(200,ts+sl);i++)p2[i]=path[(po+(i-ts))%K];}\n    setP(p2);double e=hc(p2,PE[200],1.87);if(e>gbE+1e-12){gbE=e;gb=p2;}}\n    cout<<gb<<\"\\n\";\n}","ahc010":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=30,TOTAL=N*N*4;\nconst int to_t[8][4]={{1,0,-1,-1},{3,-1,-1,0},{-1,-1,3,2},{-1,2,1,-1},{1,0,3,2},{3,2,1,0},{2,-1,0,-1},{-1,3,-1,1}};\nconst int di[4]={0,-1,0,1},dj[4]={-1,0,1,0};\nint tiles[N][N],init_t[N][N],rots[N][N],best_rots[N][N];\nlong long global_best=0;mt19937 rng(42);int nxt[TOTAL];uint8_t col[TOTAL];\ninline int apply_rot(int t,int r){if(t<=3)return(t+r)&3;if(t<=5)return 4+((t-4+r)&1);return 6+((t-6+r)&1);}\ninline void update_nxt(int i,int j){int base=(i*N+j)*4,t=tiles[i][j];for(int d=0;d<4;d++){int d2=to_t[t][d];if(d2<0){nxt[base+d]=-1;continue;}int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N){nxt[base+d]=-1;continue;}nxt[base+d]=(ni*N+nj)*4+((d2+2)&3);}}\nlong long evaluate(){memset(col,0,TOTAL);int t1=0,t2=0;for(int s=0;s<TOTAL;s++){if(col[s])continue;int c=s;while(c>=0&&!col[c]){col[c]=1;c=nxt[c];}if(c>=0&&col[c]==1){int len=0,cc=c;do{cc=nxt[cc];len++;}while(cc!=c);if(len>t1){t2=t1;t1=len;}else if(len>t2)t2=len;}c=s;while(c>=0&&col[c]==1){col[c]=2;c=nxt[c];}}return(long long)t1*t2;}\nconst auto TS=chrono::steady_clock::now();\ndouble gt(){return chrono::duration<double>(chrono::steady_clock::now()-TS).count();}\nstatic unsigned cur_gen=0;\nstatic int dv_gen[TOTAL]={};\nstatic bool dvb[TOTAL]={},sm_mask[TOTAL]={};\nstatic int dirty_arr[N*N+2]={};\nstatic int n_dirty=0;\ntypedef array<int,3> Pt;\nint dfs_loop(int si,int sj,int sd,const bool*occ){\n    cur_gen++;n_dirty=0;\n    if(occ&&occ[(si*N+sj)*4+sd])return 0;\n    int i=si,j=sj,d=sd,len=0;\n    while(len<TOTAL){\n        int s=(i*N+j)*4+d;\n        if(dv_gen[s]==cur_gen)return(i==si&&j==sj&&d==sd&&len>0)?len:0;\n        if(occ&&occ[s])return 0;dv_gen[s]=cur_gen;\n        int base=(i*N+j)*4;\n        bool dc=false;for(int p=0;p<4&&!dc;p++)if(p!=d&&(dv_gen[base+p]==cur_gen||(occ&&occ[base+p])))dc=true;\n        if(dc){int d2=to_t[tiles[i][j]][d];if(d2<0)return 0;int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)return 0;int nd=(d2+2)&3;if(occ&&occ[(ni*N+nj)*4+nd])return 0;len++;if(ni==si&&nj==sj&&nd==sd)return len;i=ni;j=nj;d=nd;continue;}\n        int ti=init_t[i][j],br=-1,bp=-9999;\n        for(int r=0;r<4;r++){\n            int t=apply_rot(ti,r),d2=to_t[t][d];if(d2<0)continue;\n            int ni=i+di[d2],nj=j+dj[d2];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;\n            int nd=(d2+2)&3,ns=(ni*N+nj)*4+nd;if(occ&&occ[ns])continue;\n            int nb=(ni*N+nj)*4;bool nc=false;\n            for(int pp=0;pp<4&&!nc;pp++)if(pp!=nd&&(dv_gen[nb+pp]==cur_gen||(occ&&occ[nb+pp])))nc=true;\n            if(nc&&to_t[tiles[ni][nj]][nd]<0)continue;\n            int p=(dv_gen[ns]!=cur_gen)?100:0;\n            if(ni==si&&nj==sj&&nd==sd&&len>4)p=50;\n            int nti=init_t[ni][nj];if(nti==4||nti==5)p+=5;\n            if(ni>0&&ni<N-1&&nj>0&&nj<N-1)p+=3;\n            if(occ&&sm_mask[ns]&&dv_gen[ns]!=cur_gen)p+=30; // Increased from 25\n            p+=rng()%4;if(p>bp){bp=p;br=r;}\n        }\n        if(br<0)return 0;\n        dirty_arr[n_dirty++]=i*N+j;\n        rots[i][j]=br;tiles[i][j]=apply_rot(ti,br);update_nxt(i,j);\n        int d2=to_t[tiles[i][j]][d];int ni=i+di[d2],nj=j+dj[d2],nd=(d2+2)&3;\n        if(occ&&occ[(ni*N+nj)*4+nd])return 0;len++;if(ni==si&&nj==sj&&nd==sd)return len;i=ni;j=nj;d=nd;\n    }return 0;\n}\nint build_loop(int n,const bool*occ,const vector<Pt>*sm=nullptr,double end_t=1e18){\n    int sr[N][N];memcpy(sr,rots,sizeof(rots));int bl=0,bs[N][N];memcpy(bs,sr,sizeof(sr));n_dirty=0;\n    for(int a=0;a<n;a++){\n        if(a>0&&a%100==0&&gt()>=end_t)break;\n        for(int k=0;k<n_dirty;k++){int idx=dirty_arr[k],ii=idx/N,jj=idx%N;rots[ii][jj]=sr[ii][jj];tiles[ii][jj]=apply_rot(init_t[ii][jj],sr[ii][jj]);update_nxt(ii,jj);}\n        int si,sj,sd;\n        if(sm&&!sm->empty()&&(int)(rng()%10)<7){const auto&p=(*sm)[rng()%sm->size()];si=p[0];sj=p[1];sd=p[2];}\n        else{si=rng()%N;sj=rng()%N;sd=rng()%4;}\n        int l=dfs_loop(si,sj,sd,occ);\n        if(l>bl){bl=l;memcpy(bs,rots,sizeof(rots));for(int s=0;s<TOTAL;s++)dvb[s]=(dv_gen[s]==cur_gen);}\n    }\n    for(int k=0;k<n_dirty;k++){int idx=dirty_arr[k],ii=idx/N,jj=idx%N;rots[ii][jj]=sr[ii][jj];tiles[ii][jj]=apply_rot(init_t[ii][jj],sr[ii][jj]);update_nxt(ii,jj);}\n    n_dirty=0;memcpy(rots,bs,sizeof(rots));\n    for(int ii=0;ii<N;ii++)for(int jj=0;jj<N;jj++){tiles[ii][jj]=apply_rot(init_t[ii][jj],rots[ii][jj]);update_nxt(ii,jj);}return bl;\n}\nvoid conn_greedy(){for(int p=0;p<20;p++){bool c=false;for(int i=0;i<N;i++)for(int j=0;j<N;j++){int ti=init_t[i][j];if(ti==4||ti==5)continue;int br=rots[i][j],bc=-1;for(int r=0;r<4;r++){int t=apply_rot(ti,r),cnt=0;for(int d=0;d<4;d++){if(to_t[t][d]<0)continue;int ni=i+di[d],nj=j+dj[d];if((unsigned)ni>=(unsigned)N||(unsigned)nj>=(unsigned)N)continue;if(to_t[tiles[ni][nj]][(d+2)%4]>=0)cnt++;}if(cnt>bc){bc=cnt;br=r;}}if(br!=rots[i][j]){rots[i][j]=br;tiles[i][j]=apply_rot(ti,br);update_nxt(i,j);c=true;}}if(!c)break;}}\nvoid run_sa(double Tf,double et){long long cur=evaluate();if(cur>global_best){global_best=cur;memcpy(best_rots,rots,sizeof(rots));}double si=max(10.0,(double)cur),e=gt(),s0=e;int cnt=0;while(e<et){if((cnt&255)==0)e=gt();cnt++;double prog=min(1.0,(e-s0)/max(et-s0,1e-9));double T=max(0.1,si*Tf*exp(-3.0*prog));int i=rng()%N,j=rng()%N,ti=init_t[i][j];int dr=(ti<=3)?(rng()%3)+1:1,nr=(rots[i][j]+dr)&3,ot=tiles[i][j];tiles[i][j]=apply_rot(ti,nr);update_nxt(i,j);long long ns=evaluate(),delta=ns-cur;if(delta>=0||rng()/4294967296.0<exp((double)delta/T)){rots[i][j]=nr;cur=ns;if(ns>global_best){global_best=ns;memcpy(best_rots,rots,sizeof(rots));}}else{tiles[i][j]=ot;update_nxt(i,j);}}}\nvoid run_greedy(long long&cur,double et){for(bool imp=true;imp&&gt()<et;){imp=false;for(int i=0;i<N&&gt()<et;i++)for(int j=0;j<N;j++){int ti=init_t[i][j],bd=0;long long bl=cur;int st=tiles[i][j];int mdr=(ti<=3)?3:1;for(int dr=1;dr<=mdr;dr++){int nr=(rots[i][j]+dr)&3;tiles[i][j]=apply_rot(ti,nr);update_nxt(i,j);long long ns=evaluate();if(ns>bl){bl=ns;bd=dr;}tiles[i][j]=st;update_nxt(i,j);}if(bd){rots[i][j]=(rots[i][j]+bd)&3;tiles[i][j]=apply_rot(ti,rots[i][j]);update_nxt(i,j);cur=bl;if(bl>global_best){global_best=bl;memcpy(best_rots,rots,sizeof(rots));}imp=true;}}}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){init_t[i][j]=s[j]-'0';tiles[i][j]=init_t[i][j];rots[i][j]=0;}}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);\n    memset(best_rots,0,sizeof(best_rots));\n    const double TL=1.85;const int NR=10;double tpr=TL/NR;\n    for(int restart=0;restart<NR&&gt()<TL-0.02;restart++){\n        double rs=gt();\n        if(restart==0){for(int i=0;i<N;i++)for(int j=0;j<N;j++){rots[i][j]=0;tiles[i][j]=init_t[i][j];}for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);conn_greedy();}\n        else if(restart<7){\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++){int ti=init_t[i][j],r=(ti<=3)?rng()%4:(rng()%2)?1:0;rots[i][j]=r;tiles[i][j]=apply_rot(ti,r);}\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++)update_nxt(i,j);conn_greedy();\n            long long pre=evaluate();int pr[N][N];memcpy(pr,rots,sizeof(rots));\n            memset(sm_mask,0,TOTAL);\n            int L1=build_loop(9999,nullptr,nullptr,gt()+0.020); // Increased to 20ms\n            if(L1>0){\n                bool occ1[TOTAL];memcpy(occ1,dvb,TOTAL);\n                vector<Pt> smart;memset(sm_mask,0,TOTAL);\n                for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(init_t[i][j]!=4&&init_t[i][j]!=5)continue;int base=(i*N+j)*4;bool in_l1=false;for(int dd=0;dd<4;dd++)if(occ1[base+dd]){in_l1=true;break;}if(!in_l1)continue;for(int dd=0;dd<4;dd++)if(!occ1[base+dd]){smart.push_back({i,j,dd});sm_mask[base+dd]=true;}}\n                build_loop(9999,occ1,smart.empty()?nullptr:&smart,gt()+0.020); // Increased to 20ms\n            }\n            if(evaluate()<=0&&pre>0){memcpy(rots,pr,sizeof(rots));for(int i=0;i<N;i++)for(int j=0;j<N;j++){tiles[i][j]=apply_rot(init_t[i][j],rots[i][j]);update_nxt(i,j);}}\n        }else{\n            memcpy(rots,best_rots,sizeof(rots));for(int i=0;i<N;i++)for(int j=0;j<N;j++){tiles[i][j]=apply_rot(init_t[i][j],rots[i][j]);update_nxt(i,j);}\n            for(int k=0;k<100;k++){int pi=rng()%N,pj=rng()%N,ti=init_t[pi][pj];int dr=(ti<=3)?(rng()%3)+1:1;rots[pi][pj]=(rots[pi][pj]+dr)&3;tiles[pi][pj]=apply_rot(ti,rots[pi][pj]);update_nxt(pi,pj);}\n        }\n        long long cur=evaluate();run_greedy(cur,min(TL-0.02,rs+0.02));\n        run_sa(0.1,min(TL-0.01,rs+tpr));\n    }\n    string out(N*N,'0');for(int i=0;i<N;i++)for(int j=0;j<N;j++)out[i*N+j]='0'+best_rots[i][j];\n    cout<<out<<\"\\n\";return 0;\n}","ahc011":"#include <bits/stdc++.h>\nusing namespace std;\nint N,T,board[10][10],board_label[10][10],er,ec,tgt[10][10],avail[16];\nbool fixed_cells[10][10];string out;int total_edges;\nint uf_p[101],uf_rk[101];\nstruct UFCh{int ch,op,rt,ork;};vector<UFCh>uf_ch;\nvoid uf_init(){for(int i=0;i<=N*N;i++){uf_p[i]=i;uf_rk[i]=0;}}\nint uf_find(int x){while(uf_p[x]!=x)x=uf_p[x];return x;}\nbool uf_union(int a,int b){int ra=uf_find(a),rb=uf_find(b);if(ra==rb)return false;if(uf_rk[ra]<uf_rk[rb])swap(ra,rb);uf_ch.push_back({rb,uf_p[rb],ra,uf_rk[ra]});uf_p[rb]=ra;if(uf_rk[ra]==uf_rk[rb])uf_rk[ra]++;return true;}\nvoid uf_rollback(int sv){while((int)uf_ch.size()>sv){UFCh c=uf_ch.back();uf_ch.pop_back();uf_p[c.ch]=c.op;uf_rk[c.rt]=c.ork;}}\nint sb_p[100],sb_sz[100];bool sb_cy[100];\nint sb_find(int x){while(sb_p[x]!=x){sb_p[x]=sb_p[sb_p[x]];x=sb_p[x];}return x;}\nint scoreBoard2(int b[10][10]){int NN=N*N;for(int i=0;i<NN;i++){sb_p[i]=i;sb_sz[i]=1;sb_cy[i]=false;}auto add=[&](int a,int b2){int ra=sb_find(a),rb=sb_find(b2);if(ra==rb){sb_cy[ra]=true;return;}if(sb_sz[ra]<sb_sz[rb])swap(ra,rb);sb_p[rb]=ra;sb_sz[ra]+=sb_sz[rb];if(sb_cy[rb])sb_cy[ra]=true;};for(int i=0;i<N;i++)for(int j=0;j<N-1;j++)if(b[i][j]>0&&b[i][j+1]>0&&(b[i][j]&4)&&(b[i][j+1]&1))add(i*N+j,i*N+j+1);for(int i=0;i<N-1;i++)for(int j=0;j<N;j++)if(b[i][j]>0&&b[i+1][j]>0&&(b[i][j]&8)&&(b[i+1][j]&2))add(i*N+j,(i+1)*N+j);int best=0;for(int i=0;i<NN;i++)if(b[i/N][i%N]>0&&sb_find(i)==i&&!sb_cy[i])best=max(best,sb_sz[i]);return best;}\nint scoreBoard(){return scoreBoard2(board);}\nvoid read_input(){cin>>N>>T;for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N;j++){char c=s[j];board[i][j]=(c>='0'&&c<='9')?c-'0':c-'a'+10;if(!board[i][j]){er=i;ec=j;}}}}\nbool valid_pos(int v,int i,int j){return!((v&1)&&!j)&&!((v&2)&&!i)&&!((v&4)&&j==N-1)&&!((v&8)&&i==N-1);}\nint g_ops,g_ops_limit;int g_vo[15];\nbool find_target(int pos){\n    if(++g_ops>g_ops_limit)return false;\n    if(pos==N*N)return total_edges==N*N-2;\n    int i=pos/N,j=pos%N;if(i==N-1&&j==N-1){tgt[i][j]=0;return find_target(pos+1);}\n    bool fl=(j>0),nl=fl&&(tgt[i][j-1]&4),fu=(i>0),nu=fu&&(tgt[i-1][j]&8);\n    int new_ed=(fl?nl:0)+(fu?nu:0);if(total_edges+new_ed>N*N-2){tgt[i][j]=-1;return false;}\n    for(int vi=0;vi<15;vi++){int v=g_vo[vi];\n        if(!avail[v]||!valid_pos(v,i,j))continue;if(fl&&!!(v&1)!=nl)continue;if(fu&&!!(v&2)!=nu)continue;\n        if(j<N-1){int nj=j+1;bool n2=(v&4)!=0,ok=false;if(i==N-1&&nj==N-1)ok=!n2;else{bool fcu=(i>0),nu2=fcu&&(tgt[i-1][nj]&8);for(int ui=0;ui<15&&!ok;ui++){int u=g_vo[ui];int cnt=avail[u]-(u==v?1:0);if(cnt<=0||!valid_pos(u,i,nj)||!!(u&1)!=n2||(fcu&&!!(u&2)!=nu2))continue;ok=true;}}if(!ok)continue;}\n        if(i<N-1){int ni=i+1;bool n2=(v&8)!=0,ok=false;if(ni==N-1&&j==N-1)ok=!n2;else{for(int ui=0;ui<15&&!ok;ui++){int u=g_vo[ui];int cnt=avail[u]-(u==v?1:0);if(cnt<=0||!valid_pos(u,ni,j)||!!(u&2)!=n2)continue;ok=true;}}if(!ok)continue;}\n        int sv=(int)uf_ch.size(),node=i*N+j;bool cyc=false;\n        if(fl&&nl&&!uf_union(node,i*N+j-1))cyc=true;if(!cyc&&fu&&nu&&!uf_union(node,(i-1)*N+j))cyc=true;\n        if(cyc){uf_rollback(sv);continue;}\n        avail[v]--;tgt[i][j]=v;total_edges+=new_ed;if(find_target(pos+1))return true;\n        total_edges-=new_ed;tgt[i][j]=-1;avail[v]++;uf_rollback(sv);}\n    tgt[i][j]=-1;return false;}\nbool find_target_multi(){\n    mt19937 rng(42);\n    // 10 attempts \u00d7 500K ops = 5M total (more diverse orderings within same budget)\n    for(int attempt=0;attempt<10;attempt++){\n        for(int i=0;i<15;i++)g_vo[i]=i+1;\n        if(attempt==0)sort(g_vo,g_vo+15,[](int a,int b){return avail[a]<avail[b];});// MCV\n        else if(attempt==1){}// default\n        else if(attempt==2)reverse(g_vo,g_vo+15);// reverse\n        else shuffle(g_vo,g_vo+15,rng);// random\n        g_ops=0;g_ops_limit=500000;\n        memset(tgt,-1,sizeof(tgt));total_edges=0;uf_init();uf_ch.clear();\n        if(find_target(0))return true;\n    }return false;}\nvoid init_labels(){for(int v=1;v<=15;v++){vector<pair<int,int>>cp,tp;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(board[i][j]==v)cp.push_back({i,j});if(tgt[i][j]==v)tp.push_back({i,j});}vector<bool>used(tp.size(),false);for(auto[cr,cc]:cp){int best=-1,bd=INT_MAX;for(int k=0;k<(int)tp.size();k++){if(used[k])continue;int d=abs(cr-tp[k].first)+abs(cc-tp[k].second);if(d<bd){bd=d;best=k;}}if(best>=0){board_label[cr][cc]=tp[best].first*N+tp[best].second;used[best]=true;}}}}\nbool check_solvable(){vector<int>s;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]>=0)s.push_back(board_label[i][j]);int inv=0;for(int a=0;a<(int)s.size();a++)for(int b=a+1;b<(int)s.size();b++)if(s[a]>s[b])inv++;if(N%2)return!(inv%2);return(inv+er)%2==1;}\nvoid fix_parity(){if(check_solvable())return;for(int v=1;v<=15;v++){vector<pair<int,int>>cp;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]==v)cp.push_back({i,j});if((int)cp.size()>=2){swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);if(check_solvable())return;swap(board_label[cp[0].first][cp[0].second],board_label[cp[1].first][cp[1].second]);}}}\nvoid do_move(char m){int tr=er,tc=ec;if(m=='U')tr--;else if(m=='D')tr++;else if(m=='L')tc--;else tc++;board[er][ec]=board[tr][tc];board_label[er][ec]=board_label[tr][tc];board[tr][tc]=0;board_label[tr][tc]=-1;er=tr;ec=tc;out+=m;}\nstatic int me_prv[100],me_q[100];\nbool move_empty(int gr,int gc){if(er==gr&&ec==gc)return true;if((int)out.size()>=T)return false;if(fixed_cells[gr][gc])return false;int NN=N*N,s=er*N+ec,g=gr*N+gc;fill(me_prv,me_prv+NN,-2);me_prv[s]=-1;int qh=0,qt=0;me_q[qt++]=s;const int dr[]={-1,1,0,0},dc[]={0,0,-1,1};while(qh<qt){int cur=me_q[qh++];if(cur==g)break;int r=cur/N,c=cur%N;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int nxt=nr*N+nc;if(me_prv[nxt]!=-2)continue;me_prv[nxt]=cur;me_q[qt++]=nxt;}}if(me_prv[g]==-2)return false;static int path[101];int plen=0,cur=g;while(cur!=s){path[plen++]=cur;cur=me_prv[cur];}for(int k=plen-1;k>=0;k--){if((int)out.size()>=T)return false;int nxt=path[k],nr=nxt/N,nc=nxt%N;char m;if(nr==er-1)m='U';else if(nr==er+1)m='D';else if(nc==ec-1)m='L';else m='R';do_move(m);}return true;}\nstatic int bt_prv[10000],bt_q[10001];static char bt_mv[10000],bt_path[10000];\nbool bfs_tile(int&tr,int&tc,int dr,int dc){if(tr==dr&&tc==dc)return true;if((int)out.size()>=T)return false;int NN=N*N,t0=tr*N+tc,e0=er*N+ec,tg=dr*N+dc,tot=NN*NN;memset(bt_prv,-1,tot*sizeof(int));int start=t0*NN+e0;bt_prv[start]=start;int qh=0,qt=0;bt_q[qt++]=start;const int ddr[]={-1,1,0,0},ddc[]={0,0,-1,1};const char dch[]={'U','D','L','R'};int goal=-1;while(qh<qt){int cur=bt_q[qh++];int ct=cur/NN,ce=cur%NN;if(ct==tg){goal=cur;break;}int er_=ce/N,ec_=ce%N;for(int d=0;d<4;d++){int nr=er_+ddr[d],nc=ec_+ddc[d];if(nr<0||nr>=N||nc<0||nc>=N||fixed_cells[nr][nc])continue;int np=nr*N+nc,nt=(np==ct)?ce:ct,ne=np;if(nt==ne)continue;int nst=nt*NN+ne;if(nst<0||nst>=tot||bt_prv[nst]!=-1)continue;bt_prv[nst]=cur;bt_mv[nst]=dch[d];bt_q[qt++]=nst;}}if(goal<0){for(int e=0;e<NN&&goal<0;e++){if(e==tg||fixed_cells[e/N][e%N])continue;int s=tg*NN+e;if(s<tot&&bt_prv[s]!=-1)goal=s;}}if(goal<0)return false;int plen=0,cur=goal;while(cur!=start){bt_path[plen++]=bt_mv[cur];cur=bt_prv[cur];}for(int k=plen-1;k>=0;k--){if((int)out.size()>=T)return false;do_move(bt_path[k]);}tr=dr;tc=dc;return true;}\npair<int,int>find_lbl(int lbl){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board_label[i][j]==lbl)return{i,j};return{-1,-1};}\nvoid solve_row(int row){if((int)out.size()>=T)return;for(int col=0;col<=N-3&&(int)out.size()<T;col++){auto[cr,cc]=find_lbl(row*N+col);if(cr<0)continue;if(cr==row&&cc==col){fixed_cells[row][col]=true;continue;}bfs_tile(cr,cc,row,col);fixed_cells[row][col]=true;}if((int)out.size()>=T)return;auto[ar,ac]=find_lbl(row*N+(N-2));auto[br,bc]=find_lbl(row*N+(N-1));if(ar<0||br<0)return;if(ar==row&&ac==N-2&&br==row&&bc==N-1){fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;return;}bfs_tile(ar,ac,row,N-1);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl(row*N+(N-1));if(br2<0)return;fixed_cells[row][N-1]=true;bfs_tile(br2,bc2,row+1,N-1);fixed_cells[row][N-1]=false;if((int)out.size()>=T)return;fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=true;move_empty(row,N-2);fixed_cells[row][N-1]=fixed_cells[row+1][N-1]=false;if((int)out.size()<T&&er==row&&ec==N-2){do_move('R');if((int)out.size()<T)do_move('D');}fixed_cells[row][N-2]=fixed_cells[row][N-1]=true;}\nvoid solve_col(int col){if((int)out.size()>=T)return;auto[ar,ac]=find_lbl((N-2)*N+col);auto[br,bc]=find_lbl((N-1)*N+col);if(ar<0||br<0)return;if(ar==N-2&&ac==col&&br==N-1&&bc==col){fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;return;}bfs_tile(ar,ac,N-1,col);if((int)out.size()>=T)return;auto[br2,bc2]=find_lbl((N-1)*N+col);if(br2<0)return;fixed_cells[N-1][col]=true;bfs_tile(br2,bc2,N-1,col+1);fixed_cells[N-1][col]=false;if((int)out.size()>=T)return;fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=true;move_empty(N-2,col);fixed_cells[N-1][col]=fixed_cells[N-1][col+1]=false;if((int)out.size()<T&&er==N-2&&ec==col){do_move('D');if((int)out.size()<T)do_move('R');}fixed_cells[N-2][col]=fixed_cells[N-1][col]=true;}\nvoid solve_2x2(){if((int)out.size()>=T)return;int p0=(N-2)*N+(N-2),p1=(N-2)*N+(N-1),p2=(N-1)*N+(N-2);int a=board_label[N-2][N-2],b=board_label[N-2][N-1],c=board_label[N-1][N-2],d=board_label[N-1][N-1];if(a==p0&&b==p1&&c==p2&&d==-1)return;auto el=[&](int l)->int{if(l==p0)return 0;if(l==p1)return 1;if(l==p2)return 2;return 3;};auto enc=[](int v0,int v1,int v2,int v3){return v0*64+v1*16+v2*4+v3;};int gs=enc(0,1,2,3),ss=enc(el(a),el(b),el(c),el(d));if(ss==gs)return;static int par[256];static char mfr[256];fill(par,par+256,-2);par[ss]=-1;static int bq[256];int bqh=0,bqt=0;bq[bqt++]=ss;const int adj[4][2]={{1,2},{0,3},{0,3},{1,2}};const char amv[4][2]={{'R','D'},{'L','D'},{'U','R'},{'U','L'}};while(bqh<bqt){int cur=bq[bqh++];if(cur==gs)break;int v[4]={(cur>>6)&3,(cur>>4)&3,(cur>>2)&3,cur&3};int ep=-1;for(int p=0;p<4;p++)if(v[p]==3){ep=p;break;}if(ep<0)continue;for(int k=0;k<2;k++){int np=adj[ep][k];char m=amv[ep][k];int nv[4]={v[0],v[1],v[2],v[3]};nv[ep]=nv[np];nv[np]=3;int nst=enc(nv[0],nv[1],nv[2],nv[3]);if(par[nst]==-2){par[nst]=cur;mfr[nst]=m;bq[bqt++]=nst;}}}if(par[gs]==-2)return;static char path[20];int plen=0;int cur=gs;while(cur!=ss){path[plen++]=mfr[cur];cur=par[cur];}for(int k=plen-1;k>=0;k--){if((int)out.size()>=T)break;do_move(path[k]);}}\nvoid solve(){for(int row=0;row<=N-3&&(int)out.size()<T;row++)solve_row(row);for(int col=0;col<=N-3&&(int)out.size()<T;col++)solve_col(col);solve_2x2();}\nvoid greedySolve(){\n    if((int)out.size()>=T)return;\n    int init_b[10][10],init_l[10][10];int init_er=er,init_ec=ec;string init_out=out;\n    memcpy(init_b,board,sizeof(board));memcpy(init_l,board_label,sizeof(board_label));\n    int gbsc=scoreBoard();\n    int gb[10][10],gl[10][10];int ger2=er,gec2=ec;string gpath=out;\n    memcpy(gb,board,sizeof(board));memcpy(gl,board_label,sizeof(board_label));\n    const int dr[4]={-1,1,0,0},dc[4]={0,0,-1,1};const char mvs[4]={'U','D','L','R'};\n    for(int run=0;run<15&&gbsc<N*N-1;run++){\n        memcpy(board,init_b,sizeof(board));memcpy(board_label,init_l,sizeof(board_label));\n        er=init_er;ec=init_ec;out=init_out;\n        mt19937 rng(run*97+42);\n        int lbsc=scoreBoard();\n        int lb[10][10],ll[10][10];int ler=er,lec=ec;string lpath=out;\n        memcpy(lb,board,sizeof(board));memcpy(ll,board_label,sizeof(board_label));\n        int no_imp=0;\n        while((int)out.size()<T){\n            int bsc2=scoreBoard();int best_d=-1;\n            for(int d=0;d<4;d++){int nr=er+dr[d],nc=ec+dc[d];if(nr<0||nr>=N||nc<0||nc>=N)continue;\n                int sb[10][10];memcpy(sb,board,sizeof(board));int se=er,sf=ec;\n                int tr2=er,tc2=ec;if(mvs[d]=='U')tr2--;else if(mvs[d]=='D')tr2++;else if(mvs[d]=='L')tc2--;else tc2++;\n                board[er][ec]=board[tr2][tc2];board[tr2][tc2]=0;er=tr2;ec=tc2;\n                int sc=scoreBoard();memcpy(board,sb,sizeof(board));er=se;ec=sf;\n                if(sc>bsc2){bsc2=sc;best_d=d;}}\n            if(best_d>=0){\n                do_move(mvs[best_d]);int sc=scoreBoard();\n                if(sc>lbsc){lbsc=sc;memcpy(lb,board,sizeof(board));memcpy(ll,board_label,sizeof(board_label));ler=er;lec=ec;lpath=out;}\n                no_imp=0;if(lbsc==N*N-1)break;\n            }else{\n                int np2=min(5+no_imp,20);\n                for(int i=0;i<np2&&(int)out.size()<T;i++){int perm[4]={0,1,2,3};shuffle(perm,perm+4,rng);for(int d2:perm){int nr=er+dr[d2],nc=ec+dc[d2];if(nr>=0&&nr<N&&nc>=0&&nc<N){do_move(mvs[d2]);break;}}}\n                no_imp++;if(no_imp>100){memcpy(board,lb,sizeof(board));memcpy(board_label,ll,sizeof(board_label));er=ler;ec=lec;out=lpath;no_imp=0;}\n            }}\n        if(lbsc>gbsc){gbsc=lbsc;memcpy(gb,lb,sizeof(board));memcpy(gl,ll,sizeof(board_label));ger2=ler;gec2=lec;gpath=lpath;if(gbsc==N*N-1)break;}}\n    memcpy(board,gb,sizeof(board));memcpy(board_label,gl,sizeof(board_label));er=ger2;ec=gec2;out=gpath;}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);read_input();\n    memset(avail,0,sizeof(avail));for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(board[i][j]>0)avail[board[i][j]]++;\n    memset(tgt,-1,sizeof(tgt));memset(fixed_cells,0,sizeof(fixed_cells));memset(board_label,-1,sizeof(board_label));\n    total_edges=0;\n    bool found=find_target_multi();\n    if(found){init_labels();fix_parity();solve();}\n    if(scoreBoard()<N*N-1&&(int)out.size()<T)greedySolve();\n    cout<<out<<\"\\n\";return 0;}","ahc012":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef unsigned long long ull;\ntypedef pair<ull,ull> puu;\nstruct PH{size_t operator()(const puu&p)const{size_t h=hash<ull>()(p.first);h^=hash<ull>()(p.second)+0x9e3779b9ULL+(h<<6)+(h>>2);return h;}};\nmt19937 rng(42);\nint N,K,a[11],stx[5501],sty[5501];\nstruct Line{ll px,py,qx,qy;};\nconst int MK=100;\nLine cur_lines[MK],best_lines[MK];\nint8_t sgn_data[5501][MK];\null slo[5501],shi[5501];\nunordered_map<puu,int,PH>grps;\nint b_arr[12],cscore,best_score;\nstruct Change{int idx;puu old_sig,new_sig;int8_t new_sgn;};\nvector<Change>pending;\nvector<pair<puu,int>>dvec;\nbool is_dummy[MK];\nll ecross(const Line&l,ll x,ll y){return(l.qx-l.px)*(y-l.py)-(l.qy-l.py)*(x-l.px);}\nvoid upd(int oc,int nc){if(oc>=1&&oc<=10){cscore-=min(a[oc],b_arr[oc]);b_arr[oc]--;cscore+=min(a[oc],b_arr[oc]);}if(nc>=1&&nc<=10){cscore-=min(a[nc],b_arr[nc]);b_arr[nc]++;cscore+=min(a[nc],b_arr[nc]);}}\nvoid build(){grps.clear();grps.reserve(32768);grps.max_load_factor(0.3f);memset(b_arr,0,sizeof(b_arr));cscore=0;for(int i=0;i<N;i++){slo[i]=shi[i]=0;for(int j=0;j<MK;j++){int8_t s=(ecross(cur_lines[j],stx[i],sty[i])>=0)?1:-1;sgn_data[i][j]=s;if(s==1){if(j<64)slo[i]|=(1ULL<<j);else shi[i]|=(1ULL<<(j-64));}}auto[it,ins]=grps.emplace(puu{slo[i],shi[i]},0);upd(it->second,it->second+1);it->second++;}}\nint try_ch(int j,const Line&nl){pending.clear();dvec.clear();for(int i=0;i<N;i++){int8_t ns=(ecross(nl,stx[i],sty[i])>=0)?1:-1;if(ns==sgn_data[i][j])continue;puu os{slo[i],shi[i]};ull nl2=slo[i],nh2=shi[i];if(j<64){if(ns==1)nl2|=(1ULL<<j);else nl2&=~(1ULL<<j);}else{if(ns==1)nh2|=(1ULL<<(j-64));else nh2&=~(1ULL<<(j-64));}puu nsig{nl2,nh2};pending.push_back({i,os,nsig,ns});dvec.push_back({os,-1});dvec.push_back({nsig,+1});}sort(dvec.begin(),dvec.end());int nb[12];memcpy(nb,b_arr,sizeof(nb));int nsc=cscore;for(int i=0;i<(int)dvec.size();){int j2=i,d=0;while(j2<(int)dvec.size()&&dvec[j2].first==dvec[i].first){d+=dvec[j2].second;j2++;}if(d){auto it=grps.find(dvec[i].first);int c=it!=grps.end()?it->second:0,nc=c+d;if(c>=1&&c<=10){nsc-=min(a[c],nb[c]);nb[c]--;nsc+=min(a[c],nb[c]);}if(nc>=1&&nc<=10){nsc-=min(a[nc],nb[nc]);nb[nc]++;nsc+=min(a[nc],nb[nc]);}}i=j2;}return nsc;}\nvoid do_ch(int j,const Line&nl){for(auto&ch:pending){{auto it=grps.find(ch.old_sig);upd(it->second,it->second-1);if(!--it->second)grps.erase(it);}slo[ch.idx]=ch.new_sig.first;shi[ch.idx]=ch.new_sig.second;sgn_data[ch.idx][j]=ch.new_sgn;{auto[it2,ins]=grps.emplace(ch.new_sig,0);upd(it2->second,it2->second+1);it2->second++;}}cur_lines[j]=nl;}\nLine rline(){double th=(rng()%314159)*(M_PI/314159.0);double r=(int)(rng()%18001)-9000;double cx=r*cos(th),cy=r*sin(th),sdx=-sin(th)*9000,sdy=cos(th)*9000;return{llround(cx+sdx),llround(cy+sdy),llround(cx-sdx),llround(cy-sdy)};}\nLine pline(const Line&l,int s){ll dx=(ll)(rng()%(2*s+1))-s,dy=(ll)(rng()%(2*s+1))-s;int t=rng()%3;if(t==0)return{l.px+dx,l.py+dy,l.qx,l.qy};if(t==1)return{l.px,l.py,l.qx+dx,l.qy+dy};return{l.px+dx,l.py+dy,l.qx-dx,l.qy-dy};}\nLine pline_perp(const Line&l,int s){ll ddx=l.qx-l.px,ddy=l.qy-l.py;double len=hypot((double)ddx,(double)ddy);if(len<1.0)return l;ll delta=(ll)(rng()%(2*s+1))-s;ll dx2=llround(delta*(-ddy)/len),dy2=llround(delta*ddx/len);return{l.px+dx2,l.py+dy2,l.qx+dx2,l.qy+dy2};}\nLine pline_rot(const Line&l,int mr){double mx=(l.px+l.qx)*0.5,my=(l.py+l.qy)*0.5;double hdx=(l.qx-l.px)*0.5,hdy=(l.qy-l.py)*0.5;double angle=((int)(rng()%(2*mr+1))-mr)*0.001;double ca=cos(angle),sa=sin(angle);ll ndx=llround(hdx*ca-hdy*sa),ndy=llround(hdx*sa+hdy*ca);return{llround(mx)-ndx,llround(my)-ndy,llround(mx)+ndx,llround(my)+ndy};}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>K;for(int d=1;d<=10;d++)cin>>a[d];for(int i=0;i<N;i++)cin>>stx[i]>>sty[i];\n    for(int i=0;i<25;i++){ll y=llround(-9000.0+18000.0*i/24.0);cur_lines[i]={-10000,y,10000,y};is_dummy[i]=false;}\n    for(int i=0;i<25;i++){ll x=llround(-9000.0+18000.0*i/24.0);cur_lines[25+i]={x,-10000,x,10000};is_dummy[25+i]=false;}\n    for(int i=50;i<MK;i++){cur_lines[i]={-10000,15000,10001,15000};is_dummy[i]=true;}\n    build();best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));\n    pending.reserve(N+10);dvec.reserve(2*N+10);\n    auto t0=chrono::steady_clock::now();\n    double T=15.0;int iter=0;\n    while(true){\n        if(!(++iter&511)){\n            double e=chrono::duration<double>(chrono::steady_clock::now()-t0).count();\n            if(e>2.90)break;\n            T=max(0.05,15.0*pow(0.05/15.0,e/2.90));\n        }\n        int j=rng()%MK;Line nl;\n        if(is_dummy[j]){nl=rline();}\n        else{\n            int sel=rng()%100;\n            if(sel<22)nl=pline(cur_lines[j],30);\n            else if(sel<30)nl=pline_perp(cur_lines[j],20);\n            else if(sel<40)nl=pline_perp(cur_lines[j],50);\n            else if(sel<48)nl=pline_perp(cur_lines[j],200);\n            else if(sel<60)nl=pline_rot(cur_lines[j],10);\n            else if(sel<72)nl=pline(cur_lines[j],300);\n            else if(sel<86)nl=pline(cur_lines[j],2000);\n            else nl=rline();\n        }\n        if(nl.px==nl.qx&&nl.py==nl.qy)continue;\n        int ns=try_ch(j,nl);int ds=ns-cscore;bool acc=(ds>=0);\n        if(!acc&&T>0.01)acc=((double)(rng()>>8)/(double)(1u<<24))<exp((double)ds/T);\n        if(acc){do_ch(j,nl);if(is_dummy[j])is_dummy[j]=false;if(cscore>best_score){best_score=cscore;memcpy(best_lines,cur_lines,sizeof(cur_lines));}}\n    }\n    cout<<MK<<\"\\n\";\n    for(int j=0;j<MK;j++)cout<<best_lines[j].px<<\" \"<<best_lines[j].py<<\" \"<<best_lines[j].qx<<\" \"<<best_lines[j].qy<<\"\\n\";\n    return 0;\n}","ahc014":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=65;\nint N,M,cc;\nbool dots[MAXN][MAXN],h_seg[MAXN][MAXN],v_seg[MAXN][MAXN],d1_seg[MAXN][MAXN],d2_seg[MAXN][MAXN],inPQ[MAXN][MAXN];\nvector<int> row_dots[MAXN],col_dots[MAXN],diag_dots[130],ad_dots[130];\nstruct Op{int x1,y1,x2,y2,x3,y3,x4,y4;};\nvector<Op> ops,best_ops;\npriority_queue<pair<int,pair<int,int>>> work_pq;\nlong long best_score=0;\nint init_M; pair<int,int> init_list[400];\nmt19937 rng(0); int run_mode=0;\nvoid ins(vector<int>&v,int x){v.insert(lower_bound(v.begin(),v.end(),x),x);}\nvoid addDot(int x,int y){dots[x][y]=true;ins(row_dots[y],x);ins(col_dots[x],y);ins(diag_dots[x-y+64],x);ins(ad_dots[x+y],x);}\nbool ec(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)if(v_seg[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)if(h_seg[x][y1])return false;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)if(d1_seg[xm+t][ym+t])return false;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)if(d2_seg[xm+t][ymx-t])return false;}}\n    return true;}\nbool en(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2)+1;y<max(y1,y2);y++)if(dots[x1][y])return false;}\n    else if(y1==y2){for(int x=min(x1,x2)+1;x<max(x1,x2);x++)if(dots[x][y1])return false;}\n    else{int n=abs(x2-x1),dx=(x2>x1)?1:-1,dy=(y2>y1)?1:-1;for(int t=1;t<n;t++)if(dots[x1+t*dx][y1+t*dy])return false;}\n    return true;}\nvoid de(int x1,int y1,int x2,int y2){\n    if(x1==x2){for(int y=min(y1,y2);y<max(y1,y2);y++)v_seg[x1][y]=true;}\n    else if(y1==y2){for(int x=min(x1,x2);x<max(x1,x2);x++)h_seg[x][y1]=true;}\n    else{int n=abs(x2-x1);if((x2>x1)==(y2>y1)){int xm=min(x1,x2),ym=min(y1,y2);for(int t=0;t<n;t++)d1_seg[xm+t][ym+t]=true;}else{int xm=min(x1,x2),ymx=max(y1,y2);for(int t=0;t<n;t++)d2_seg[xm+t][ymx-t]=true;}}}\nbool cando(int nx,int ny,int x2,int y2,int x3,int y3,int x4,int y4){\n    if(x2<0||x2>=N||y2<0||y2>=N||x3<0||x3>=N||y3<0||y3>=N||x4<0||x4>=N||y4<0||y4>=N)return false;\n    if(!dots[x2][y2]||!dots[x3][y3]||!dots[x4][y4])return false;\n    if(!en(nx,ny,x2,y2)||!en(x2,y2,x3,y3)||!en(x3,y3,x4,y4)||!en(x4,y4,nx,ny))return false;\n    if(!ec(nx,ny,x2,y2)||!ec(x2,y2,x3,y3)||!ec(x3,y3,x4,y4)||!ec(x4,y4,nx,ny))return false;\n    ops.push_back({nx,ny,x2,y2,x3,y3,x4,y4});addDot(nx,ny);de(nx,ny,x2,y2);de(x2,y2,x3,y3);de(x3,y3,x4,y4);de(x4,y4,nx,ny);return true;}\nbool fap(int nx,int ny){\n    if(dots[nx][ny])return false;\n    vector<tuple<int,int,int,int,int,int,int>> cands;\n    for(int x2:row_dots[ny]){if(x2==nx)continue;for(int y2:col_dots[nx]){if(y2==ny||!dots[x2][y2])continue;cands.emplace_back((abs(x2-nx)+abs(y2-ny))*2,x2,ny,x2,y2,nx,y2);}}\n    for(int xa:diag_dots[nx-ny+64]){if(xa==nx)continue;int a=xa-nx;for(int xb:ad_dots[nx+ny]){if(xb==nx)continue;int b=xb-nx;int x3=nx+a+b,y3=ny+a-b;if(x3>=0&&x3<N&&y3>=0&&y3<N&&dots[x3][y3])cands.emplace_back((abs(a)+abs(b))*2+1,xa,ny+a,x3,y3,xb,ny-b);}}\n    if(run_mode==0||run_mode==2) sort(cands.begin(),cands.end());\n    else if(run_mode==1) sort(cands.rbegin(),cands.rend());\n    else if(run_mode<=5||run_mode==8){for(auto&c:cands)get<0>(c)+=rng()%8;sort(cands.begin(),cands.end());}\n    else shuffle(cands.begin(),cands.end(),rng);\n    for(auto&[p,x2,y2,x3,y3,x4,y4]:cands)if(cando(nx,ny,x2,y2,x3,y3,x4,y4))return true;\n    return false;}\nvoid addWork(int x,int y){if(x<0||x>=N||y<0||y>=N||dots[x][y]||inPQ[x][y])return;inPQ[x][y]=true;work_pq.push({(x-cc)*(x-cc)+(y-cc)*(y-cc)+1,{x,y}});}\nvoid afterPlace(int x,int y){\n    for(int i=0;i<N;i++){addWork(i,y);addWork(x,i);}\n    for(int t=1;t<N;t++){addWork(x+t,y+t);addWork(x-t,y-t);addWork(x+t,y-t);addWork(x-t,y+t);}\n    for(int ny2:col_dots[x])for(int nx2:row_dots[y])addWork(nx2,ny2);\n    if(run_mode>=4||run_mode==2)for(int xb:ad_dots[x+y])for(int xa:diag_dots[x-y+64])addWork(xa+xb-x,y+xa-xb);}\nvoid resetRun(){\n    memset(dots,0,sizeof(dots));memset(h_seg,0,sizeof(h_seg));memset(v_seg,0,sizeof(v_seg));\n    memset(d1_seg,0,sizeof(d1_seg));memset(d2_seg,0,sizeof(d2_seg));memset(inPQ,0,sizeof(inPQ));\n    for(int i=0;i<MAXN;i++){row_dots[i].clear();col_dots[i].clear();}\n    for(int i=0;i<130;i++){diag_dots[i].clear();ad_dots[i].clear();}\n    ops.clear();work_pq=priority_queue<pair<int,pair<int,int>>>();\n    for(int i=0;i<init_M;i++)addDot(init_list[i].first,init_list[i].second);\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)addWork(x,y);}\nvoid drainQ(long long lim,chrono::steady_clock::time_point t0){\n    while(!work_pq.empty()){\n        if(chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count()>=lim)return;\n        auto[w,pos]=work_pq.top();work_pq.pop();auto[x,y]=pos;inPQ[x][y]=false;\n        if(dots[x][y])continue;if(fap(x,y))afterPlace(x,y);}}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>M;cc=(N-1)/2;init_M=M;\n    for(int i=0;i<M;i++){cin>>init_list[i].first>>init_list[i].second;}\n    vector<pair<int,pair<int,int>>> pts;\n    for(int x=0;x<N;x++)for(int y=0;y<N;y++)pts.emplace_back((x-cc)*(x-cc)+(y-cc)*(y-cc)+1,make_pair(x,y));\n    sort(pts.rbegin(),pts.rend());\n    auto t0=chrono::steady_clock::now();\n    auto el=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    for(int run=0;el()<4380;run++){\n        run_mode=run;\n        if(run>=2){\n            long long s=(run==4)?2LL*31337+12345:\n                        (run==5)?3LL*31337+12345:\n                        (run==8)?0LL:\n                        (long long)run*31337+12345;\n            rng.seed(s);\n        }\n        resetRun();\n        // Adaptive timing: deterministic modes get full 550ms; shuffle modes 500ms; noise modes 430ms\n        long long tpr;\n        if(run_mode<=2) tpr=550LL;           // modes 0,1,2: deterministic, need full time\n        else if(run_mode==6||run_mode==7) tpr=500LL;  // shuffle modes: slightly more time\n        else tpr=430LL;                        // noise modes 3,4,5,8: 430ms (proven in sub10)\n        // Total: 3*550+2*500+4*430 = 1650+1000+1720 = 4370ms < 4380ms\n        long long re=min(4380LL,el()+tpr);\n        drainQ(re,t0);\n        bool changed=true;\n        while(changed&&el()<re){\n            changed=false;\n            for(auto&[w,pos]:pts){\n                if(el()>=re)break;\n                auto[x,y]=pos;if(dots[x][y])continue;\n                if(fap(x,y)){changed=true;afterPlace(x,y);drainQ(re,t0);}\n            }\n        }\n        long long sc=0;\n        for(int x=0;x<N;x++)for(int y=0;y<N;y++)if(dots[x][y])sc+=(long long)(x-cc)*(x-cc)+(y-cc)*(y-cc)+1;\n        if(sc>best_score){best_score=sc;best_ops=ops;}\n    }\n    cout<<best_ops.size()<<\"\\n\";\n    for(auto&op:best_ops)cout<<op.x1<<' '<<op.y1<<' '<<op.x2<<' '<<op.y2<<' '<<op.x3<<' '<<op.y3<<' '<<op.x4<<' '<<op.y4<<'\\n';\n    return 0;\n}","ahc015":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef array<array<int,10>,10> Grid;\nGrid applyTilt(Grid g, char dir) {\n    if(dir=='L'){for(int i=0;i<10;i++){int p=0;for(int j=0;j<10;j++)if(g[i][j])g[i][p++]=g[i][j];for(;p<10;p++)g[i][p]=0;}}\n    else if(dir=='R'){for(int i=0;i<10;i++){int p=9;for(int j=9;j>=0;j--)if(g[i][j])g[i][p--]=g[i][j];for(;p>=0;p--)g[i][p]=0;}}\n    else if(dir=='F'){for(int j=0;j<10;j++){int p=0;for(int i=0;i<10;i++)if(g[i][j])g[p++][j]=g[i][j];for(;p<10;p++)g[p][j]=0;}}\n    else{for(int j=0;j<10;j++){int p=9;for(int i=9;i>=0;i--)if(g[i][j])g[p--][j]=g[i][j];for(;p>=0;p--)g[p][j]=0;}}\n    return g;\n}\nlong long evalLeaf(const Grid& g, int nf=0){\n    int rc[10][4]={},cc[10][4]={};\n    bool vis[10][10]={};long long sum=0;int stk[100][2];\n    const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};\n    for(int si=0;si<10;si++)for(int sj=0;sj<10;sj++){\n        if(!g[si][sj])continue;\n        rc[si][g[si][sj]]++;cc[sj][g[si][sj]]++;\n        if(vis[si][sj])continue;\n        int f=g[si][sj],sz=0,top=0;\n        stk[top][0]=si;stk[top][1]=sj;top++;vis[si][sj]=true;\n        while(top>0){--top;int x=stk[top][0],y=stk[top][1];sz++;\n            for(int d=0;d<4;d++){int nx=x+dx[d],ny=y+dy[d];\n                if(nx>=0&&nx<10&&ny>=0&&ny<10&&!vis[nx][ny]&&g[nx][ny]==f){vis[nx][ny]=true;stk[top][0]=nx;stk[top][1]=ny;top++;}}}\n        sum+=(long long)sz*sz;}\n    for(int i=0;i<10;i++)for(int f=1;f<=3;f++)\n        sum+=(long long)(rc[i][f]*rc[i][f]+cc[i][f]*cc[i][f]);\n    if(nf>=1&&nf<=3)\n        for(int i=0;i<10;i++) sum+=(long long)(rc[i][nf]*rc[i][nf]+cc[i][nf]*cc[i][nf]);\n    return sum;\n}\nGrid placeCandy(Grid g,int p,int flav){\n    int cnt=0;for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(!g[i][j]&&++cnt==p){g[i][j]=flav;return g;}return g;\n}\nconst char DIRS[]={'F','B','L','R'};\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int fl[100];for(int t=0;t<100;t++)cin>>fl[t];\n    Grid grid={};\n    mt19937 rng(20230101);\n    const int S=8;\n    for(int t=0;t<100;t++){\n        int p;cin>>p;grid=placeCandy(grid,p,fl[t]);\n        char bestDir='F';\n        if(t<99){\n            int nc1=99-t,nc2=98-t;\n            int s3[S],s_cnt=0;\n            if(t+2<100){s_cnt=min(S,nc2);\n                if(nc2<=S){for(int s=0;s<nc2;s++)s3[s]=s+1;}\n                else{for(int s=0;s<S;s++)s3[s]=rng()%nc2+1;}}\n            // Use majority flavor in window [t+3,t+5] \u2014 safer than single fl[t+3]\n            int nf3=(t+3<100)?fl[t+3]:0;\n            if(t+3<100){\n                int upc[4]={};\n                for(int k=t+3;k<min(t+6,100);k++) upc[fl[k]]++;\n                for(int f=1;f<=3;f++) if(upc[f]>upc[nf3]) nf3=f;\n            }\n            long long best=-1;\n            for(char d1:DIRS){\n                Grid g1=applyTilt(grid,d1);long long total=0;\n                for(int p2=1;p2<=nc1;p2++){\n                    Grid g2=placeCandy(g1,p2,fl[t+1]);long long mx=0;\n                    for(char d2:DIRS){\n                        Grid g2t=applyTilt(g2,d2);long long val;\n                        if(s_cnt==0){val=evalLeaf(g2t,t+2<100?fl[t+2]:0);}\n                        else{long long sum3=0;\n                            for(int s=0;s<s_cnt;s++){\n                                Grid g3=placeCandy(g2t,s3[s],fl[t+2]);long long best3=0;\n                                for(char d3:DIRS){Grid g3t=applyTilt(g3,d3);best3=max(best3,evalLeaf(g3t,nf3));}\n                                sum3+=best3;}\n                            val=sum3;}\n                        mx=max(mx,val);}\n                    total+=mx;}\n                if(total>best){best=total;bestDir=d1;}}\n        }\n        cout<<bestDir<<'\\n';cout.flush();\n        grid=applyTilt(grid,bestDir);\n    }\n    return 0;\n}","ahc016":"#include <bits/stdc++.h>\n#include <Eigen/Dense>\nusing namespace std;using namespace Eigen;\nint M,N;double eps;\ndouble normalCDF(double x){return 0.5*erfc(-x*M_SQRT1_2);}\nvector<double> getDeg(const string&s,int n){vector<int>d(n,0);int idx=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1'){d[i]++;d[j]++;}sort(d.begin(),d.end());return{d.begin(),d.end()};}\nvector<double> getEig(const string&s,int n){MatrixXd A(n,n);A.setZero();int idx=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1')A(i,j)=A(j,i)=1.0;SelfAdjointEigenSolver<MatrixXd>sol(A,EigenvaluesOnly);vector<double>ev(n);for(int i=0;i<n;i++)ev[i]=sol.eigenvalues()(i);return ev;}\nstring makeG(int n,int m){int me=n*(n-1)/2;m=max(0,min(m,me));string s(me,'0');auto pos=[&](int a,int b)->int{if(a>b)swap(a,b);return a*(2*n-a-1)/2+(b-a-1);};int cnt=0;for(int d=1;d<n&&cnt<m;d++)for(int i=0;i<n&&cnt<m;i++){int j=(i+d)%n;if(i<j){s[pos(i,j)]='1';cnt++;}}return s;}\nvector<pair<vector<int>,string>> enumDistinctSeqs(int n,int maxSeqs){\n    int me=n*(n-1)/2;\n    long long cap=(me<=21)?(1LL<<me):3000000LL;\n    map<vector<int>,string>seen;\n    for(long long mask=0;mask<cap&&(int)seen.size()<maxSeqs;mask++){\n        string s(me,'0');for(int i=0;i<me;i++)if(mask&(1LL<<i))s[i]='1';\n        vector<int>d(n,0);int idx=0;\n        for(int i=0;i<n;i++)for(int j=i+1;j<n;j++,idx++)if(s[idx]=='1'){d[i]++;d[j]++;}\n        sort(d.begin(),d.end());\n        if(!seen.count(d))seen[d]=s;\n    }\n    vector<pair<vector<int>,string>>r;for(auto&p:seen)r.push_back(p);return r;\n}\ntuple<double,double,vector<string>> greedyPackSeqs(const vector<pair<vector<int>,string>>&seqs,int M,int n){\n    int S=seqs.size();if(S<M)return{-1,-1,{}};\n    vector<bool>sel(S,false);vector<double>minD(S,1e18);vector<int>selIdx;double achMin=1e18;\n    sel[0]=true;selIdx.push_back(0);\n    for(int j=1;j<S;j++){double d=0;for(int k=0;k<n;k++){double dd=seqs[0].first[k]-seqs[j].first[k];d+=dd*dd;}minD[j]=sqrt(d);}\n    for(int step=1;step<M;step++){\n        int best=-1;double bestD=-1;\n        for(int j=0;j<S;j++){if(sel[j])continue;if(minD[j]>bestD){bestD=minD[j];best=j;}}\n        if(best<0||bestD<=0)break;\n        achMin=min(achMin,bestD);sel[best]=true;selIdx.push_back(best);\n        for(int j=0;j<S;j++){if(sel[j])continue;double d=0;for(int k=0;k<n;k++){double dd=seqs[best].first[k]-seqs[j].first[k];d+=dd*dd;}minD[j]=min(minD[j],sqrt(d));}\n    }\n    if((int)selIdx.size()<M)return{-1,-1,{}};\n    int cc=0;\n    for(int i=0;i<M;i++)for(int j=i+1;j<M;j++){double d=0;for(int k=0;k<n;k++){double dd=seqs[selIdx[i]].first[k]-seqs[selIdx[j]].first[k];d+=dd*dd;}if(sqrt(d)<=achMin*1.001)cc++;}\n    double avgK=max(2.0,2.0*cc/M);\n    vector<string>g;for(int idx:selIdx)g.push_back(seqs[idx].second);\n    return{achMin,avgK,g};\n}\ndouble predictCustomScore(int n,int M,double eps,double minL2,double avgK){\n    if(eps<1e-9)return 1e9/n;\n    double s1D=sqrt(eps*(1-eps)*(n-1));if(s1D<1e-12)return 1e9/n;\n    double snr=(1-2*eps)*minL2/s1D;\n    double p1=1.0-normalCDF(snr/2.0);\n    double pe=min((double)(M-1)/M,1.0-pow(max(0.0,1.0-p1),avgK));\n    return(1e9/n)*pow(0.9,100.0*pe);\n}\npair<int,double> computeOptNScore(int M,double eps){\n    int Nm=4;while((long long)Nm*(Nm-1)/2<M&&Nm<100)Nm++;\n    if(eps<1e-9||M<=1)return{Nm,1e9/Nm};\n    double bs=0;int on=Nm;\n    for(int n=Nm;n<=100;n++){\n        int me=n*(n-1)/2;vector<vector<double>>c(M);\n        for(int k=0;k<M;k++){int m=(int)round((double)k*me/max(1,M-1));c[k]=getDeg(makeG(n,m),n);}\n        double ml=1e18;\n        for(int k=1;k<M;k++){double l=0;for(int i=0;i<n;i++){double d=(c[k][i]-c[k-1][i])*(1-2*eps);l+=d*d;}ml=min(ml,sqrt(l));}\n        double ln=sqrt((double)n*(n-1)*eps*(1-eps));if(ln<1e-12)ln=1e-12;\n        double se=(ml/ln)*sqrt((double)n);\n        double pe=min((double)(M-1)/M,2.0*(1.0-normalCDF(se/2.0)));\n        double sc=(1e9/n)*pow(0.9,100.0*pe);\n        if(sc>bs){bs=sc;on=n;}\n    }\n    return{on,bs};\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>M>>eps;\n    double bcs=0;int bcN=-1;vector<string>bcG;\n    for(int n=4;n<=7;n++){\n        auto seqs=enumDistinctSeqs(n,M+200);\n        if((int)seqs.size()<M)continue;\n        auto[ml,ak,g]=greedyPackSeqs(seqs,M,n);\n        if(ml<=0||(int)g.size()<M)continue;\n        double sc=predictCustomScore(n,M,eps,ml,ak);\n        if(sc>bcs){bcs=sc;bcN=n;bcG=g;}\n    }\n    auto[Nb,sb]=computeOptNScore(M,eps);\n    bool uc=(bcN>0&&bcs>sb);\n    N=uc?bcN:Nb;\n    vector<string>G(M);\n    if(uc){G=bcG;}\n    else{int ME=N*(N-1)/2;for(int k=0;k<M;k++){int m=(int)round((double)k*ME/max(1,M-1));G[k]=makeG(N,m);}}\n    cout<<N<<\"\\n\";for(auto&g:G)cout<<g<<\"\\n\";cout<<flush;\n    long long budget=2000000000LL;\n    long long opSE=(long long)N*N+(long long)N*N*N;\n    int NSE=max(1,(int)(budget/max(1LL,(long long)M*opSE)));\n    bool uE=(NSE>=20);int NS,FD;\n    if(uE){NS=min(500,NSE);FD=2*N;}\n    else{long long opSD=(long long)N*N;NS=max(30,min(1000,(int)(budget/max(1LL,(long long)M*opSD))));FD=N;}\n    vector<vector<double>>C(M,vector<double>(FD,0.0));\n    if(eps<1e-9){for(int k=0;k<M;k++){auto ds=getDeg(G[k],N);for(int i=0;i<N;i++)C[k][i]=ds[i];if(uE){auto es=getEig(G[k],N);for(int i=0;i<N;i++)C[k][N+i]=es[i];}}}\n    else{mt19937 rng(42);uniform_real_distribution<double>u(0.0,1.0);\n        for(int k=0;k<M;k++){for(int s=0;s<NS;s++){string t=G[k];for(char&c:t)if(u(rng)<eps)c^=1;auto ds=getDeg(t,N);for(int i=0;i<N;i++)C[k][i]+=ds[i];if(uE){auto es=getEig(t,N);for(int i=0;i<N;i++)C[k][N+i]+=es[i];}}for(int i=0;i<FD;i++)C[k][i]/=NS;}}\n    for(int q=0;q<100;q++){\n        string h;cin>>h;vector<double>hf(FD);auto dh=getDeg(h,N);for(int i=0;i<N;i++)hf[i]=dh[i];\n        if(uE){auto eh=getEig(h,N);for(int i=0;i<N;i++)hf[N+i]=eh[i];}\n        int best=0;double bD=1e18;\n        for(int k=0;k<M;k++){double d=0;for(int i=0;i<FD;i++){double dd=hf[i]-C[k][i];d+=dd*dd;}if(d<bD){bD=d;best=k;}}\n        cout<<best<<\"\\n\"<<flush;\n    }\n    return 0;\n}","ahc017":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;typedef pair<ll,int> pli;\nconst ll INF=1e18;const int MXN=1005,MXM=3005,MXD=35,MAXCP=10;\nint N,M,D,K,EU[MXM],EV[MXM];ll EW[MXM];\nvector<pair<int,int>> G[MXN];ll gd[MXN][MXN];\ndouble imp[MXM];int aday[MXM];double ADJ[MXM][MXD];int cutD[MXM][MXD];\nvector<int> ladj[MXM],cpairs[MXM],dayE[MXD];int dpos[MXM];ll dtmp2[MXN];\nuint64_t rs=0xdeadbeef123ULL;\nuint64_t rng(){rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;}\nint ri(int n){return(int)(rng()%(unsigned)n);}double rd(){return(rng()>>11)*(1.0/(1ull<<53));}\nvoid dijk(int s){fill(gd[s]+1,gd[s]+N+1,INF);gd[s][s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[d,u]=pq.top();pq.pop();if(d>gd[s][u])continue;for(auto&[v,e]:G[u]){ll nd=d+EW[e];if(nd<gd[s][v]){gd[s][v]=nd;pq.push({nd,v});}}}}\nll dijkS(int s,int t,int sk){static ll d[MXN];fill(d+1,d+N+1,INF);d[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>d[u])continue;if(u==t)return d[t];for(auto&[v,e]:G[u]){if(e==sk)continue;ll nd=dd+EW[e];if(nd<d[v]){d[v]=nd;pq.push({nd,v});}}}return d[t];}\ndouble diagFk(int d,const vector<int>&srcs){double tot=0.0;for(int s:srcs){fill(dtmp2+1,dtmp2+N+1,INF);dtmp2[s]=0;priority_queue<pli,vector<pli>,greater<pli>>pq;pq.push({0,s});while(!pq.empty()){auto[dd,u]=pq.top();pq.pop();if(dd>dtmp2[u])continue;for(auto&[v,ei]:G[u]){if(aday[ei]==d)continue;ll nd=dd+EW[ei];if(nd<dtmp2[v]){dtmp2[v]=nd;pq.push({nd,v});}}}for(int t=1;t<=N;t++)if(t!=s&&dtmp2[t]>gd[s][t])tot+=(double)(dtmp2[t]-gd[s][t]);}return tot/((double)srcs.size()*(N-1));}\nstruct BrFr{int u,pe,ix;};struct BrI{int e,sz;};int bdt[MXN],blv[MXN];vector<BrFr> bstk;\nvoid findBr(int sk,vector<BrI>&br){fill(bdt+1,bdt+N+1,-1);int tm=0;bstk.clear();if((int)bstk.capacity()<N+2)bstk.reserve(N+2);bdt[1]=blv[1]=tm++;bstk.push_back({1,-1,0});while(!bstk.empty()){BrFr&c=bstk.back();if(c.ix<(int)G[c.u].size()){auto[v,e]=G[c.u][c.ix++];if(e==sk||e==c.pe){}else if(bdt[v]<0){bdt[v]=blv[v]=tm++;bstk.push_back({v,e,0});}else blv[c.u]=min(blv[c.u],bdt[v]);}else{int u=c.u,pe=c.pe,sz=tm-bdt[u];bstk.pop_back();if(!bstk.empty()){BrFr&p=bstk.back();blv[p.u]=min(blv[p.u],blv[u]);if(blv[u]>bdt[p.u])br.push_back({pe,sz});}}}}\nbool cvis[MXN];int cq[MXN];\nint main(){\n    ios_base::sync_with_stdio(0);cin.tie(0);\n    auto tst=chrono::steady_clock::now();\n    cin>>N>>M>>D>>K;\n    for(int i=0;i<M;i++){cin>>EU[i]>>EV[i]>>EW[i];G[EU[i]].push_back({EV[i],i});G[EV[i]].push_back({EU[i],i});}\n    for(int i=1;i<=N;i++){int x,y;cin>>x>>y;}\n    for(int s=1;s<=N;s++)dijk(s);\n    {vector<int>par(N+1,-1),sv(N);vector<ll>sz(N+1,1);iota(sv.begin(),sv.end(),1);for(int s=1;s<=N;s++){fill(par.begin(),par.end(),-1);fill(sz.begin(),sz.end(),1LL);sort(sv.begin(),sv.end(),[s](int a,int b){return gd[s][a]<gd[s][b];});for(int v:sv){if(v==s)continue;for(auto&[u,e]:G[v])if(gd[s][u]+EW[e]==gd[s][v]){par[v]=e;break;}}for(int i=(int)sv.size()-1;i>=0;i--){int v=sv[i];if(par[v]<0)continue;int p=(EU[par[v]]==v)?EV[par[v]]:EU[par[v]];sz[p]+=sz[v];}for(int v:sv){if(par[v]<0)continue;imp[par[v]]+=(double)sz[v];}}}\n    for(int e=0;e<M;e++){ll dt=dijkS(EU[e],EV[e],e);imp[e]*=(dt<INF)?(double)(dt-EW[e]):0.0;}\n    {vector<BrI>br;for(int e=0;e<M;e++){for(int ep:{EU[e],EV[e]}){if((int)G[ep].size()==2){for(auto&[w,oe]:G[ep])if(oe!=e)cpairs[e].push_back(oe);}}sort(cpairs[e].begin(),cpairs[e].end());cpairs[e].erase(unique(cpairs[e].begin(),cpairs[e].end()),cpairs[e].end());br.clear();findBr(e,br);sort(br.begin(),br.end(),[](const BrI&a,const BrI&b){return min(a.sz,N-a.sz)>min(b.sz,N-b.sz);});for(auto&bi:br){if((int)cpairs[e].size()>=MAXCP)break;auto it=lower_bound(cpairs[e].begin(),cpairs[e].end(),bi.e);if(it==cpairs[e].end()||*it!=bi.e)cpairs[e].insert(it,bi.e);}}}\n    for(int u=1;u<=N;u++){int dg=G[u].size();for(int i=0;i<dg;i++)for(int j=i+1;j<dg;j++){int e1=G[u][i].second,e2=G[u][j].second;ladj[e1].push_back(e2);ladj[e2].push_back(e1);}}\n    for(int e=0;e<M;e++){sort(ladj[e].begin(),ladj[e].end());ladj[e].erase(unique(ladj[e].begin(),ladj[e].end()),ladj[e].end());}\n    auto isAdj=[](int a,int b){return binary_search(ladj[a].begin(),ladj[a].end(),b);};\n    auto isCut=[](int a,int b){return binary_search(cpairs[a].begin(),cpairs[a].end(),b);};\n    fill(aday,aday+M,-1);int dc[MXD]={};\n    {vector<int>eo(M);iota(eo.begin(),eo.end(),0);sort(eo.begin(),eo.end(),[](int a,int b){return imp[a]>imp[b];});\n    for(int e:eo){int best=-1;double bs=1e18;int bc=INT_MAX;\n    for(int d=0;d<D;d++){if(dc[d]>=K)continue;int cuts=0;for(int f:cpairs[e])if(aday[f]==d)cuts++;double cf=0;for(int e2:ladj[e])if(aday[e2]==d)cf+=imp[e2];double sc=cf+1e-12*dc[d];if(cuts<bc||(cuts==bc&&sc<bs)){bc=cuts;bs=sc;best=d;}}\n    if(best<0)best=0;aday[e]=best;dc[best]++;}}\n    memset(cutD,0,sizeof(cutD));memset(ADJ,0,sizeof(ADJ));\n    for(int e=0;e<M;e++){for(int f:cpairs[e])cutD[e][aday[f]]++;for(int e2:ladj[e])ADJ[e][aday[e2]]+=imp[e2];}\n    for(int e=0;e<M;e++){dpos[e]=dayE[aday[e]].size();dayE[aday[e]].push_back(e);}\n    double T=1.0;\n    {double sm=0;int c=0;for(int tr=0;tr<100000&&c<3000;tr++){\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];\n        if(dlc>0)continue;\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];\n        sm+=fabs(dl);c++;}\n    if(c>0)T=sm/c;if(T<1e-9)T=1.0;}\n    double T0=T;\n    // Phase 1: Proxy SA (0.5s)\n    for(long long step=0;;step++){\n        if(step%200000==0){double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>0.5)break;T=T0*exp(-10.*el/0.5);}\n        int d1=ri(D),d2=ri(D);if(d1==d2||dayE[d1].empty()||dayE[d2].empty())continue;\n        int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n        int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];if(dlc>0)continue;\n        double dl=imp[e1]*(ADJ[e1][d2]-ADJ[e1][d1])+imp[e2]*(ADJ[e2][d1]-ADJ[e2][d2])-2.*isAdj(e1,e2)*imp[e1]*imp[e2];\n        if(dl<=0||(T>1e-9&&rd()<exp(-dl/T))){\n            for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n            for(int f:cpairs[e1]){cutD[f][d1]--;cutD[f][d2]++;}for(int f:cpairs[e2]){cutD[f][d2]--;cutD[f][d1]++;}\n            {int p=dpos[e1],L=dayE[d1].back();dayE[d1][p]=L;dpos[L]=p;dayE[d1].pop_back();}\n            {int p=dpos[e2],L=dayE[d2].back();dayE[d2][p]=L;dpos[L]=p;dayE[d2].pop_back();}\n            dpos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;dpos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n        }\n    }\n    // Phase 2: Actual frustration SA (0.5s to 5.3s = 4.8s) - same as v13 but slightly longer\n    {\n        const int S_ACT=10;\n        vector<int> srcs;\n        {set<int>used;while((int)srcs.size()<S_ACT){int s=ri(N)+1;if(!used.count(s)){used.insert(s);srcs.push_back(s);}}}\n        vector<double> sfk(D);\n        for(int d=0;d<D;d++)sfk[d]=diagFk(d,srcs);\n        while(true){\n            double el=chrono::duration<double>(chrono::steady_clock::now()-tst).count();if(el>5.3)break;\n            // d1 = worst of 4 random (same as v13)\n            int d1=ri(D);for(int k=0;k<3;k++){int d=ri(D);if(sfk[d]>sfk[d1])d1=d;}\n            if(dayE[d1].empty())continue;\n            // d2 = lightest of 4 random (RESTORED to v13 approach, NOT absolute lightest)\n            int d2=-1;for(int k=0;k<4;k++){int d=ri(D);if(d!=d1&&!dayE[d].empty()&&(d2<0||sfk[d]<sfk[d2]))d2=d;}\n            if(d2<0)continue;\n            int e1=dayE[d1][ri(dayE[d1].size())],e2=dayE[d2][ri(dayE[d2].size())];\n            int ic=isCut(e1,e2)?1:0;int dlc=(cutD[e1][d2]-ic)+(cutD[e2][d1]-ic)-cutD[e1][d1]-cutD[e2][d2];if(dlc>0)continue;\n            double old_f1=sfk[d1],old_f2=sfk[d2];\n            aday[e1]=d2;aday[e2]=d1;\n            double new_f1=diagFk(d1,srcs),new_f2=diagFk(d2,srcs);\n            aday[e1]=d1;aday[e2]=d2;\n            if(new_f1+new_f2<old_f1+old_f2){\n                for(int e:ladj[e1]){ADJ[e][d1]-=imp[e1];ADJ[e][d2]+=imp[e1];}for(int e:ladj[e2]){ADJ[e][d2]-=imp[e2];ADJ[e][d1]+=imp[e2];}\n                for(int f:cpairs[e1]){cutD[f][d1]--;cutD[f][d2]++;}for(int f:cpairs[e2]){cutD[f][d2]--;cutD[f][d1]++;}\n                {int p=dpos[e1],L=dayE[d1].back();dayE[d1][p]=L;dpos[L]=p;dayE[d1].pop_back();}\n                {int p=dpos[e2],L=dayE[d2].back();dayE[d2][p]=L;dpos[L]=p;dayE[d2].pop_back();}\n                dpos[e1]=dayE[d2].size();dayE[d2].push_back(e1);aday[e1]=d2;dpos[e2]=dayE[d1].size();dayE[d1].push_back(e2);aday[e2]=d1;\n                sfk[d1]=new_f1;sfk[d2]=new_f2;\n            }\n        }\n    }\n    // Phase 3: Post-processing (0.2s - reduced from v13's 0.3s)\n    for(int d=0;d<D;d++){int mr=(int)dayE[d].size()+5;while(mr-->0){\n        fill(cvis+1,cvis+N+1,false);int h=0,t=0;cvis[1]=true;cq[t++]=1;\n        while(h<t){int u=cq[h++];for(auto&[v,e]:G[u])if(aday[e]!=d&&!cvis[v]){cvis[v]=true;cq[t++]=v;}}\n        bool disc=false;for(int v=1;v<=N;v++)if(!cvis[v]){disc=true;break;}if(!disc)break;\n        bool fx=false;\n        for(int i=0;i<(int)dayE[d].size()&&!fx;i++){int e=dayE[d][i];if(cvis[EU[e]]==cvis[EV[e]])continue;\n            int bdd=-1;double bc=1e18;for(int dd=0;dd<D;dd++){if(dd==d||(int)dayE[dd].size()>=K)continue;double cost=0;for(int ef:ladj[e])if(aday[ef]==dd)cost+=imp[e]*imp[ef];if(bdd<0||cost<bc){bc=cost;bdd=dd;}}\n            if(bdd>=0){for(int ef:ladj[e]){ADJ[ef][d]-=imp[e];ADJ[ef][bdd]+=imp[e];}for(int f:cpairs[e]){cutD[f][d]--;cutD[f][bdd]++;}\n                {int p=dpos[e],L=dayE[d].back();dayE[d][p]=L;dpos[L]=p;dayE[d].pop_back();}dpos[e]=dayE[bdd].size();dayE[bdd].push_back(e);aday[e]=bdd;fx=true;}}\n        if(!fx)break;}}\n    for(int i=0;i<M;i++){if(i)cout<<' ';cout<<aday[i]+1;}cout<<'\\n';\n}","ahc019":"#include <bits/stdc++.h>\nusing namespace std;\nint D;string Fs[2][14],Rs[2][14];int bid,B[2][2744];bool occ[2][2744];\nstruct Box{int x,y,z,a,b,c;};\nbool bf(int r,int x0,int y0,int z0,int a,int b,int c){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++)if(occ[r][(x0+i)*D*D+(y0+j)*D+z0+k])return false;return true;}\nvoid fB(int r,int x0,int y0,int z0,int a,int b,int c,int id){for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<c;k++){int q=(x0+i)*D*D+(y0+j)*D+z0+k;B[r][q]=id;occ[r][q]=true;}}\nvoid fL(int r,int x,int y,int z,int l,int ax,int id){for(int k=0;k<l;k++){int q=(x+(ax==0?k:0))*D*D+(y+(ax==1?k:0))*D+z+(ax==2?k:0);B[r][q]=id;occ[r][q]=true;}}\ndouble simTP(vector<int>t0,vector<int>t1){double sc=0;int r0=0,r1=0,i0=0,i1=0;while(true){if(!r0&&i0<(int)t0.size())r0=t0[i0++];if(!r1&&i1<(int)t1.size())r1=t1[i1++];if(!r0||!r1)break;int ml=min(r0,r1);sc+=1.0/ml;r0-=ml;r1-=ml;}sc+=r0;while(i0<(int)t0.size())sc+=t0[i0++];sc+=r1;while(i1<(int)t1.size())sc+=t1[i1++];return sc;}\ntemplate<typename T>\nvoid runBestTP(vector<pair<int,int>>brv0,vector<pair<int,int>>brv1,const vector<T>&F0,const vector<T>&F1,auto fillFn){\n    vector<int>l0,l1;for(auto[l,i]:brv0)l0.push_back(l);for(auto[l,i]:brv1)l1.push_back(l);\n    double bsc=1e18;vector<pair<int,int>>rv0=brv0,rv1=brv1;mt19937 rng(42);\n    auto tryOrd=[&](vector<pair<int,int>>r0,vector<pair<int,int>>r1){vector<int>t0,t1;for(auto[l,i]:r0)t0.push_back(l);for(auto[l,i]:r1)t1.push_back(l);double sc=simTP(t0,t1);if(sc<bsc){bsc=sc;rv0=r0;rv1=r1;}};\n    for(int o0=0;o0<2;o0++)for(int o1=0;o1<2;o1++){auto r0=brv0,r1=brv1;sort(r0.begin(),r0.end(),[=](auto&a,auto&b){return o0?a.first<b.first:a.first>b.first;});sort(r1.begin(),r1.end(),[=](auto&a,auto&b){return o1?a.first<b.first:a.first>b.first;});tryOrd(r0,r1);}\n    for(int rep=0;rep<10;rep++){auto r0=brv0,r1=brv1;shuffle(r0.begin(),r0.end(),rng);shuffle(r1.begin(),r1.end(),rng);tryOrd(r0,r1);}\n    struct SO{int idx,off;};deque<SO>r0d,r1d;for(auto[l,i]:rv0)r0d.push_back({i,0});for(auto[l,i]:rv1)r1d.push_back({i,0});\n    while(!r0d.empty()&&!r1d.empty()){auto&[i0,o0]=r0d.front();auto&[i1,o1]=r1d.front();int ml=min(F0[i0].len-o0,F1[i1].len-o1);bid++;fillFn(0,F0[i0],bid,o0,ml);fillFn(1,F1[i1],bid,o1,ml);o0+=ml;o1+=ml;if(o0==F0[i0].len)r0d.pop_front();if(o1==F1[i1].len)r1d.pop_front();}\n    while(!r0d.empty()){auto[i0,o0]=r0d.front();r0d.pop_front();bid++;fillFn(0,F0[i0],bid,o0,F0[i0].len-o0);}\n    while(!r1d.empty()){auto[i1,o1]=r1d.front();r1d.pop_front();bid++;fillFn(1,F1[i1],bid,o1,F1[i1].len-o1);}\n}\nvector<Box>eB(int arr){vector<Box>v;uint16_t fz[14]={},rz[14]={};for(int z=0;z<D;z++)for(int x=0;x<D;x++)if(Fs[arr][z][x]=='1')fz[x]|=1u<<z;for(int z=0;z<D;z++)for(int y=0;y<D;y++)if(Rs[arr][z][y]=='1')rz[y]|=1u<<z;uint16_t am=(uint16_t)((1u<<D)-1);for(int x0=0;x0<D;x0++){uint16_t xm=am;for(int a=1;x0+a<=D;a++){xm&=fz[x0+a-1];if(!xm)break;for(int y0=0;y0<D;y0++){uint16_t ym=am;for(int b=1;y0+b<=D;b++){ym&=rz[y0+b-1];if(!ym)break;uint16_t zm=xm&ym;if(!zm)continue;for(int z=0;z<D;z++){if(!(zm&(1u<<z)))continue;int cm=0;while(z+cm<D&&(zm&(1u<<(z+cm))))cm++;for(int c=1;c<=cm;c++)v.push_back({x0,y0,z,a,b,c});}}}}};return v;}\nstruct Ln{int x,y,z,len,ax;};\nvector<Ln>gRL(int arr,int ax){vector<Ln>L;if(ax==0){for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,s=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=x;else if(!v&&s>=0){L.push_back({s,y,z,x-s,0});s=-1;}}}}else if(ax==1){for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,s=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=y;else if(!v&&s>=0){L.push_back({x,s,z,y-s,1});s=-1;}}}}else{for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,s=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1'&&!occ[arr][x*D*D+y*D+z];if(v&&s<0)s=z;else if(!v&&s>=0){L.push_back({x,y,s,z-s,2});s=-1;}}}}return L;}\ndouble mS(const vector<Ln>&L0,const vector<Ln>&L1){map<int,int>c0,c1;for(auto&l:L0)c0[l.len]++;for(auto&l:L1)c1[l.len]++;double sc=0;int v0=0,v1=0;for(auto&[l,c]:c0){int cl=c1.count(l)?c1[l]:0;sc+=min(c,cl)*1.0/l;v0+=(c-min(c,cl))*l;}for(auto&[l,c]:c1){int cl=c0.count(l)?c0[l]:0;if(c>cl)v1+=(c-cl)*l;}return sc+max(v0,v1);}\nvoid doBox(){auto bx0=eB(0),bx1=eB(1);typedef array<int,3>Key;auto gk=[](const Box&b)->Key{Key k={b.a,b.b,b.c};sort(k.begin(),k.end());return k;};map<Key,vector<int>>g0,g1;for(int i=0;i<(int)bx0.size();i++)g0[gk(bx0[i])].push_back(i);for(int i=0;i<(int)bx1.size();i++)g1[gk(bx1[i])].push_back(i);vector<pair<int,Key>>grps;for(auto&[k,v]:g0)if(g1.count(k))grps.push_back({k[0]*k[1]*k[2],k});sort(grps.rbegin(),grps.rend());for(auto&[vol,key]:grps){auto&v0=g0[key];auto&v1=g1[key];int p1=0;for(int i0:v0){auto&B0=bx0[i0];if(!bf(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c))continue;while(p1<(int)v1.size()&&!bf(1,bx1[v1[p1]].x,bx1[v1[p1]].y,bx1[v1[p1]].z,bx1[v1[p1]].a,bx1[v1[p1]].b,bx1[v1[p1]].c))p1++;if(p1>=(int)v1.size())break;auto&B1=bx1[v1[p1++]];bid++;fB(0,B0.x,B0.y,B0.z,B0.a,B0.b,B0.c,bid);fB(1,B1.x,B1.y,B1.z,B1.a,B1.b,B1.c,bid);}}\n    int bax0=1,bax1=1;double bsc=1e18;for(int a0=0;a0<3;a0++){auto Lt0=gRL(0,a0);for(int a1=0;a1<3;a1++){auto Lt1=gRL(1,a1);double sc=mS(Lt0,Lt1);if(sc<bsc){bsc=sc;bax0=a0;bax1=a1;}}}\n    auto L0=gRL(0,bax0),L1=gRL(1,bax1);map<int,vector<int>>gl0,gl1;for(int i=0;i<(int)L0.size();i++)gl0[L0[i].len].push_back(i);for(int i=0;i<(int)L1.size();i++)gl1[L1[i].len].push_back(i);vector<bool>lu0(L0.size(),false),lu1(L1.size(),false);for(auto&[l,v0]:gl0){auto it=gl1.find(l);if(it==gl1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;auto gp=[&](const Ln&s,int off)->tuple<int,int,int>{return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};};auto[x0,y0,z0]=gp(L0[v0[j]],0);fL(0,x0,y0,z0,l,L0[v0[j]].ax,bid);auto[x1,y1,z1]=gp(L1[v1[j]],0);fL(1,x1,y1,z1,l,L1[v1[j]].ax,bid);lu0[v0[j]]=lu1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)L0.size();i++)if(!lu0[i])rv0.push_back({L0[i].len,i});for(int i=0;i<(int)L1.size();i++)if(!lu1[i])rv1.push_back({L1[i].len,i});\n    auto gp=[&](const Ln&s,int off)->tuple<int,int,int>{return{s.x+(s.ax==0?off:0),s.y+(s.ax==1?off:0),s.z+(s.ax==2?off:0)};};auto fillLn=[&](int arr,const Ln&s,int id,int off,int len){auto[x,y,z]=gp(s,off);fL(arr,x,y,z,len,s.ax,id);};\n    runBestTP(rv0,rv1,L0,L1,fillLn);}\nstruct Seg{int x,y,z,len,ax;};\nvector<Seg>buildSegs(int arr,int ax){vector<Seg>c;if(ax==2)for(int x=0;x<D;x++)for(int y=0;y<D;y++){for(int z=0,zs=-1;z<=D;z++){bool v=z<D&&Fs[arr][z][x]=='1'&&Rs[arr][z][y]=='1';if(v&&zs<0)zs=z;else if(!v&&zs>=0){c.push_back({x,y,zs,z-zs,2});zs=-1;}}}else if(ax==1)for(int x=0;x<D;x++)for(int z=0;z<D;z++){if(Fs[arr][z][x]!='1')continue;for(int y=0,ys=-1;y<=D;y++){bool v=y<D&&Rs[arr][z][y]=='1';if(v&&ys<0)ys=y;else if(!v&&ys>=0){c.push_back({x,ys,z,y-ys,1});ys=-1;}}}else for(int y=0;y<D;y++)for(int z=0;z<D;z++){if(Rs[arr][z][y]!='1')continue;for(int x=0,xs=-1;x<=D;x++){bool v=x<D&&Fs[arr][z][x]=='1';if(v&&xs<0)xs=x;else if(!v&&xs>=0){c.push_back({xs,y,z,x-xs,0});xs=-1;}}}return c;}\nvector<Seg>greedyFill(vector<Seg>c){bool cx[14][14]={},cy[14][14]={};vector<Seg>sel;for(auto&s:c){bool u=false;for(int k=0;k<s.len&&!u;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);if(!cx[z][x]||!cy[z][y])u=true;}if(!u)continue;sel.push_back(s);for(int k=0;k<s.len;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);cx[z][x]=cy[z][y]=true;}}return sel;}\nvector<Seg>mF(int arr,int ax){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[](const Seg&a,const Seg&b){return a.len>b.len;});return greedyFill(c);}\nvector<Seg>mFbiased(int arr,int ax,const multiset<int>&prefer){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[&](const Seg&a,const Seg&b){int pa=prefer.count(a.len),pb=prefer.count(b.len);if(pa!=pb)return pa>pb;return a.len>b.len;});return greedyFill(c);}\nvector<Seg>mFspatial(int arr,int ax,int mode){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[mode](const Seg&a,const Seg&b){if(a.len!=b.len)return a.len>b.len;if(mode==0){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}else{if(a.y!=b.y)return a.y<b.y;return a.x<b.x;}});return greedyFill(c);}\nvector<Seg>mFbiasedSpatial(int arr,int ax,const multiset<int>&prefer,int mode){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[&](const Seg&a,const Seg&b){int pa=(int)prefer.count(a.len),pb=(int)prefer.count(b.len);if(pa!=pb)return pa>pb;if(a.len!=b.len)return a.len>b.len;if(mode==0){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}else{if(a.y!=b.y)return a.y<b.y;return a.x<b.x;}});return greedyFill(c);}\nvector<Seg>mFtarget(int arr,int ax,int tv,int dim){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[tv,dim](const Seg&a,const Seg&b){if(a.len!=b.len)return a.len>b.len;bool ap=(dim==1?a.y==tv:a.x==tv),bp=(dim==1?b.y==tv:b.x==tv);if(ap!=bp)return ap>bp;if(a.x!=b.x)return a.x<b.x;return a.y<b.y;});return greedyFill(c);}\nvector<Seg>mFzstart(int arr,int ax){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[](const Seg&a,const Seg&b){if(a.len!=b.len)return a.len>b.len;if(a.z!=b.z)return a.z<b.z;if(a.x!=b.x)return a.x<b.x;return a.y<b.y;});return greedyFill(c);}\nvector<Seg>mFtarget2(int arr,int ax,int tv1,int tv2,int dim){auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[tv1,tv2,dim](const Seg&a,const Seg&b){if(a.len!=b.len)return a.len>b.len;bool ap=(dim==1?(a.y==tv1||a.y==tv2):(a.x==tv1||a.x==tv2)),bp=(dim==1?(b.y==tv1||b.y==tv2):(b.x==tv1||b.x==tv2));if(ap!=bp)return ap>bp;if(a.x!=b.x)return a.x<b.x;return a.y<b.y;});return greedyFill(c);}\nvector<int>computeCP(int arr,int ax,const vector<Seg>&c){\n    int other=1-arr;vector<int>cp(c.size());\n    for(int i=0;i<(int)c.size();i++){const Seg&s=c[i];int cnt=0;\n        for(int k=0;k<s.len;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);if(Fs[other][z][x]=='1'&&Rs[other][z][y]=='1')cnt++;}cp[i]=cnt;}\n    return cp;}\nvector<Seg>mFcommon(int arr,int ax){\n    auto c=buildSegs(arr,ax);auto cp=computeCP(arr,ax,c);\n    vector<int>idx(c.size());iota(idx.begin(),idx.end(),0);\n    sort(idx.begin(),idx.end(),[&](int a,int b){if(cp[a]!=cp[b])return cp[a]>cp[b];return c[a].len>c[b].len;});\n    vector<Seg>sc2;for(int i:idx)sc2.push_back(c[i]);return greedyFill(sc2);}\nvector<Seg>mFcommonTarget(int arr,int ax,int tv,int dim){\n    auto c=buildSegs(arr,ax);auto cp=computeCP(arr,ax,c);\n    vector<int>idx(c.size());iota(idx.begin(),idx.end(),0);\n    sort(idx.begin(),idx.end(),[&](int a,int b){\n        if(cp[a]!=cp[b])return cp[a]>cp[b];\n        bool ap=(dim==1?c[a].y==tv:c[a].x==tv),bp=(dim==1?c[b].y==tv:c[b].x==tv);\n        if(ap!=bp)return ap>bp;\n        if(c[a].x!=c[b].x)return c[a].x<c[b].x;\n        if(c[a].y!=c[b].y)return c[a].y<c[b].y;\n        return c[a].len>c[b].len;});\n    vector<Seg>sc2;for(int i:idx)sc2.push_back(c[i]);return greedyFill(sc2);}\nvector<Seg>mFrandom(int arr,int ax,uint32_t seed){\n    auto c=buildSegs(arr,ax);sort(c.begin(),c.end(),[](const Seg&a,const Seg&b){return a.len>b.len;});\n    mt19937 rng(seed);int i=0;\n    while(i<(int)c.size()){int j=i;while(j<(int)c.size()&&c[j].len==c[i].len)j++;shuffle(c.begin()+i,c.begin()+j,rng);i=j;}\n    return greedyFill(c);}\nvector<Seg>mFrandomCommon(int arr,int ax,uint32_t seed){\n    auto c=buildSegs(arr,ax);auto cp=computeCP(arr,ax,c);\n    vector<int>idx(c.size());iota(idx.begin(),idx.end(),0);\n    sort(idx.begin(),idx.end(),[&](int a,int b){return cp[a]>cp[b];});\n    mt19937 rng(seed);int i=0;\n    while(i<(int)idx.size()){int j=i;while(j<(int)idx.size()&&cp[idx[j]]==cp[idx[i]])j++;shuffle(idx.begin()+i,idx.begin()+j,rng);i=j;}\n    vector<Seg>sc2;for(int ii:idx)sc2.push_back(c[ii]);return greedyFill(sc2);}\nvoid fS(int arr,const Seg&s,int id,int off,int len){for(int k=0;k<len;k++){int z=s.z+(s.ax==2?off+k:0),x=s.x+(s.ax==0?off+k:0),y=s.y+(s.ax==1?off+k:0);B[arr][x*D*D+y*D+z]=id;}}\nvoid doMF(const vector<Seg>&F0,const vector<Seg>&F1){map<int,vector<int>>g0,g1;for(int i=0;i<(int)F0.size();i++)g0[F0[i].len].push_back(i);for(int i=0;i<(int)F1.size();i++)g1[F1[i].len].push_back(i);vector<bool>u0(F0.size(),false),u1(F1.size(),false);for(auto&[l,v0]:g0){auto it=g1.find(l);if(it==g1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;fS(0,F0[v0[j]],bid,0,l);fS(1,F1[v1[j]],bid,0,l);u0[v0[j]]=u1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)F0.size();i++)if(!u0[i])rv0.push_back({F0[i].len,i});for(int i=0;i<(int)F1.size();i++)if(!u1[i])rv1.push_back({F1[i].len,i});\n    auto fillSeg=[&](int arr,const Seg&s,int id,int off,int len){fS(arr,s,id,off,len);};runBestTP(rv0,rv1,F0,F1,fillSeg);}\ndouble cScore(int mb){vector<int>v0(mb+1,0),v1(mb+1,0);for(int i=0;i<D*D*D;i++){if(B[0][i])v0[B[0][i]]++;if(B[1][i])v1[B[1][i]]++;}double sc=0;for(int k=1;k<=mb;k++){if(v0[k]>0&&v1[k]>0)sc+=1.0/v0[k];else if(v0[k]>0)sc+=v0[k];else sc+=v1[k];}return sc;}\ndouble doMFboxed(const vector<Seg>&F0,const vector<Seg>&F1){\n    uint16_t f0[14][14]={},f1[14][14]={};\n    auto buildF=[&](uint16_t f[14][14],const vector<Seg>&segs){for(auto&s:segs)for(int k=0;k<s.len;k++){int z=s.z+(s.ax==2?k:0),x=s.x+(s.ax==0?k:0),y=s.y+(s.ax==1?k:0);f[x][y]|=1u<<z;}};\n    buildF(f0,F0);buildF(f1,F1);\n    auto eBf=[&](uint16_t f[14][14])->vector<Box>{vector<Box>v;for(int x0=0;x0<D;x0++){uint16_t xm[14];for(int y=0;y<D;y++)xm[y]=f[x0][y];for(int a=1;x0+a<=D;a++){bool any=false;if(a==1){for(int y=0;y<D;y++)if(xm[y]){any=true;break;}}else{for(int y=0;y<D;y++){xm[y]&=f[x0+a-1][y];if(xm[y])any=true;}}if(!any)break;for(int y0=0;y0<D;y0++){uint16_t ym=~(uint16_t)0;for(int b=1;y0+b<=D;b++){ym&=xm[y0+b-1];if(!ym)break;for(int z=0;z<D;z++){if(!(ym&(1u<<z)))continue;int cm=0;while(z+cm<D&&(ym&(1u<<(z+cm))))cm++;for(int c=1;c<=cm;c++)v.push_back({x0,y0,z,a,b,c});}}}}}return v;};\n    auto bxs0=eBf(f0),bxs1=eBf(f1);\n    bool lo0[2744]={},lo1[2744]={};\n    auto bfL=[&](int r,const Box&b)->bool{bool*lo=r?lo1:lo0;for(int i=0;i<b.a;i++)for(int j=0;j<b.b;j++)for(int k=0;k<b.c;k++)if(lo[(b.x+i)*D*D+(b.y+j)*D+b.z+k])return false;return true;};\n    auto fBL=[&](int r,const Box&b,int id){bool*lo=r?lo1:lo0;for(int i=0;i<b.a;i++)for(int j=0;j<b.b;j++)for(int k=0;k<b.c;k++){int q=(b.x+i)*D*D+(b.y+j)*D+b.z+k;B[r][q]=id;lo[q]=true;}};\n    typedef array<int,3>Key;auto gk=[](const Box&b)->Key{Key k={b.a,b.b,b.c};sort(k.begin(),k.end());return k;};\n    map<Key,vector<int>>gb0,gb1;for(int i=0;i<(int)bxs0.size();i++)gb0[gk(bxs0[i])].push_back(i);for(int i=0;i<(int)bxs1.size();i++)gb1[gk(bxs1[i])].push_back(i);\n    vector<pair<int,Key>>grps;for(auto&[k,v]:gb0)if(gb1.count(k))grps.push_back({k[0]*k[1]*k[2],k});sort(grps.rbegin(),grps.rend());\n    for(auto&[vol,key]:grps){auto&v0=gb0[key];auto&v1=gb1[key];int p1=0;for(int i0:v0){if(!bfL(0,bxs0[i0]))continue;while(p1<(int)v1.size()&&!bfL(1,bxs1[v1[p1]]))p1++;if(p1>=(int)v1.size())break;bid++;fBL(0,bxs0[i0],bid);fBL(1,bxs1[v1[p1++]],bid);}}\n    auto getR=[&](bool*lo,uint16_t f[14][14])->vector<Seg>{vector<Seg>segs;for(int x=0;x<D;x++)for(int y=0;y<D;y++){if(!f[x][y])continue;for(int z=0,zs=-1;z<=D;z++){bool v=z<D&&(f[x][y]&(1u<<z))&&!lo[x*D*D+y*D+z];if(v&&zs<0)zs=z;else if(!v&&zs>=0){segs.push_back({x,y,zs,z-zs,2});zs=-1;}}}return segs;};\n    auto rem0=getR(lo0,f0),rem1=getR(lo1,f1);\n    map<int,vector<int>>gr0,gr1;for(int i=0;i<(int)rem0.size();i++)gr0[rem0[i].len].push_back(i);for(int i=0;i<(int)rem1.size();i++)gr1[rem1[i].len].push_back(i);\n    vector<bool>ur0(rem0.size(),false),ur1(rem1.size(),false);for(auto&[l,v0]:gr0){auto it=gr1.find(l);if(it==gr1.end())continue;auto&v1=it->second;int mc=min((int)v0.size(),(int)v1.size());for(int j=0;j<mc;j++){bid++;fS(0,rem0[v0[j]],bid,0,l);fS(1,rem1[v1[j]],bid,0,l);ur0[v0[j]]=ur1[v1[j]]=true;}}\n    vector<pair<int,int>>rv0,rv1;for(int i=0;i<(int)rem0.size();i++)if(!ur0[i])rv0.push_back({rem0[i].len,i});for(int i=0;i<(int)rem1.size();i++)if(!ur1[i])rv1.push_back({rem1[i].len,i});\n    auto fillSeg=[&](int arr,const Seg&s,int id,int off,int len){fS(arr,s,id,off,len);};runBestTP(rv0,rv1,rem0,rem1,fillSeg);\n    return cScore(bid);}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>D;for(int i=0;i<2;i++){for(int z=0;z<D;z++)cin>>Fs[i][z];for(int z=0;z<D;z++)cin>>Rs[i][z];}\n    struct Res{int bid;int B[2][2744];};\n    double best=1e18;Res bestR;bestR.bid=0;memset(bestR.B,0,sizeof(bestR.B));\n    auto tryIt=[&](auto fn){memset(B,0,sizeof(B));bid=0;double s=fn();if(s<best){best=s;bestR.bid=bid;memcpy(bestR.B,B,sizeof(B));}};\n    auto computeSigs=[&](int arr,int dim)->vector<int>{\n        vector<int>sig(D,0);\n        for(int tv=0;tv<D;tv++)for(int x=0;x<D;x++){\n            bool valid=false;for(int z=0;z<D&&!valid;z++)\n                valid=(dim==1?(Fs[arr][z][x]=='1'&&Rs[arr][z][tv]=='1'):(Fs[arr][z][tv]=='1'&&Rs[arr][z][x]=='1'));\n            if(valid)sig[tv]++;}return sig;};\n    for(int a0=0;a0<3;a0++)for(int a1=0;a1<3;a1++){\n        auto F0u=mF(0,a0),F1u=mF(1,a1);\n        tryIt([&,F0u,F1u]{doMF(F0u,F1u);return cScore(bid);});\n        tryIt([&,F0u,F1u]{return doMFboxed(F0u,F1u);});\n        multiset<int>L0,L1;for(auto&s:F0u)L0.insert(s.len);for(auto&s:F1u)L1.insert(s.len);\n        auto F0b=mFbiased(0,a0,L1),F1b=mFbiased(1,a1,L0);\n        tryIt([&,F0b,F1b]{doMF(F0b,F1b);return cScore(bid);});\n        tryIt([&,F0b,F1b]{return doMFboxed(F0b,F1b);});\n        multiset<int>L0b,L1b;for(auto&s:F0b)L0b.insert(s.len);for(auto&s:F1b)L1b.insert(s.len);\n        auto F0b2=mFbiased(0,a0,L1b),F1b2=mFbiased(1,a1,L0b);\n        tryIt([&,F0b2,F1b2]{doMF(F0b2,F1b2);return cScore(bid);});\n        tryIt([&,F0b2,F1b2]{return doMFboxed(F0b2,F1b2);});\n        for(int mode=0;mode<2;mode++){\n            auto F0s=mFspatial(0,a0,mode),F1s=mFspatial(1,a1,mode);\n            tryIt([&,F0s,F1s]{doMF(F0s,F1s);return cScore(bid);});\n            tryIt([&,F0s,F1s]{return doMFboxed(F0s,F1s);});\n            auto F0bs=mFbiasedSpatial(0,a0,L1,mode),F1bs=mFbiasedSpatial(1,a1,L0,mode);\n            tryIt([&,F0bs,F1bs]{return doMFboxed(F0bs,F1bs);});}\n        for(int tv=0;tv<D;tv++){\n            auto F0ty=mFtarget(0,a0,tv,1),F1ty=mFtarget(1,a1,tv,1);\n            tryIt([&,F0ty,F1ty]{return doMFboxed(F0ty,F1ty);});\n            auto F0tx=mFtarget(0,a0,tv,0),F1tx=mFtarget(1,a1,tv,0);\n            tryIt([&,F0tx,F1tx]{return doMFboxed(F0tx,F1tx);});}\n        {auto F0z=mFzstart(0,a0),F1z=mFzstart(1,a1);\n         tryIt([&,F0z,F1z]{doMF(F0z,F1z);return cScore(bid);});\n         tryIt([&,F0z,F1z]{return doMFboxed(F0z,F1z);});}\n        for(int tv=0;tv<D-1;tv++)for(int dim=0;dim<2;dim++){\n            auto F0m=mFtarget2(0,a0,tv,tv+1,dim),F1m=mFtarget2(1,a1,tv,tv+1,dim);\n            tryIt([&,F0m,F1m]{return doMFboxed(F0m,F1m);});}\n        {auto F0c=mFcommon(0,a0),F1c=mFcommon(1,a1);\n         tryIt([&,F0c,F1c]{doMF(F0c,F1c);return cScore(bid);});\n         tryIt([&,F0c,F1c]{return doMFboxed(F0c,F1c);});}\n        for(int tv=0;tv<D;tv++)for(int dim=0;dim<2;dim++){\n            auto F0ct=mFcommonTarget(0,a0,tv,dim),F1ct=mFcommonTarget(1,a1,tv,dim);\n            tryIt([&,F0ct,F1ct]{return doMFboxed(F0ct,F1ct);});}\n        // Random fills with same seed (correlated spatial groupings) - 20 trials\n        for(int rep=0;rep<20;rep++){\n            uint32_t seed=(uint32_t)(rep*31337+99991);\n            auto F0r=mFrandom(0,a0,seed),F1r=mFrandom(1,a1,seed);\n            tryIt([&,F0r,F1r]{return doMFboxed(F0r,F1r);});}\n        // Random common fills - 10 trials\n        for(int rep=0;rep<10;rep++){\n            uint32_t seed=(uint32_t)(rep*54321+11111);\n            auto F0rc=mFrandomCommon(0,a0,seed),F1rc=mFrandomCommon(1,a1,seed);\n            tryIt([&,F0rc,F1rc]{return doMFboxed(F0rc,F1rc);});}\n        // Filtered cross-target\n        if(a0==a1){\n            for(int dim=0;dim<2;dim++){\n                auto sig0=computeSigs(0,dim),sig1=computeSigs(1,dim);\n                vector<pair<int,pair<int,int>>>pairs;\n                for(int tv0=0;tv0<D;tv0++)for(int tv1=0;tv1<D;tv1++){\n                    if(tv0==tv1)continue;\n                    if(sig0[tv0]==sig1[tv1]&&sig0[tv0]>0)\n                        pairs.push_back({sig0[tv0],{tv0,tv1}});}\n                sort(pairs.rbegin(),pairs.rend());\n                int K=min((int)pairs.size(),5);\n                for(int k=0;k<K;k++){\n                    auto[sc,tv]=pairs[k];auto[tv0,tv1]=tv;\n                    auto F0c=mFtarget(0,a0,tv0,dim),F1c=mFtarget(1,a1,tv1,dim);\n                    tryIt([&,F0c,F1c]{return doMFboxed(F0c,F1c);});}}}}\n    tryIt([&]{memset(occ,0,sizeof(occ));doBox();return cScore(bid);});\n    bid=bestR.bid;memcpy(B,bestR.B,sizeof(B));\n    cout<<bid<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[0][i];}cout<<\"\\n\";\n    for(int i=0;i<D*D*D;i++){if(i)cout<<\" \";cout<<B[1][i];}cout<<\"\\n\";\n    return 0;}","ahc020":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\nint main() {\n    auto tStart = chrono::steady_clock::now();\n    auto msElapsed = [&]() { return (int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-tStart).count(); };\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,K; cin>>N>>M>>K;\n    vector<ll> X(N),Y(N); for(int i=0;i<N;i++) cin>>X[i]>>Y[i];\n    vector<int> EU(M),EV(M); vector<ll> EW(M);\n    for(int j=0;j<M;j++){cin>>EU[j]>>EV[j]>>EW[j];EU[j]--;EV[j]--;}\n    vector<ll> A(K),B(K); for(int k=0;k<K;k++) cin>>A[k]>>B[k];\n    const ll MAXP=5000,MAXP2=MAXP*MAXP,INF=(ll)4e18;\n    vector<vector<ll>> D2(N,vector<ll>(K)),D2T(K,vector<ll>(N));\n    for(int i=0;i<N;i++) for(int k=0;k<K;k++){ll dx=A[k]-X[i],dy=B[k]-Y[i];D2[i][k]=D2T[k][i]=dx*dx+dy*dy;}\n    vector<vector<pair<int,int>>> adj(N);\n    for(int j=0;j<M;j++){adj[EU[j]].push_back({EV[j],j});adj[EV[j]].push_back({EU[j],j});}\n    auto pVal=[&](ll d2)->ll{if(!d2)return 0;ll p=(ll)sqrt((double)d2);while(p*p<d2)p++;return min(p,MAXP);};\n    vector<vector<ll>> spD(N,vector<ll>(N,INF)); vector<vector<int>> spE(N,vector<int>(N,-1)),spPr(N,vector<int>(N,-1));\n    for(int s=0;s<N;s++){spD[s][s]=0;priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>>pq;pq.push({0,s});\n        while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(d>spD[s][v])continue;\n            for(auto&[u,j]:adj[v]){ll nd=d+EW[j];if(nd<spD[s][u]){spD[s][u]=nd;spPr[s][u]=v;spE[s][u]=j;pq.push({nd,u});}}}}\n    auto buildSteiner=[&](vector<bool> term)->vector<bool>{\n        term[0]=true;vector<int>T;for(int i=0;i<N;i++)if(term[i])T.push_back(i);int TN=T.size();\n        vector<bool>in(TN,false);vector<ll>key(TN,INF);vector<int>par(TN,-1);key[0]=0;\n        for(int it=0;it<TN;it++){int u=-1;for(int i=0;i<TN;i++)if(!in[i]&&(u<0||key[i]<key[u]))u=i;\n            if(u<0||key[u]>=INF)break;in[u]=true;\n            for(int w=0;w<TN;w++)if(!in[w]&&spD[T[u]][T[w]]<key[w]){key[w]=spD[T[u]][T[w]];par[w]=u;}}\n        vector<bool>eo(M,false);\n        for(int i=0;i<TN;i++){if(par[i]<0)continue;int src=T[par[i]],dst=T[i];for(int v=dst;v!=src;v=spPr[src][v])eo[spE[src][v]]=true;}\n        return eo;};\n    auto optimizeP=[&](const vector<bool>&reach,bool with2c=false)->pair<vector<int>,ll>{\n        vector<vector<int>>vR(N);vector<ll>vMx(N,0);\n        for(int k=0;k<K;k++){ll best=INF;int bv=-1;for(int i=0;i<N;i++)if(reach[i]&&D2T[k][i]<best){best=D2T[k][i];bv=i;}\n            if(bv<0||best>MAXP2)return{{},INF};vR[bv].push_back(k);vMx[bv]=max(vMx[bv],best);}\n        vector<ll>Pv(N,0);for(int i=0;i<N;i++)Pv[i]=pVal(vMx[i]);\n        auto runT5=[&](int maxIt){bool imp=true;int it=0;while(imp&&it++<maxIt){imp=false;\n            struct T5{int k[5];ll d[5];};vector<T5>tp(N);\n            for(int u=0;u<N;u++){tp[u]={{-1,-1,-1,-1,-1},{0,0,0,0,0}};\n                for(int k:vR[u]){ll d=D2T[k][u];\n                    if(d>tp[u].d[0]){tp[u].d[4]=tp[u].d[3];tp[u].k[4]=tp[u].k[3];tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=tp[u].d[1];tp[u].k[2]=tp[u].k[1];tp[u].d[1]=tp[u].d[0];tp[u].k[1]=tp[u].k[0];tp[u].d[0]=d;tp[u].k[0]=k;}\n                    else if(d>tp[u].d[1]){tp[u].d[4]=tp[u].d[3];tp[u].k[4]=tp[u].k[3];tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=tp[u].d[1];tp[u].k[2]=tp[u].k[1];tp[u].d[1]=d;tp[u].k[1]=k;}\n                    else if(d>tp[u].d[2]){tp[u].d[4]=tp[u].d[3];tp[u].k[4]=tp[u].k[3];tp[u].d[3]=tp[u].d[2];tp[u].k[3]=tp[u].k[2];tp[u].d[2]=d;tp[u].k[2]=k;}\n                    else if(d>tp[u].d[3]){tp[u].d[4]=tp[u].d[3];tp[u].k[4]=tp[u].k[3];tp[u].d[3]=d;tp[u].k[3]=k;}\n                    else if(d>tp[u].d[4]){tp[u].d[4]=d;tp[u].k[4]=k;}}}\n            ll bD=0;int bU=-1,bV=-1,bT=-1;\n            for(int u=0;u<N;u++){if(!reach[u]||tp[u].k[0]<0)continue;ll Pu2=Pv[u]*Pv[u];\n                for(int v=0;v<N;v++){if(v==u||!reach[v])continue;ll Pv2=Pv[v]*Pv[v];\n                    ll d0v=D2T[tp[u].k[0]][v];bool f0=(d0v<=MAXP2);\n                    if(f0){ll nPu=pVal(tp[u].d[1]),nPv=pVal(max(vMx[v],d0v));ll dd=nPu*nPu+nPv*nPv-Pu2-Pv2;if(dd<bD){bD=dd;bU=u;bV=v;bT=0;}}\n                    if(f0&&tp[u].k[1]>=0){ll d1v=D2T[tp[u].k[1]][v];if(d1v<=MAXP2){ll nPu=pVal(tp[u].d[2]),nPv=pVal(max({vMx[v],d0v,d1v}));ll dd=nPu*nPu+nPv*nPv-Pu2-Pv2;if(dd<bD){bD=dd;bU=u;bV=v;bT=1;}}}\n                    if(f0&&tp[u].k[2]>=0){ll d1v=D2T[tp[u].k[1]][v],d2v=D2T[tp[u].k[2]][v];if(d1v<=MAXP2&&d2v<=MAXP2){ll nPu=pVal(tp[u].d[3]),nPv=pVal(max({vMx[v],d0v,d1v,d2v}));ll dd=nPu*nPu+nPv*nPv-Pu2-Pv2;if(dd<bD){bD=dd;bU=u;bV=v;bT=2;}}}\n                    if(f0&&tp[u].k[3]>=0){ll d1v=D2T[tp[u].k[1]][v],d2v=D2T[tp[u].k[2]][v],d3v=D2T[tp[u].k[3]][v];if(d1v<=MAXP2&&d2v<=MAXP2&&d3v<=MAXP2){ll nPu=pVal(tp[u].d[4]),nPv=pVal(max({vMx[v],d0v,d1v,d2v,d3v}));ll dd=nPu*nPu+nPv*nPv-Pu2-Pv2;if(dd<bD){bD=dd;bU=u;bV=v;bT=3;}}}\n                    if(v>u&&f0&&tp[v].k[0]>=0){ll d0u=D2T[tp[v].k[0]][u];if(d0u<=MAXP2){ll nMxU=max(tp[u].d[1],d0u),nMxV=max(tp[v].d[1],d0v);ll nPu=pVal(nMxU),nPv=pVal(nMxV);ll dd=nPu*nPu+nPv*nPv-Pu2-Pv2;if(dd<bD){bD=dd;bU=u;bV=v;bT=4;}}}}}\n            if(bU<0)break;int u=bU,v=bV;\n            if(bT==4){int ku=tp[u].k[0],kv=tp[v].k[0];auto&ru=vR[u];auto&rv=vR[v];ru.erase(find(ru.begin(),ru.end(),ku));rv.erase(find(rv.begin(),rv.end(),kv));ru.push_back(kv);rv.push_back(ku);vMx[u]=max(tp[u].d[1],D2T[kv][u]);Pv[u]=pVal(vMx[u]);vMx[v]=max(tp[v].d[1],D2T[ku][v]);Pv[v]=pVal(vMx[v]);}\n            else{auto&ru=vR[u];ll newMxV=vMx[v];int nu=bT+1;for(int j=0;j<nu;j++){int kj=tp[u].k[j];ru.erase(find(ru.begin(),ru.end(),kj));vR[v].push_back(kj);newMxV=max(newMxV,D2T[kj][v]);}\n                vMx[u]=tp[u].d[nu];Pv[u]=pVal(vMx[u]);vMx[v]=newMxV;Pv[v]=pVal(vMx[v]);}\n            imp=true;}};\n        runT5(500);\n        if(with2c){\n            bool imp2c=true;int it2c=0;\n            while(imp2c&&it2c++<100&&msElapsed()<1845){imp2c=false;\n                for(int u=0;u<N;u++){if(!reach[u]||vR[u].empty())continue;\n                    for(int v=u+1;v<N;v++){if(!reach[v]||vR[v].empty())continue;\n                        struct Res{ll du,dv;int k;};vector<Res>can;ll fmU=0,fmV=0;vector<int>mustU,mustV;\n                        for(int k:vR[u]){ll dv=D2T[k][v];if(dv<=MAXP2)can.push_back({D2T[k][u],dv,k});else{fmU=max(fmU,D2T[k][u]);mustU.push_back(k);}}\n                        for(int k:vR[v]){ll du=D2T[k][u];if(du<=MAXP2)can.push_back({du,D2T[k][v],k});else{fmV=max(fmV,D2T[k][v]);mustV.push_back(k);}}\n                        if((int)can.size()<2)continue;\n                        int m=can.size();\n                        ll bestC=Pv[u]*Pv[u]+Pv[v]*Pv[v];int bestT=-1;bool sortDv=false;\n                        // Direction 1: sort by du (first t\u2192u)\n                        sort(can.begin(),can.end(),[](const Res&a,const Res&b){return a.du<b.du;});\n                        {vector<ll>sfDv(m+1,fmV);for(int i=m-1;i>=0;i--)sfDv[i]=max(sfDv[i+1],can[i].dv);\n                         ll mxU=fmU;for(int t=0;t<=m;t++){if(sfDv[t]<=MAXP2){ll pu=pVal(mxU),pv=pVal(sfDv[t]);ll c=pu*pu+pv*pv;if(c<bestC){bestC=c;bestT=t;sortDv=false;}}if(t<m)mxU=max(mxU,can[t].du);}}\n                        // Direction 2: sort by dv (first t\u2192v)\n                        sort(can.begin(),can.end(),[](const Res&a,const Res&b){return a.dv<b.dv;});\n                        {vector<ll>sfDu(m+1,fmU);for(int i=m-1;i>=0;i--)sfDu[i]=max(sfDu[i+1],can[i].du);\n                         ll mxV=fmV;for(int t=0;t<=m;t++){if(sfDu[t]<=MAXP2){ll pu=pVal(sfDu[t]),pv=pVal(mxV);ll c=pu*pu+pv*pv;if(c<bestC){bestC=c;bestT=t;sortDv=true;}}if(t<m)mxV=max(mxV,can[t].dv);}}\n                        if(bestT<0)continue;\n                        vR[u]=mustU;vMx[u]=fmU;vR[v]=mustV;vMx[v]=fmV;\n                        if(!sortDv){sort(can.begin(),can.end(),[](const Res&a,const Res&b){return a.du<b.du;});\n                            for(int i=0;i<m;i++){if(i<bestT){vR[u].push_back(can[i].k);vMx[u]=max(vMx[u],can[i].du);}else{vR[v].push_back(can[i].k);vMx[v]=max(vMx[v],can[i].dv);}}}\n                        else{for(int i=0;i<m;i++){if(i<bestT){vR[v].push_back(can[i].k);vMx[v]=max(vMx[v],can[i].dv);}else{vR[u].push_back(can[i].k);vMx[u]=max(vMx[u],can[i].du);}}}\n                        Pv[u]=pVal(vMx[u]);Pv[v]=pVal(vMx[v]);imp2c=true;}}}\n            runT5(200);}\n        ll pc=0;for(int i=0;i<N;i++)pc+=Pv[i]*Pv[i];\n        vector<int>P(N,0);for(int i=0;i<N;i++)P[i]=(int)Pv[i];return{P,pc};};\n    auto evalEO=[&](const vector<bool>&eo)->tuple<vector<int>,ll,bool>{\n        vector<bool>reach(N,false);queue<int>q;q.push(0);reach[0]=true;\n        while(!q.empty()){int v=q.front();q.pop();for(auto&[u,j]:adj[v])if(eo[j]&&!reach[u]){reach[u]=true;q.push(u);}}\n        ll ec=0;for(int j=0;j<M;j++)if(eo[j])ec+=EW[j];\n        auto[P,pc]=optimizeP(reach);if(pc==INF)return{{},INF,false};return{P,ec+pc,true};};\n    vector<int>mstPar(N,-1),mstPE(N,-1);vector<vector<int>>mstCh(N);\n    {vector<bool>vis(N,false);vector<ll>key(N,INF);key[0]=0;priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>>pq;pq.push({0,0});\n     while(!pq.empty()){auto[d,v]=pq.top();pq.pop();if(vis[v])continue;vis[v]=true;for(auto&[u,j]:adj[v])if(!vis[u]&&EW[j]<key[u]){key[u]=EW[j];mstPar[u]=v;mstPE[u]=j;pq.push({EW[j],u});}}\n     for(int v=1;v<N;v++)mstCh[mstPar[v]].push_back(v);}\n    vector<bool>act(N,true);vector<vector<int>>vRes(N);vector<ll>vmx(N,0),Pv(N,0);\n    for(int k=0;k<K;k++){ll best=INF;int bv=-1;for(int i=0;i<N;i++)if(D2T[k][i]<best){best=D2T[k][i];bv=i;}vRes[bv].push_back(k);vmx[bv]=max(vmx[bv],best);}\n    for(int i=0;i<N;i++)Pv[i]=pVal(vmx[i]);\n    ll ec0=0,pc0=0;for(int v=1;v<N;v++)ec0+=EW[mstPE[v]];for(int i=0;i<N;i++)pc0+=Pv[i]*Pv[i];\n    auto isLeaf=[&](int v){for(int c:mstCh[v])if(act[c])return false;return true;};\n    for(bool imp2=true;imp2;){imp2=false;ll bD=0;int bV=-1;vector<pair<int,int>>bAs;vector<pair<int,ll>>bAf;\n        for(int v=1;v<N;v++){if(!act[v]||!isLeaf(v))continue;ll delta=-(EW[mstPE[v]]+Pv[v]*Pv[v]);\n            map<int,ll>tmp;vector<pair<int,int>>ta;bool ok=true;\n            for(int k:vRes[v]){ll best=INF;int bu=-1;for(int u=0;u<N;u++){if(u==v||!act[u])continue;if(D2T[k][u]<best){best=D2T[k][u];bu=u;}}\n                if(bu<0||best>MAXP2){ok=false;break;}ta.push_back({k,bu});if(!tmp.count(bu))tmp[bu]=vmx[bu];tmp[bu]=max(tmp[bu],best);}\n            if(!ok)continue;for(auto&[u,nd]:tmp){ll np=pVal(nd);delta+=np*np-Pv[u]*Pv[u];}\n            if(delta<bD){bD=delta;bV=v;bAs=ta;bAf.clear();for(auto&[u,nd]:tmp)bAf.push_back({u,nd});}}\n        if(bV>=0){act[bV]=false;ec0-=EW[mstPE[bV]];pc0-=Pv[bV]*Pv[bV];Pv[bV]=0;vmx[bV]=0;vRes[bV].clear();\n            for(auto&[k,u]:bAs)vRes[u].push_back(k);\n            for(auto&[u,nd]:bAf){pc0-=Pv[u]*Pv[u];vmx[u]=nd;Pv[u]=pVal(nd);pc0+=Pv[u]*Pv[u];}imp2=true;}}\n    ll bestCost=INF;vector<bool>bestEO(M,false);vector<int>bestP(N,0);\n    auto updateBest=[&](const vector<bool>&eo,const vector<int>&P,ll cost){if(cost<bestCost){bestCost=cost;bestEO=eo;bestP=P;}};\n    {vector<bool>eo(M,false);for(int v=1;v<N;v++)if(act[v])eo[mstPE[v]]=true;auto[P,sc,sf]=evalEO(eo);if(sf)updateBest(eo,P,sc);}\n    auto runSteiner=[&](vector<bool>term,int maxIt=20){term[0]=true;\n        for(int sit=0;sit<maxIt&&msElapsed()<1200;sit++){auto eo=buildSteiner(term);auto[sp,sc,sf]=evalEO(eo);if(!sf)break;\n            updateBest(eo,sp,sc);vector<bool>nt(N,false);nt[0]=true;for(int i=0;i<N;i++)if(sp[i]>0)nt[i]=true;if(nt==term)break;term=nt;}};\n    {vector<bool>t(N,false);for(int i=0;i<N;i++)if(Pv[i]>0)t[i]=true;runSteiner(t);}\n    {vector<bool>t(N,true);runSteiner(t);}\n    auto getTerms=[&]()->vector<bool>{vector<bool>t(N,false);t[0]=true;for(int i=0;i<N;i++)if(bestP[i]>0)t[i]=true;return t;};\n    vector<int>vPri(N,0);bool sysImp=true;\n    while(sysImp&&msElapsed()<1850){sysImp=false;vector<bool>curT=getTerms();\n        vector<ll>ntd(K,INF);for(int k=0;k<K;k++)for(int i=0;i<N;i++)if(curT[i])ntd[k]=min(ntd[k],D2T[k][i]);\n        vector<pair<pair<int,int>,int>>addV,remV;\n        for(int v=1;v<N;v++){if(!curT[v]){int nc=0;for(int k=0;k<K;k++)if(D2T[k][v]<ntd[k])nc++;addV.push_back({{-vPri[v],-nc},v});}\n            else{int pSq=(int)min((ll)2e9,(ll)bestP[v]*bestP[v]);remV.push_back({{-vPri[v],pSq},v});}}\n        sort(addV.begin(),addV.end());sort(remV.begin(),remV.end());\n        for(auto&[key,v]:addV){if(msElapsed()>1850)break;if(curT[v])continue;vector<bool>t=curT;t[v]=true;auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);if(sf&&sc<bestCost){updateBest(eo,sp,sc);vPri[v]++;sysImp=true;curT=getTerms();}}\n        for(auto&[key,v]:remV){if(msElapsed()>1850)break;if(!curT[v])continue;vector<bool>t=curT;t[v]=false;auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);if(sf&&sc<bestCost){updateBest(eo,sp,sc);vPri[v]++;sysImp=true;curT=getTerms();}}}\n    // Pair phase: capped at 1800ms to guarantee time for final 2-center\n    if(msElapsed()<1800){vector<bool>curT=getTerms();\n        vector<ll>ntd(K,INF);for(int k=0;k<K;k++)for(int i=0;i<N;i++)if(curT[i])ntd[k]=min(ntd[k],D2T[k][i]);\n        vector<pair<int,int>>addC,remC;\n        for(int v=1;v<N;v++){if(!curT[v]){int nc=0;for(int k=0;k<K;k++)if(D2T[k][v]<ntd[k])nc++;addC.push_back({-nc,v});}else remC.push_back({(int)min((ll)2e9,(ll)bestP[v]*bestP[v]),v});}\n        sort(addC.begin(),addC.end());sort(remC.begin(),remC.end());\n        int na=min((int)addC.size(),6),nr=min((int)remC.size(),6);\n        for(int i=0;i<na&&msElapsed()<1800;i++){int v1=addC[i].second;for(int j=i+1;j<na&&msElapsed()<1800;j++){int v2=addC[j].second;if(curT[v1]||curT[v2])continue;vector<bool>t=curT;t[v1]=true;t[v2]=true;auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);if(sf&&sc<bestCost){updateBest(eo,sp,sc);curT=getTerms();}}}\n        for(int i=0;i<nr&&msElapsed()<1800;i++){int v1=remC[i].second;for(int j=i+1;j<nr&&msElapsed()<1800;j++){int v2=remC[j].second;if(!curT[v1]||!curT[v2])continue;vector<bool>t=curT;t[v1]=false;t[v2]=false;auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);if(sf&&sc<bestCost){updateBest(eo,sp,sc);curT=getTerms();}}}\n        for(int i=0;i<na&&msElapsed()<1800;i++){int v1=addC[i].second;if(curT[v1])continue;for(int j=0;j<nr&&msElapsed()<1800;j++){int v2=remC[j].second;if(!curT[v2])continue;vector<bool>t=curT;t[v1]=true;t[v2]=false;auto eo=buildSteiner(t);auto[sp,sc,sf]=evalEO(eo);if(sf&&sc<bestCost){updateBest(eo,sp,sc);curT=getTerms();}}}}\n    // Final 2-center: guaranteed 50ms (1800-1850ms)\n    if(msElapsed()<1850){vector<bool>reach(N,false);queue<int>q;q.push(0);reach[0]=true;\n        while(!q.empty()){int v=q.front();q.pop();for(auto&[u,j]:adj[v])if(bestEO[j]&&!reach[u]){reach[u]=true;q.push(u);}}\n        ll ec=0;for(int j=0;j<M;j++)if(bestEO[j])ec+=EW[j];\n        auto[P2c,pc2c]=optimizeP(reach,true);if(pc2c!=INF&&ec+pc2c<bestCost)updateBest(bestEO,P2c,ec+pc2c);}\n    {vector<bool>curT=getTerms();int loopIt=0;bool cont=true;\n     while(cont&&loopIt++<100&&msElapsed()<1850){cont=false;\n        auto eo=buildSteiner(curT);vector<bool>reach(N,false);queue<int>q;q.push(0);reach[0]=true;\n        while(!q.empty()){int v=q.front();q.pop();for(auto&[u,j]:adj[v])if(eo[j]&&!reach[u]){reach[u]=true;q.push(u);}}\n        ll ec=0;for(int j=0;j<M;j++)if(eo[j])ec+=EW[j];\n        auto[P2c,pc2c]=optimizeP(reach,true);if(pc2c==INF)break;\n        if(ec+pc2c<bestCost)updateBest(eo,P2c,ec+pc2c);\n        vector<bool>newT(N,false);newT[0]=true;for(int i=0;i<N;i++)if(P2c[i]>0)newT[i]=true;\n        if(newT==curT)break;curT=newT;cont=true;}}\n    for(int i=0;i<N;i++)cout<<bestP[i]<<\" \\n\"[i==N-1];\n    for(int j=0;j<M;j++)cout<<(int)bestEO[j]<<\" \\n\"[j==M-1];\n    return 0;}","ahc021":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N = 30;\nint init_board[N][N], board[N][N];\nvoid sift(int cx,int cy,vector<array<int,4>>&ops){\n    while(cx<N-1){int ny=(board[cx+1][cy]<=board[cx+1][cy+1])?cy:cy+1;if(board[cx][cy]<=board[cx+1][ny])break;swap(board[cx][cy],board[cx+1][ny]);ops.push_back({cx,cy,cx+1,ny});cy=ny;cx++;}}\nvoid do_heapify(mt19937*rng,int mode,vector<array<int,4>>&ops){\n    memcpy(board,init_board,sizeof(board));ops.clear();int ys[N];\n    for(int x=N-2;x>=0;x--){for(int y=0;y<=x;y++)ys[y]=y;\n        if(mode==4||mode==5){bool done[N]={};bool mkbig=(mode==4);\n            for(int p=0;p<=x;p++){int by=-1,bv=mkbig?INT_MIN:INT_MAX;\n                for(int y=0;y<=x;y++)if(!done[y]){int val=board[x][y]-min(board[x+1][y],board[x+1][y+1]);if(mkbig?val>bv:val<bv){bv=val;by=y;}}\n                done[by]=true;sift(x,by,ops);}\n        }else{switch(mode){case 1:for(int l=0,r=x;l<r;l++,r--)swap(ys[l],ys[r]);break;\n            case 2:sort(ys,ys+x+1,[&](int a,int b){return board[x][a]<board[x][b];});break;\n            case 3:sort(ys,ys+x+1,[&](int a,int b){return board[x][a]>board[x][b];});break;\n            default:if(rng)for(int i=x;i>0;i--)swap(ys[i],ys[(*rng)()%(i+1)]);break;}\n            for(int i=0;i<=x;i++)sift(x,ys[i],ops);}}}\n// Try extension from given (lx,ly) position\nbool try_extend(int lx,int ly,vector<array<int,4>>&prefix,vector<array<int,4>>&best,\n                vector<array<int,4>>&v,vector<array<int,4>>&bv_saved){\n    int p6[6][4]={{lx,ly,lx,ly+1},{lx,ly,lx+1,ly},{lx,ly,lx+1,ly+1},\n                  {lx,ly-1,lx,ly},{lx-1,ly-1,lx,ly},{lx-1,ly,lx,ly}};\n    int ex1=-1,ey1=-1,ex2=-1,ey2=-1;size_t ext_cand=best.size();\n    for(auto&p:p6){int x1=p[0],y1=p[1],x2=p[2],y2=p[3];\n        if(x1<0||x1>=N||y1<0||y1>x1||x2<0||x2>=N||y2<0||y2>x2)continue;\n        swap(init_board[x1][y1],init_board[x2][y2]);\n        for(int m:{0,2,3,4}){do_heapify(nullptr,m,v);size_t cand=prefix.size()+1+v.size();\n            if(cand<ext_cand){ext_cand=cand;ex1=x1;ey1=y1;ex2=x2;ey2=y2;bv_saved=v;}}\n        swap(init_board[x1][y1],init_board[x2][y2]);}\n    if(ex1==-1)return false;\n    swap(init_board[ex1][ey1],init_board[ex2][ey2]);\n    prefix.push_back({ex1,ey1,ex2,ey2});\n    best.clear();for(auto&op:prefix)best.push_back(op);for(auto&op:bv_saved)best.push_back(op);\n    return true;}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    auto t0=chrono::steady_clock::now();\n    auto ms=[&](){return(int)chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    for(int x=0;x<N;x++)for(int y=0;y<=x;y++)cin>>init_board[x][y];\n    mt19937 rng(42);\n    vector<array<int,4>>best,v,bv_saved;\n    best.reserve(6000);v.reserve(6000);bv_saved.reserve(6000);\n    vector<array<int,4>>prefix;prefix.reserve(100);\n    auto upd=[&](vector<array<int,4>>&ops_v){\n        if(prefix.size()+ops_v.size()<best.size()){best.clear();for(auto&op:prefix)best.push_back(op);for(auto&op:ops_v)best.push_back(op);}};\n    do_heapify(nullptr,0,best);\n    for(int m=1;m<=5;m++){do_heapify(nullptr,m,v);upd(v);}\n    for(int round=0;round<20;round++){\n        if(ms()>1400)break;\n        int bx1=-1,by1=-1,bx2=-1,by2=-1;size_t best_cand=best.size();\n        for(int x1=0;x1<N;x1++)for(int y1=0;y1<=x1;y1++){\n            int ax[3]={x1,x1+1,x1+1},ay[3]={y1+1,y1,y1+1};\n            for(int j=0;j<3;j++){int x2=ax[j],y2=ay[j];if(x2>=N||y2>x2)continue;\n                swap(init_board[x1][y1],init_board[x2][y2]);\n                for(int m:{0,2,3,4}){do_heapify(nullptr,m,v);size_t cand=prefix.size()+1+v.size();\n                    if(cand<best_cand){best_cand=cand;bx1=x1;by1=y1;bx2=x2;by2=y2;bv_saved=v;}}\n                swap(init_board[x1][y1],init_board[x2][y2]);}}\n        if(bx1==-1)break;\n        swap(init_board[bx1][by1],init_board[bx2][by2]);\n        prefix.push_back({bx1,by1,bx2,by2});\n        best.clear();for(auto&op:prefix)best.push_back(op);for(auto&op:bv_saved)best.push_back(op);\n        for(int m=0;m<=5;m++){do_heapify(nullptr,m,v);upd(v);}\n        // Chain extension: try from BOTH endpoints of applied swap\n        // First endpoint group: from (bx2,by2)\n        int lx=bx2,ly=by2;\n        for(int ext=0;ext<8;ext++){\n            bool found=try_extend(lx,ly,prefix,best,v,bv_saved);\n            if(!found)break;\n            for(int m=0;m<=5;m++){do_heapify(nullptr,m,v);upd(v);}\n            // Update frontier to last applied swap's endpoint\n            lx=prefix.back()[2]; ly=prefix.back()[3];}\n        // Second endpoint group: from (bx1,by1) \n        lx=bx1;ly=by1;\n        for(int ext=0;ext<8;ext++){\n            bool found=try_extend(lx,ly,prefix,best,v,bv_saved);\n            if(!found)break;\n            for(int m=0;m<=5;m++){do_heapify(nullptr,m,v);upd(v);}\n            lx=prefix.back()[2]; ly=prefix.back()[3];}}\n    while(ms()<1750){do_heapify(&rng,6,v);upd(v);}\n    cout<<best.size()<<\"\\n\";\n    for(auto&op:best)cout<<op[0]<<\" \"<<op[1]<<\" \"<<op[2]<<\" \"<<op[3]<<\"\\n\";\n}","toyota2023summer-final":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXD=9;\nint D,N,M,er,ec;bool obs[MAXD][MAXD],hasc[MAXD][MAXD];\nint cnum[MAXD][MAXD],sr[MAXD*MAXD],sc[MAXD*MAXD],pk[MAXD][MAXD];\nconst int DR[4]={-1,1,0,0},DC[4]={0,0,-1,1};\nbool np[MAXD*MAXD]={};\nbool in_(int r,int c){return(unsigned)r<(unsigned)D&&(unsigned)c<(unsigned)D;}\nvoid build_sigma(){int dist[MAXD][MAXD];memset(dist,-1,sizeof dist);queue<pair<int,int>>q;q.push({er,ec});dist[er][ec]=0;while(!q.empty()){auto[x,y]=q.front();q.pop();for(int i=0;i<4;i++){int nx=x+DR[i],ny=y+DC[i];if(!in_(nx,ny)||dist[nx][ny]>=0||obs[nx][ny])continue;dist[nx][ny]=dist[x][y]+1;q.push({nx,ny});}}vector<pair<int,int>>pos;for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(!obs[r][c]&&!(r==er&&c==ec))pos.emplace_back(r,c);sort(pos.begin(),pos.end(),[&](const pair<int,int>&a,const pair<int,int>&b){if(dist[a.first][a.second]!=dist[b.first][b.second])return dist[a.first][a.second]<dist[b.first][b.second];if(a.first!=b.first)return a.first<b.first;return a.second<b.second;});M=(int)pos.size();for(int k=0;k<M;k++){sr[k]=pos[k].first;sc[k]=pos[k].second;pk[pos[k].first][pos[k].second]=k;}}\nint gd[MAXD][MAXD],gl[MAXD][MAXD],gT;bool ga[MAXD][MAXD];\nvoid apdfs(int r,int c,int pr,int pc){gd[r][c]=gl[r][c]=gT++;int ch=0;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!in_(nr,nc)||obs[nr][nc]||hasc[nr][nc])continue;if(gd[nr][nc]==-1){ch++;apdfs(nr,nc,r,c);gl[r][c]=min(gl[r][c],gl[nr][nc]);if(pr==-1&&ch>1)ga[r][c]=true;if(pr!=-1&&gl[nr][nc]>=gd[r][c])ga[r][c]=true;}else if(!(nr==pr&&nc==pc))gl[r][c]=min(gl[r][c],gd[nr][nc]);}}\nint sgd2[MAXD][MAXD],sgl3[MAXD][MAXD],sgT3;bool sga3[MAXD][MAXD];\nvoid sapdfs(int r,int c,int pr,int pc,bool sh[MAXD][MAXD]){sgd2[r][c]=sgl3[r][c]=sgT3++;int ch=0;for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(!in_(nr,nc)||obs[nr][nc]||sh[nr][nc])continue;if(sgd2[nr][nc]==-1){ch++;sapdfs(nr,nc,r,c,sh);sgl3[r][c]=min(sgl3[r][c],sgl3[nr][nc]);if(pr==-1&&ch>1)sga3[r][c]=true;if(pr!=-1&&sgl3[nr][nc]>=sgd2[r][c])sga3[r][c]=true;}else if(!(nr==pr&&nc==pc))sgl3[r][c]=min(sgl3[r][c],sgd2[nr][nc]);}}\npair<int,int>place_sim_v1(int v,bool sh[MAXD][MAXD]){memset(sgd2,-1,sizeof sgd2);memset(sgl3,-1,sizeof sgl3);memset(sga3,0,sizeof sga3);sgT3=0;sapdfs(er,ec,-1,-1,sh);int ir=sr[v],ic=sc[v];if(sgd2[ir][ic]>=0&&!sga3[ir][ic])return{ir,ic};pair<int,int>b={-1,-1};int bd=INT_MAX,brk=-1;bool gots=false;for(int r=0;r<D;r++)for(int c=0;c<D;c++){if(sgd2[r][c]<0||(r==er&&c==ec))continue;bool s=!sga3[r][c];if(!s&&gots)continue;int d=abs(pk[r][c]-v),rk=pk[r][c];bool better=(!gots&&s)||(gots==s&&(d<bd||(d==bd&&rk>brk)));if(better){b={r,c};bd=d;brk=rk;gots=s;}}return b;}\nvoid bfsr(bool st[MAXD][MAXD],bool reach[MAXD][MAXD]){static pair<int,int>Q[MAXD*MAXD];memset(reach,0,MAXD*MAXD*sizeof(bool));int h=0,t=0;Q[t++]={er,ec};reach[er][ec]=true;while(h<t){auto[x,y]=Q[h++];for(int i=0;i<4;i++){int nx=x+DR[i],ny=y+DC[i];if(!in_(nx,ny)||reach[nx][ny]||obs[nx][ny]||st[nx][ny])continue;reach[nx][ny]=true;Q[t++]={nx,ny};}}}\nbool isacc(bool reach[MAXD][MAXD],int r,int c){for(int i=0;i<4;i++){int nr=r+DR[i],nc=c+DC[i];if(in_(nr,nc)&&reach[nr][nc])return true;}return false;}\nint simulate_inv(bool sh0[MAXD][MAXD],int sc0[MAXD][MAXD],const vector<int>&fut,int tv,int tr,int tc){bool sh[MAXD][MAXD];memcpy(sh,sh0,sizeof sh);int sc2[MAXD][MAXD];memcpy(sc2,sc0,sizeof sc2);sh[tr][tc]=true;sc2[tr][tc]=tv;for(int v:fut){auto[r,c]=place_sim_v1(v,sh);if(r<0)continue;sh[r][c]=true;sc2[r][c]=v;}int bit[MAXD*MAXD+2]={};auto upd=[&](int v){for(v++;v<=M;v+=v&-v)bit[v]++;};auto qry=[&](int v){int s=0;for(v++;v>0;v-=v&-v)s+=bit[v];return s;};int inv=0,n=0;bool h2[MAXD][MAXD];memcpy(h2,sh,sizeof h2);for(int s=0;s<M;s++){bool reach[MAXD][MAXD];bfsr(h2,reach);int bn=INT_MAX,br=-1,bc=-1;for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(h2[r][c]&&isacc(reach,r,c)&&sc2[r][c]<bn){bn=sc2[r][c];br=r;bc=c;}if(br==-1)break;inv+=n-qry(bn);upd(bn);n++;h2[br][bc]=false;}return inv;}\nmt19937 rng_s(42);\nbool any_new_ap_if_place(int r,int c){bool sh[MAXD][MAXD];memcpy(sh,hasc,sizeof sh);sh[r][c]=true;memset(sgd2,-1,sizeof sgd2);memset(sgl3,-1,sizeof sgl3);memset(sga3,0,sizeof sga3);sgT3=0;sapdfs(er,ec,-1,-1,sh);for(int nr=0;nr<D;nr++)for(int nc=0;nc<D;nc++)if(sgd2[nr][nc]>=0&&sga3[nr][nc]&&!ga[nr][nc])return true;return false;}\npair<int,int>pick(int t){\n    memset(gd,-1,sizeof gd);memset(gl,-1,sizeof gl);memset(ga,0,sizeof ga);gT=0;apdfs(er,ec,-1,-1);\n    int ir=sr[t],ic=sc[t];\n    bool ideal_safe=(gd[ir][ic]>=0&&!ga[ir][ic]);\n    if(ideal_safe&&!any_new_ap_if_place(ir,ic))return{ir,ic};\n    vector<pair<int,int>>safe;for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(gd[r][c]>=0&&!(r==er&&c==ec)&&!ga[r][c])safe.emplace_back(r,c);\n    if(safe.empty())for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(gd[r][c]>=0&&!(r==er&&c==ec))safe.emplace_back(r,c);\n    sort(safe.begin(),safe.end(),[&](const pair<int,int>&a,const pair<int,int>&b){int da=abs(pk[a.first][a.second]-t),db=abs(pk[b.first][b.second]-t);if(da!=db)return da<db;return pk[a.first][a.second]>pk[b.first][b.second];});\n    vector<int>unplaced;unplaced.reserve(M);for(int v=0;v<M;v++)if(!np[v]&&v!=t)unplaced.push_back(v);\n    if(unplaced.empty())return safe[0];\n    const int K_pos=ideal_safe?min(3,(int)safe.size()):min(5,(int)safe.size());\n    const int K_trial=ideal_safe?6:7;\n    vector<int>totals(K_pos,0);vector<int>fut=unplaced;\n    for(int trial=0;trial<K_trial;trial++){\n        if(!ideal_safe&&trial==0)sort(fut.begin(),fut.end());\n        else if(!ideal_safe&&trial==1)sort(fut.begin(),fut.end(),[](int a,int b){return a>b;});\n        else shuffle(fut.begin(),fut.end(),rng_s);\n        for(int pi=0;pi<K_pos;pi++){auto[pr,pc]=safe[pi];totals[pi]+=simulate_inv(hasc,cnum,fut,t,pr,pc);}\n    }\n    int bt=INT_MAX;pair<int,int>bp=safe[0];\n    for(int pi=0;pi<K_pos;pi++)if(totals[pi]<bt){bt=totals[pi];bp=safe[pi];}\n    return bp;\n}\nint sim_inv(bool hin[MAXD][MAXD],const vector<int>&prefix,int limit){bool h[MAXD][MAXD];memcpy(h,hin,sizeof h);int bit[MAXD*MAXD+2]={};auto upd=[&](int v){for(v++;v<=M;v+=v&-v)bit[v]++;};auto qry=[&](int v){int s=0;for(v++;v>0;v-=v&-v)s+=bit[v];return s;};int inv=0,n=0;for(int v:prefix){inv+=n-qry(v);upd(v);n++;if(inv>limit)return limit+1;}while(inv<=limit){bool reach[MAXD][MAXD];bfsr(h,reach);int bn=INT_MAX,br=-1,bc=-1;for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(h[r][c]&&isacc(reach,r,c)&&cnum[r][c]<bn){bn=cnum[r][c];br=r;bc=c;}if(br==-1)break;inv+=n-qry(bn);upd(bn);n++;h[br][bc]=false;if(inv>limit)return limit+1;}return inv;}\nvector<pair<int,int>>transport(){bool h[MAXD][MAXD];memcpy(h,hasc,sizeof h);vector<pair<int,int>>ord;ord.reserve(M);vector<int>committed;for(int s=0;s<M;s++){bool reach[MAXD][MAXD];bfsr(h,reach);vector<tuple<int,int,int>>acc;for(int r=0;r<D;r++)for(int c=0;c<D;c++)if(h[r][c]&&isacc(reach,r,c))acc.emplace_back(cnum[r][c],r,c);if(acc.empty())break;sort(acc.begin(),acc.end());auto[mn,mr,mc]=acc[0];pair<int,int>best_pos={mr,mc};if(acc.size()==1){committed.push_back(mn);ord.emplace_back(mr,mc);h[mr][mc]=false;continue;}bool hg[MAXD][MAXD];memcpy(hg,h,sizeof hg);hg[mr][mc]=false;vector<int>sg=committed;sg.push_back(mn);int best_inv=sim_inv(hg,sg,M*(M-1)/2);if(best_inv>0){for(auto&[nx,rx,cx]:acc){if(nx==mn)continue;bool h2[MAXD][MAXD];memcpy(h2,h,sizeof h2);h2[rx][cx]=false;vector<int>sx=committed;sx.push_back(nx);int inv_x=sim_inv(h2,sx,best_inv-1);if(inv_x<best_inv){best_inv=inv_x;best_pos={rx,cx};}}}committed.push_back(cnum[best_pos.first][best_pos.second]);ord.emplace_back(best_pos);h[best_pos.first][best_pos.second]=false;}return ord;}\nint main(){ios_base::sync_with_stdio(false);cin.tie(nullptr);cin>>D>>N;memset(obs,false,sizeof obs);memset(hasc,false,sizeof hasc);memset(cnum,-1,sizeof cnum);memset(np,false,sizeof np);er=0;ec=(D-1)/2;for(int i=0;i<N;i++){int r,c;cin>>r>>c;obs[r][c]=true;}build_sigma();for(int d=0;d<M;d++){int t;cin>>t;auto[r,c]=pick(t);hasc[r][c]=true;cnum[r][c]=t;np[t]=true;cout<<r<<' '<<c<<'\\n';cout.flush();}auto ord=transport();for(auto[r,c]:ord)cout<<r<<' '<<c<<'\\n';cout.flush();}","ahc024":"#include <bits/stdc++.h>\nusing namespace std;using namespace chrono;\nint n,m,g[50][50],og[50][50];bool adj[102][102];\nint ac[102][102],cc[102],dp[102];bool ic[2500];\nconst int dr[]={0,0,1,-1},dc[]={1,-1,0,0};\nauto t0=steady_clock::now();\nint TL=1400;\nbool tok(){return duration_cast<milliseconds>(steady_clock::now()-t0).count()<TL;}\nint gc(int r,int c){return(r<0||r>=n||c<0||c>=n)?0:g[r][c];}\nvoid cajad(){memset(adj,0,sizeof(adj));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int c=g[i][j];for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=c)adj[c][nc]=adj[nc][c]=1;}}}\nvoid cdep(){fill(dp,dp+102,100);queue<int>q;for(int c=0;c<=m;c++)if(adj[c][0]){dp[c]=0;q.push(c);}dp[0]=0;while(!q.empty()){int u=q.front();q.pop();for(int v=1;v<=m;v++)if(adj[u][v]&&dp[v]>dp[u]+1){dp[v]=dp[u]+1;q.push(v);}}}\nvoid rcp(){memset(ac,0,sizeof(ac));memset(cc,0,sizeof(cc));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int c=g[i][j];cc[c]++;bool s[102]={};for(int d=0;d<4;d++){int nc=gc(i+dr[d],j+dc[d]);if(nc!=c&&!s[nc]){ac[c][nc]++;s[nc]=1;}}}}\nvoid init_ic(){for(int i=0;i<n;i++)for(int j=0;j<n;j++)ic[i*n+j]=!adj[og[i][j]][0];}\nbool cok(int r,int c,int col){if(cc[col]<=1)return 0;int sr=-1,sc=-1;for(int i=0;i<n&&sr<0;i++)for(int j=0;j<n;j++)if(g[i][j]==col&&!(i==r&&j==c)){sr=i;sc=j;break;}if(sr<0)return 0;bool v[50][50]={};queue<pair<int,int>>q;q.push({sr,sc});v[sr][sc]=1;int cnt=1;while(!q.empty()){auto[cr,cc2]=q.front();q.pop();for(int d=0;d<4;d++){int nr=cr+dr[d],nc=cc2+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==col&&!(nr==r&&nc==c)&&!v[nr][nc]){v[nr][nc]=1;cnt++;q.push({nr,nc});}}}return cnt==cc[col]-1;}\nbool ctr(int r,int c){int col=g[r][c];if(!col||!adj[col][0])return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&!adj[nc][0])return 0;}bool za=(r==0||r==n-1||c==0||c==n-1);if(!za)for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&!g[nr][nc]){za=1;break;}}if(!za)return 0;if(cc[col]<=1)return 0;int cnb=0;for(int d=0;d<4;d++)if(gc(r+dr[d],c+dc[d])==col)cnb++;if(cnb==0)return 0;if(cnb>=2&&!cok(r,c,col))return 0;for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc&&nc!=col&&ac[col][nc]<=1)return 0;}return 1;}\nvoid dtr(int r,int c){ic[r*n+c]=0;int col=g[r][c];bool s[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!s[nc]){ac[col][nc]--;s[nc]=1;}}g[r][c]=0;cc[col]--;cc[0]++;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;bool hz=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2<0||nr2>=n||nc2<0||nc2>=n){hz=1;break;}if(!g[nr2][nc2]){hz=1;break;}}if(!hz)ac[ncol][0]++;if(ncol==col)continue;bool sc2=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){sc2=1;break;}}if(!sc2)ac[ncol][col]--;}}\nstatic bool gbi[2500];static int gbq[25000];\nvoid gtrim(){\n    memset(gbi,0,n*n);int qh=0,qt=0;\n    auto push=[&](int r,int c){if(r<0||r>=n||c<0||c>=n||!g[r][c])return;int idx=r*n+c;if(!gbi[idx]){gbi[idx]=1;gbq[qt++]=idx;}};\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(!g[i][j])continue;bool za=(i==0||i==n-1||j==0||j==n-1);if(!za)for(int d=0;d<4;d++){int nr=i+dr[d],nc=j+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&!g[nr][nc]){za=1;break;}}if(za)push(i,j);}\n    auto drain=[&](){while(qh<qt){int idx=gbq[qh++];gbi[idx]=0;int r=idx/n,c=idx%n;if(!g[r][c])continue;if(ctr(r,c)){dtr(r,c);for(int d=0;d<4;d++)push(r+dr[d],c+dc[d]);}}};\n    drain();\n    bool ch=true;while(ch){ch=false;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(g[i][j]&&ctr(i,j)){dtr(i,j);ch=true;for(int d=0;d<4;d++)push(i+dr[d],j+dc[d]);}drain();}\n}\nvoid dra(int r,int c,int col,int c2){ic[r*n+c]=!adj[c2][0];bool s1[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=col&&!s1[nc]){ac[col][nc]--;s1[nc]=1;}}g[r][c]=c2;cc[col]--;cc[c2]++;bool s2[102]={};for(int d=0;d<4;d++){int nc=gc(r+dr[d],c+dc[d]);if(nc!=c2&&!s2[nc]){ac[c2][nc]++;s2[nc]=1;}}for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int ncol=g[nr][nc];if(!ncol)continue;if(ncol!=col){bool st=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==col){st=1;break;}}if(!st)ac[ncol][col]--;}if(ncol!=c2){bool hd=0;for(int d2=0;d2<4;d2++){int nr2=nr+dr[d2],nc2=nc+dc[d2];if(nr2==r&&nc2==c)continue;if(nr2>=0&&nr2<n&&nc2>=0&&nc2<n&&g[nr2][nc2]==c2){hd=1;break;}}if(!hd)ac[ncol][c2]++;}}}\nbool cra(int r,int c,int&co){int col=g[r][c];if(!col||adj[col][0])return 0;if(cc[col]<=1)return 0;bool any=0;for(int d=0;d<4;d++){int c2=gc(r+dr[d],c+dc[d]);if(c2&&c2!=col&&dp[c2]<=dp[col]){any=1;break;}}if(!any)return 0;int cnb=0;for(int d=0;d<4;d++)if(gc(r+dr[d],c+dc[d])==col)cnb++;if(cnb==0)return 0;if(cnb>=2&&!cok(r,c,col))return 0;int best=-1,bd=dp[col]+1;for(int d=0;d<4;d++){int nr=r+dr[d],nc=c+dc[d];if(nr<0||nr>=n||nc<0||nc>=n)continue;int c2=g[nr][nc];if(!c2||c2==col||dp[c2]>dp[col])continue;bool ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&!adj[c2][dc2]){ok=0;break;}}if(!ok)continue;ok=1;for(int d2=0;d2<4;d2++){int dc2=gc(r+dr[d2],c+dc[d2]);if(dc2&&dc2!=col&&dc2!=c2&&ac[col][dc2]<=1){ok=0;break;}}if(!ok)continue;if(dp[c2]<bd){best=c2;bd=dp[c2];}}if(best>=0){co=best;return 1;}return 0;}\nint czero(){int c=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)c+=!g[i][j];return c;}\nvoid run(const vector<int>&ord){rcp();gtrim();int pz=czero();while(tok()){rcp();for(int p=0;p<15;p++){bool a=0;for(int idx:ord){if(!ic[idx])continue;int i=idx/n,j=idx%n,col=g[i][j],co;if(!col||adj[col][0]){ic[idx]=0;continue;}if(cra(i,j,co)){dra(i,j,col,co);a=1;}}if(!a)break;}gtrim();int z=czero();if(z<=pz)break;pz=z;}}\nint mg[50][50],mac[102][102],mcc[102];\nbool wconn(int W){int sr=-1,sc_=-1,wc=0;for(int a=0;a<n;a++)for(int b=0;b<n;b++)if(g[a][b]==W){wc++;if(sr<0){sr=a;sc_=b;}}if(!wc)return 1;bool v[50][50]={};queue<pair<int,int>>q;q.push({sr,sc_});v[sr][sc_]=1;int cnt=1;while(!q.empty()){auto[cr,c2]=q.front();q.pop();for(int d=0;d<4;d++){int nr=cr+dr[d],nc=c2+dc[d];if(nr>=0&&nr<n&&nc>=0&&nc<n&&g[nr][nc]==W&&!v[nr][nc]){v[nr][nc]=1;cnt++;q.push({nr,nc});}}}return cnt==wc;}\nvoid micro_opt(){\n    for(int i=0;i<n&&tok();i++)for(int j=0;j<n;j++){\n        int I=g[i][j];if(!I||adj[I][0]||cc[I]!=1)continue;\n        for(int d0=0;d0<4;d0++){\n            int ni=i+dr[d0],nj=j+dc[d0];if(ni<0||ni>=n||nj<0||nj>=n)continue;\n            int E=g[ni][nj];if(!E||!adj[E][0]||!adj[I][E])continue;\n            bool bad=false;for(int d2=0;d2<4;d2++){int a2=ni+dr[d2],b2=nj+dc[d2];if(a2==i&&b2==j)continue;if(a2<0||a2>=n||b2<0||b2>=n||!g[a2][b2]){bad=true;break;}}\n            if(!bad){\n                int sz=czero();memcpy(mg,g,sizeof(g));memcpy(mac,ac,sizeof(ac));memcpy(mcc,cc,sizeof(cc));\n                dra(ni,nj,E,I);dra(i,j,I,E);\n                if(wconn(E)){rcp();bool vd=true;for(int a=1;a<=m&&vd;a++){if(adj[a][0]!=(ac[a][0]>0))vd=false;for(int b=1;b<a&&vd;b++)if(adj[a][b]!=(ac[a][b]>0))vd=false;}if(vd)for(int w=1;w<=m&&vd;w++)if(!wconn(w))vd=false;if(vd){gtrim();if(czero()>sz)continue;}}\n                memcpy(g,mg,sizeof(g));memcpy(ac,mac,sizeof(ac));memcpy(cc,mcc,sizeof(cc));\n            }\n            for(int d12=0;d12<4;d12++){\n                int r2=ni+dr[d12],c2=nj+dc[d12];if(r2<0||r2>=n||c2<0||c2>=n||(r2==i&&c2==j))continue;\n                int E2=g[r2][c2];if(!E2||!adj[E2][0]||!adj[I][E2]||E2==I)continue;\n                bool bad2=false;for(int d2=0;d2<4;d2++){int a2=r2+dr[d2],b2=c2+dc[d2];if(a2==ni&&b2==nj)continue;if(a2<0||a2>=n||b2<0||b2>=n||!g[a2][b2]){bad2=true;break;}}\n                if(bad2)continue;\n                int sz=czero();memcpy(mg,g,sizeof(g));memcpy(mac,ac,sizeof(ac));memcpy(mcc,cc,sizeof(cc));\n                dra(ni,nj,E,I);dra(i,j,I,E);dra(r2,c2,E2,I);dra(ni,nj,I,E2);\n                if(wconn(E)&&wconn(E2)){rcp();bool vd=true;for(int a=1;a<=m&&vd;a++){if(adj[a][0]!=(ac[a][0]>0))vd=false;for(int b=1;b<a&&vd;b++)if(adj[a][b]!=(ac[a][b]>0))vd=false;}if(vd)for(int w=1;w<=m&&vd;w++)if(!wconn(w))vd=false;if(vd){gtrim();if(czero()>sz)continue;}}\n                memcpy(g,mg,sizeof(g));memcpy(ac,mac,sizeof(ac));memcpy(cc,mcc,sizeof(cc));\n            }\n        }\n    }\n}\nstatic int tg[50][50],tac[102][102],tcc[102];\nvoid teleport_micro_opt(){\n    bool improved=true;\n    while(improved&&tok()){\n        improved=false;\n        for(int i=0;i<n&&tok();i++)for(int j=0;j<n;j++){\n            int I=g[i][j];if(!I||adj[I][0]||cc[I]!=1)continue;\n            int sz=czero();bool found=false;\n            for(int dr2=-5;dr2<=5&&!found;dr2++){\n                for(int dc2=-5;dc2<=5&&!found;dc2++){\n                    int dist=abs(dr2)+abs(dc2);if(!dist||dist>5)continue;\n                    int ni=i+dr2,nj=j+dc2;if(ni<0||ni>=n||nj<0||nj>=n)continue;\n                    int E=g[ni][nj];\n                    if(!E||!adj[I][E])continue; // Removed adj[E][0] requirement - allows interior\u2192interior swaps\n                    bool bad=false;\n                    for(int d2=0;d2<4;d2++){\n                        int a2=ni+dr[d2],b2=nj+dc[d2];\n                        if(a2<0||a2>=n||b2<0||b2>=n||!g[a2][b2]){bad=true;break;}\n                    }\n                    if(bad)continue;\n                    memcpy(tg,g,sizeof(g));memcpy(tac,ac,sizeof(ac));memcpy(tcc,cc,sizeof(cc));\n                    dra(ni,nj,E,I);dra(i,j,I,E);\n                    rcp();bool valid=true;\n                    for(int a=1;a<=m&&valid;a++){\n                        if(adj[a][0]!=(ac[a][0]>0))valid=false;\n                        for(int b=1;b<a&&valid;b++)if(adj[a][b]!=(ac[a][b]>0))valid=false;\n                    }\n                    if(valid)for(int w=1;w<=m&&valid;w++)if(!wconn(w))valid=false;\n                    if(valid){gtrim();if(czero()>sz){found=true;improved=true;break;}}\n                    memcpy(g,tg,sizeof(g));memcpy(ac,tac,sizeof(ac));memcpy(cc,tcc,sizeof(cc));\n                }\n            }\n        }\n    }\n}\nstatic int bg[50][50];int bz=-1;\nvoid sv(){int z=czero();if(z>bz){bz=z;memcpy(bg,g,sizeof(g));}}\nvector<int> centroid_last_ord(){\n    vector<double>cx(102,0),cy(102,0);vector<int>cnt(102,0);\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){int col=og[i][j];if(!adj[col][0]){cx[col]+=i;cy[col]+=j;cnt[col]++;}}\n    for(int c=1;c<=m;c++)if(cnt[c]){cx[c]/=cnt[c];cy[c]/=cnt[c];}\n    vector<int>cidx(102,-1);vector<double>bd(102,1e18);\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){int col=og[i][j];if(!adj[col][0]){double d=(i-cx[col])*(i-cx[col])+(j-cy[col])*(j-cy[col]);if(d<bd[col]){bd[col]=d;cidx[col]=i*n+j;}}}\n    vector<pair<pair<int,double>,int>>keys;\n    for(int i=0;i<n;i++)for(int j=0;j<n;j++){int idx=i*n+j,col=og[i][j];if(!adj[col][0]){if(cidx[col]==idx)keys.push_back({{2,0.0},idx});else{double d=(i-cx[col])*(i-cx[col])+(j-cy[col])*(j-cy[col]);keys.push_back({{1,-d},idx});}}else keys.push_back({{0,(double)idx},idx});}\n    sort(keys.begin(),keys.end());\n    vector<int>ord;for(auto&[k,idx]:keys)ord.push_back(idx);return ord;\n}\nint main(){\n    t0=steady_clock::now();ios_base::sync_with_stdio(0);cin.tie(0);\n    cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<n;j++){cin>>g[i][j];og[i][j]=g[i][j];}\n    cajad();cdep();mt19937 rng(42);\n    // Phase 1: Multiple trials\n    TL=1400;\n    for(int trial=0;trial==0||tok();trial++){\n        memcpy(g,og,sizeof(g));init_ic();\n        vector<int>ord(n*n);iota(ord.begin(),ord.end(),0);\n        if(trial==1)reverse(ord.begin(),ord.end());\n        else if(trial==2){for(int j2=0;j2<n;j2++)for(int i2=0;i2<n;i2++)ord[j2*n+i2]=i2*n+j2;}\n        else if(trial==3){int cx=n/2,cy=n/2;sort(ord.begin(),ord.end(),[&](int a,int b){return abs(a/n-cx)+abs(a%n-cy)>abs(b/n-cx)+abs(b%n-cy);});}\n        else if(trial==4){int cx=n/2,cy=n/2;sort(ord.begin(),ord.end(),[&](int a,int b){return abs(a/n-cx)+abs(a%n-cy)<abs(b/n-cx)+abs(b%n-cy);});}\n        else if(trial==5)ord=centroid_last_ord();\n        else if(trial==6){int k=0;for(int i=n-1;i>=0;i--)for(int j=0;j<n;j++)ord[k++]=i*n+j;}\n        else if(trial==7){int k=0;for(int i=0;i<n;i++)for(int j=n-1;j>=0;j--)ord[k++]=i*n+j;}\n        else shuffle(ord.begin(),ord.end(),rng);\n        run(ord);micro_opt();sv();\n    }\n    // Phase 2: Post-processing on best result with extended time\n    if(bz>0){\n        TL=1900; // Extend time limit for post-processing\n        memcpy(g,bg,sizeof(g));\n        for(int i=0;i<n;i++)for(int j=0;j<n;j++)ic[i*n+j]=(g[i][j]>0&&!adj[g[i][j]][0]);\n        rcp();\n        teleport_micro_opt(); // Distance 1-5, any adjacent ward (incl. interior)\n        micro_opt();          // 1-2 step moves\n        vector<int>ord0(n*n);iota(ord0.begin(),ord0.end(),0);\n        run(ord0); // Additional reassignment + trim\n        sv();\n    }\n    for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j)cout<<' ';cout<<bg[i][j];}cout<<'\\n';}\n}","ahc025":"#include <bits/stdc++.h>\nusing namespace std;\nint N, D, Q, q_used = 0;\nchar bq(const vector<int>& L, const vector<int>& R) {\n    cout << L.size() << \" \" << R.size();\n    for (int x : L) cout << \" \" << x;\n    for (int x : R) cout << \" \" << x;\n    cout << \"\\n\" << flush; q_used++;\n    char c; cin >> c; return c;\n}\nint slm;\nvector<int> ms(vector<int> a) {\n    if ((int)a.size() <= 1 || q_used >= slm) return a;\n    int m = a.size() / 2;\n    auto L = ms(vector<int>(a.begin(), a.begin() + m));\n    auto R = ms(vector<int>(a.begin() + m, a.end()));\n    vector<int> r; int i = 0, j = 0;\n    while (i < (int)L.size() && j < (int)R.size()) {\n        if (q_used >= slm) break;\n        if (bq({L[i]}, {R[j]}) != '>') r.push_back(L[i++]);\n        else r.push_back(R[j++]);\n    }\n    while (i < (int)L.size()) r.push_back(L[i++]);\n    while (j < (int)R.size()) r.push_back(R[j++]);\n    return r;\n}\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(nullptr);\n    cin >> N >> D >> Q;\n    auto t0 = chrono::high_resolution_clock::now();\n    auto el = [&]() { return chrono::duration<double>(chrono::high_resolution_clock::now() - t0).count(); };\n    slm = Q / 2;\n    vector<int> ini(N); iota(ini.begin(), ini.end(), 0);\n    vector<int> ord = ms(ini);\n    vector<int> pos(N);\n    for (int i = 0; i < N; i++) pos[ord[i]] = i;\n    int est_end = Q * 4 / 5;\n    vector<double> w(N, 1.0), ps(N + 1, 0.0);\n    w[ord[0]] = 1.0; ps[1] = 1.0;\n    for (int i = 1; i < N; i++) {\n        if (q_used >= est_end) { w[ord[i]] = w[ord[i-1]]; ps[i+1] = ps[i] + w[ord[i]]; continue; }\n        int lo = 0, hi = i;\n        while (lo < hi && q_used < est_end) {\n            int mid = (lo + hi) / 2;\n            if (bq({ord[i]}, vector<int>(ord.begin(), ord.begin() + mid + 1)) == '>') lo = mid + 1;\n            else hi = mid;\n        }\n        double wlo = ps[lo], whi = (lo < i) ? ps[lo + 1] : ps[i] * 2.0;\n        w[ord[i]] = max(w[ord[i-1]], (wlo + whi) / 2.0);\n        ps[i+1] = ps[i] + w[ord[i]];\n    }\n    vector<int> oi(N); iota(oi.begin(), oi.end(), 0);\n    sort(oi.begin(), oi.end(), [&](int a, int b) { return fabs(w[a]-w[b]) > 1e-12 ? w[a] > w[b] : pos[a] > pos[b]; });\n    vector<double> gw(D, 0.0); vector<int> asgn(N, 0);\n    for (int x : oi) { int g = (int)(min_element(gw.begin(), gw.end()) - gw.begin()); asgn[x] = g; gw[g] += w[x]; }\n    double total = 0; for (double x : gw) total += x;\n    double mean = total / D;\n    for (int p = 0; p < 5000 && el() < 1.5; p++) {\n        bool imp = false;\n        for (int x = 0; x < N; x++) {\n            int g0 = asgn[x]; int bg = g0; double bd = 0, d0 = gw[g0] - mean;\n            for (int g = 0; g < D; g++) {\n                if (g == g0) continue;\n                double d1 = gw[g] - mean;\n                double dc = d0*d0 + d1*d1 - (d0-w[x])*(d0-w[x]) - (d1+w[x])*(d1+w[x]);\n                if (dc > bd) { bd = dc; bg = g; }\n            }\n            if (bg != g0) { gw[g0] -= w[x]; gw[bg] += w[x]; asgn[x] = bg; imp = true; }\n        }\n        for (int i = 0; i < N && el() < 1.45; i++) for (int j = i+1; j < N; j++) {\n            if (asgn[i] == asgn[j]) continue;\n            int g1 = asgn[i], g2 = asgn[j];\n            double d1 = gw[g1]-mean, d2 = gw[g2]-mean, d1n = d1-w[i]+w[j], d2n = d2+w[i]-w[j];\n            if (d1*d1 + d2*d2 > d1n*d1n + d2n*d2n + 1e-9) {\n                gw[g1] += w[j]-w[i]; gw[g2] += w[i]-w[j]; asgn[i] = g2; asgn[j] = g1; imp = true;\n            }\n        }\n        if (!imp) break;\n    }\n    vector<vector<int>> gi(D);\n    for (int x = 0; x < N; x++) gi[asgn[x]].push_back(x);\n    for (int g = 0; g < D; g++) sort(gi[g].begin(), gi[g].end(), [&](int a, int b){ return pos[a] < pos[b]; });\n    auto cpos = [&](int a, int b){ return pos[a] < pos[b]; };\n    // Phase 5: Always run rank-list approach (Phase 5a removed)\n    {\n        vector<int> grank;\n        for (int g = 0; g < D; g++) if (!gi[g].empty()) grank.push_back(g);\n        int ng = (int)grank.size();\n        if (ng >= 2) {\n            function<void(int,int)> mgsort=[&](int lo,int hi){\n                if(hi-lo<=1||q_used>=Q) return;\n                int mid=(lo+hi)/2; mgsort(lo,mid); mgsort(mid,hi);\n                vector<int> tmp; int i=lo,j=mid;\n                while(i<mid&&j<hi&&q_used+1<=Q){\n                    if(gi[grank[i]].empty()) tmp.push_back(grank[j++]);\n                    else if(gi[grank[j]].empty()) tmp.push_back(grank[i++]);\n                    else if(bq(gi[grank[i]],gi[grank[j]])!='>')  tmp.push_back(grank[j++]);\n                    else tmp.push_back(grank[i++]);\n                }\n                while(i<mid) tmp.push_back(grank[i++]); while(j<hi) tmp.push_back(grank[j++]);\n                for(int k=lo;k<hi;k++) grank[k]=tmp[k-lo];\n            };\n            mgsort(0,ng);\n            int nimi=0,eqst=0;\n            while(ng>=2&&q_used+8<=Q&&el()<1.9){\n                while(ng>0&&gi[grank[0]].empty()){grank.erase(grank.begin());ng--;}\n                while(ng>0&&gi[grank[ng-1]].empty()){grank.pop_back();ng--;}\n                if(ng<2) break;\n                int gh=grank[0],gl=grank[ng-1];\n                char cmp=bq(gi[gh],gi[gl]);\n                if(cmp=='='){if(++eqst>=3) break;continue;} eqst=0;\n                if(cmp=='<'){\n                    int mx=grank[0];\n                    for(int i=1;i<ng&&q_used<Q;i++) if(!gi[grank[i]].empty()&&bq(gi[mx],gi[grank[i]])=='<') mx=grank[i];\n                    auto it1=find(grank.begin(),grank.begin()+ng,mx);if(it1!=grank.begin()) rotate(grank.begin(),it1,it1+1);\n                    int mn=-1;\n                    for(int i=ng-1;i>=1&&q_used<Q;i--){if(gi[grank[i]].empty()||grank[i]==grank[0]) continue;if(mn==-1){mn=grank[i];continue;}if(bq(gi[mn],gi[grank[i]])=='>') mn=grank[i];}\n                    if(mn!=-1){auto it2=find(grank.begin(),grank.begin()+ng,mn);if(it2!=grank.begin()+ng-1) rotate(it2,it2+1,grank.begin()+ng);}\n                    gh=grank[0];gl=grank[ng-1];\n                    if(q_used>=Q) break;\n                    char c2=bq(gi[gh],gi[gl]);if(c2!='>'){ if(++nimi>=3) break; continue;}\n                }\n                auto& hv=gi[gh];auto& lt=gi[gl];\n                if((int)hv.size()<=1){grank.erase(grank.begin());ng--;continue;}\n                bool se=false; int lo=0,hi=(int)hv.size()-1;\n                while(lo<hi&&q_used+1<=Q&&el()<1.87){\n                    int mid=(lo+hi)/2;vector<int>L2,R2=lt;\n                    for(int k=0;k<(int)hv.size();k++) if(k!=mid) L2.push_back(hv[k]);R2.push_back(hv[mid]);\n                    char r=bq(L2,R2);if(r=='='){lo=hi=mid;se=true;break;}else if(r=='>') lo=mid+1;else hi=mid;\n                }\n                lo=min(lo,(int)hv.size()-1);\n                int lo_orig=lo;\n                bool mm=se,lo_overshot=false;\n                if(!se&&q_used+1<=Q){\n                    vector<int>vL,vR=lt;for(int k=0;k<(int)hv.size();k++) if(k!=lo) vL.push_back(hv[k]);vR.push_back(hv[lo]);\n                    if(!vL.empty()){char v=bq(vL,vR);if(v=='>'||v=='=') mm=true;\n                    else{lo_overshot=true;if(lo>0&&q_used+1<=Q){vector<int>vL2,vR2=lt;for(int k=0;k<(int)hv.size();k++) if(k!=lo-1) vL2.push_back(hv[k]);vR2.push_back(hv[lo-1]);char v2=bq(vL2,vR2);if(v2=='>'||v2=='='){lo--;mm=true;}}}}\n                }\n                int swap_src=(lo_overshot?lo_orig:lo);\n                bool usw=false;int syi=0;\n                if(!se&&!lt.empty()&&(lo_overshot||!mm)){\n                    int ll=(int)(log2((double)lt.size())+2);\n                    if(q_used+ll+1<=Q&&el()<1.87){\n                        int y0=0,y1=(int)lt.size()-1;bool s2=false;\n                        while(y0<y1&&q_used+1<=Q&&el()<1.87){\n                            int ym=(y0+y1)/2;vector<int>L2,R2;\n                            for(int k=0;k<(int)hv.size();k++) if(k!=swap_src) L2.push_back(hv[k]);\n                            for(int k=0;k<(int)lt.size();k++) if(k!=ym) R2.push_back(lt[k]);\n                            L2.push_back(lt[ym]);R2.push_back(hv[swap_src]);\n                            if(L2.empty()||R2.empty()) break;\n                            char r=bq(L2,R2);if(r=='='){y0=y1=ym;s2=true;break;}else if(r=='>') y0=ym+1;else y1=ym;\n                        }\n                        if(s2){usw=true;syi=min(y0,(int)lt.size()-1);lo=swap_src;}\n                    }\n                }\n                auto do_bub=[&](){\n                    for(int i=0;i+1<ng&&q_used+1<=Q;i++){if(gi[grank[i]].empty()||gi[grank[i+1]].empty()) break;if(bq(gi[grank[i]],gi[grank[i+1]])=='<') swap(grank[i],grank[i+1]);else break;}\n                    for(int i=ng-1;i>0&&q_used+1<=Q;i--){if(gi[grank[i]].empty()||gi[grank[i-1]].empty()) break;if(bq(gi[grank[i]],gi[grank[i-1]])=='>') swap(grank[i],grank[i-1]);else break;}\n                };\n                if(usw){\n                    int xm=hv[lo],ym=lt[syi];asgn[xm]=gl;asgn[ym]=gh;gw[gh]+=w[ym]-w[xm];gw[gl]+=w[xm]-w[ym];\n                    hv.erase(hv.begin()+lo);lt.erase(lt.begin()+syi);\n                    hv.insert(lower_bound(hv.begin(),hv.end(),ym,cpos),ym);lt.insert(lower_bound(lt.begin(),lt.end(),xm,cpos),xm);\n                    nimi=0;do_bub();\n                } else if(mm){\n                    int mv=hv[lo];asgn[mv]=gl;gw[gh]-=w[mv];gw[gl]+=w[mv];\n                    hv.erase(hv.begin()+lo);lt.insert(lower_bound(lt.begin(),lt.end(),mv,cpos),mv);\n                    bool undo=false;\n                    if(!se&&q_used+1<=Q&&!hv.empty()&&!lt.empty()){\n                        char pt=bq(gi[gh],gi[gl]);\n                        if(pt=='<'){undo=true;asgn[mv]=gh;gw[gh]+=w[mv];gw[gl]-=w[mv];\n                            auto it=lower_bound(lt.begin(),lt.end(),mv,cpos);if(it!=lt.end()&&*it==mv) lt.erase(it);\n                            hv.insert(lower_bound(hv.begin(),hv.end(),mv,cpos),mv);}\n                    }\n                    if(!undo){nimi=0;do_bub();}else{if(++nimi>=3) break;}\n                } else{if(++nimi>=3) break;}\n            }\n        }\n    }\n    while(q_used<Q) bq({0},{1});\n    for(int i=0;i<N;i++) cout<<asgn[i]<<\" \\n\"[i==N-1];\n    cout.flush();\n    return 0;\n}","ahc026":"#include <bits/stdc++.h>\nusing namespace std;\nusing Clock = chrono::steady_clock;\nint n, m;\nstruct Dec{int ars,t,rs,re;};\nlong long greedy(int mode,long long noise,vector<vector<int>>sts,vector<int>stk,vector<int>pidx,vector<int>sm,vector<pair<int,int>>&ops,mt19937_64&rng,Dec*od=nullptr,int*on=nullptr){\n    if(on)*on=0;bool psfx=(mode<=1),pat=(mode==1||mode==3);ops.clear();long long e=0;\n    auto rc=[&](int t){sm[t]=sts[t].empty()?n+1:*min_element(sts[t].begin(),sts[t].end());};\n    for(int v=1;v<=n;v++){int s=stk[v],j=pidx[v];while((int)sts[s].size()>j+1){\n        int re=(int)sts[s].size()-1,rs=re;while(rs>j+1&&sts[s][rs-1]>sts[s][rs])rs--;\n        int fu1=sts[s][rs],ars=rs,bt=-1;\n        if(psfx){for(int sp=rs;sp<=re&&bt==-1;sp++){int u1c=sts[s][sp];long long bs=LLONG_MIN;int bk=-1;for(int t=0;t<m;t++){if(t==s)continue;long long tt=sts[t].empty()?(n+1):(long long)sts[t].back(),mt=sts[t].empty()?(n+1):(long long)sm[t];if(tt>u1c&&mt>u1c){long long sc=(long long)n-tt;if(noise>0)sc+=(long long)(rng()%(2*noise+1))-noise;if(sc>bs){bs=sc;bk=t;}}}if(bk!=-1){ars=sp;bt=bk;}}}\n        if(bt==-1){long long best=LLONG_MIN;for(int t=0;t<m;t++){if(t==s)continue;bool emp=sts[t].empty();long long tt=emp?0:sts[t].back(),mt=emp?(n+1):sm[t];long long sc;if(!pat){if(emp)sc=2LL*n*n;else if(tt>fu1)sc=(mt>fu1)?3LL*n*n+(n-tt):(long long)n*n+mt;else sc=mt-(long long)n*n;}else{if(emp)sc=(long long)n;else if(tt>fu1)sc=2LL*n*n+(n-tt);else sc=tt-(long long)n*n;}if(noise>0)sc+=(long long)(rng()%(2*noise+1))-noise;if(sc>best){best=sc;bt=t;}}}\n        if(od&&on&&*on<2000)od[(*on)++]={ars,bt,rs,re};\n        e+=(re-ars+1)+1;ops.push_back({sts[s][ars],bt+1});\n        int nb=(int)sts[bt].size(),osz=(int)sts[s].size();\n        for(int p=ars;p<osz;p++){int b=sts[s][p];sts[bt].push_back(b);stk[b]=bt;pidx[b]=nb+(p-ars);sm[bt]=min(sm[bt],b);}\n        sts[s].resize(ars);rc(s);}\n        ops.push_back({v,0});sts[s].pop_back();rc(s);}\n    return e;}\nlong long simfx(const vector<vector<int>>&is,const vector<int>&ist,const vector<int>&ip,const vector<int>&ism,const Dec*fxd,int nfx,Dec*od,int*on,long long budget=LLONG_MAX,vector<pair<int,int>>*ops=nullptr){\n    if(on)*on=0;if(ops)ops->clear();\n    vector<vector<int>>sts=is;vector<int>stk=ist,pidx=ip,sm=ism;long long e=0;int d=0;\n    auto rc=[&](int t){sm[t]=sts[t].empty()?n+1:*min_element(sts[t].begin(),sts[t].end());};\n    for(int v=1;v<=n;v++){int s=stk[v],j=pidx[v];while((int)sts[s].size()>j+1){\n        if(e>budget)return e;\n        int re=(int)sts[s].size()-1,rs=re;while(rs>j+1&&sts[s][rs-1]>sts[s][rs])rs--;\n        int fu1=sts[s][rs],ars,bt;\n        if(d<nfx){ars=fxd[d].ars;bt=fxd[d].t;}\n        else{ars=rs;bt=-1;for(int sp=rs;sp<=re&&bt==-1;sp++){int u1c=sts[s][sp];long long bs=LLONG_MIN;int bk=-1;for(int t=0;t<m;t++){if(t==s)continue;long long tt=sts[t].empty()?(n+1):(long long)sts[t].back(),mt=sts[t].empty()?(n+1):(long long)sm[t];if(tt>u1c&&mt>u1c){long long sc=(long long)n-tt;if(sc>bs){bs=sc;bk=t;}}}if(bk!=-1){ars=sp;bt=bk;}}\n            if(bt==-1){long long best=LLONG_MIN;for(int t=0;t<m;t++){if(t==s)continue;bool emp=sts[t].empty();long long tt=emp?0:sts[t].back(),mt=emp?(n+1):sm[t];long long sc;if(emp)sc=2LL*n*n;else if(tt>fu1)sc=(mt>fu1)?3LL*n*n+(n-tt):(long long)n*n+mt;else sc=mt-(long long)n*n;if(sc>best){best=sc;bt=t;}}}}\n        d++;if(od&&on&&*on<2000)od[(*on)++]={ars,bt,rs,re};\n        e+=(re-ars+1)+1;if(ops)ops->push_back({sts[s][ars],bt+1});\n        if(bt==s)continue;\n        int nb=(int)sts[bt].size(),osz=(int)sts[s].size();\n        for(int p=ars;p<osz;p++){int b=sts[s][p];sts[bt].push_back(b);stk[b]=bt;pidx[b]=nb+(p-ars);sm[bt]=min(sm[bt],b);}\n        sts[s].resize(ars);rc(s);}\n        if(ops)ops->push_back({v,0});sts[s].pop_back();rc(s);}\n    return e;}\nint main(){\n    auto t0=Clock::now();ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>n>>m;int h=n/m;\n    vector<vector<int>>is(m,vector<int>(h));vector<int>ist(n+1),ip(n+1),ism(m,n+1);\n    for(int i=0;i<m;i++){for(int j=0;j<h;j++){cin>>is[i][j];ist[is[i][j]]=i;ip[is[i][j]]=j;}ism[i]=*min_element(is[i].begin(),is[i].end());}\n    long long be=LLONG_MAX;vector<pair<int,int>>bops;mt19937_64 rng(42);\n    auto tms=[&](){return chrono::duration_cast<chrono::milliseconds>(Clock::now()-t0).count();};\n    static Dec d4[4][2000];int nd4[4];long long e4[4];\n    for(int mode=0;mode<4;mode++){mt19937_64 d(0);vector<pair<int,int>>ops;nd4[mode]=0;\n        e4[mode]=greedy(mode,0,is,ist,ip,ism,ops,d,d4[mode],&nd4[mode]);if(e4[mode]<be){be=e4[mode];bops=ops;}}\n    static Dec cd[2000],td[2000],gcd[2000];int cnd,gnd;long long ce,gce=be;\n    {int bm=0;for(int i=1;i<4;i++)if(e4[i]<e4[bm])bm=i;gnd=nd4[bm];gce=e4[bm];memcpy(gcd,d4[bm],gnd*sizeof(Dec));}\n    auto ls_pass=[&](Dec*lc,int&lcnd,long long&lce)->bool{\n        bool imp=false;int dummy;\n        for(int di=0;di<lcnd&&!imp;di++){\n            int oa=lc[di].ars,ot=lc[di].t,ors=lc[di].rs,ore=lc[di].re;\n            for(int at=ors;at<=ore&&!imp;at++){\n                for(int t=0;t<m&&!imp;t++){\n                    if(at==oa&&t==ot)continue;\n                    Dec sv=lc[di];lc[di]={at,t,ors,ore};\n                    long long ne=simfx(is,ist,ip,ism,lc,di+1,nullptr,&dummy,lce);\n                    lc[di]=sv;\n                    if(ne<lce){lce=ne;lc[di]={at,t,ors,ore};simfx(is,ist,ip,ism,lc,di+1,td,&lcnd);memcpy(lc,td,lcnd*sizeof(Dec));imp=true;}}}}\n        return imp;};\n    for(int mode=0;mode<4&&tms()<1200;mode++){\n        cnd=nd4[mode];ce=e4[mode];memcpy(cd,d4[mode],cnd*sizeof(Dec));\n        while(ls_pass(cd,cnd,ce)&&tms()<1200){}\n        if(ce<gce){gce=ce;gnd=cnd;memcpy(gcd,cd,gnd*sizeof(Dec));}}\n    memcpy(cd,gcd,gnd*sizeof(Dec));cnd=gnd;ce=gce;\n    mt19937_64 ils_rng(987654321ULL);bool imp=true;\n    while(tms()<1700){\n        if(!imp){if(ce<gce){gce=ce;gnd=cnd;memcpy(gcd,cd,gnd*sizeof(Dec));}\n            memcpy(cd,gcd,gnd*sizeof(Dec));cnd=gnd;\n            int k=1+ils_rng()%2;\n            for(int p=0;p<k&&cnd>0;p++){int di=ils_rng()%cnd;\n                if(ils_rng()%2==0||cd[di].rs==cd[di].re){int ot=cd[di].t;int nt;do{nt=ils_rng()%m;}while(nt==ot);cd[di].t=nt;}\n                else{int r=cd[di].re-cd[di].rs;cd[di].ars=cd[di].rs+ils_rng()%(r+1);}\n                ce=simfx(is,ist,ip,ism,cd,di+1,td,&cnd);memcpy(cd,td,cnd*sizeof(Dec));}\n            imp=true;}\n        imp=ls_pass(cd,cnd,ce);}\n    if(ce<gce){gce=ce;gnd=cnd;memcpy(gcd,cd,gnd*sizeof(Dec));}\n    if(gce<be){be=gce;vector<pair<int,int>>ops_gen;simfx(is,ist,ip,ism,gcd,gnd,nullptr,nullptr,LLONG_MAX,&ops_gen);bops=ops_gen;}\n    vector<pair<int,int>>ops;ops.reserve(5000);\n    for(uint64_t it=0;;it++){if(it%10==0&&tms()>=1800)break;\n        rng.seed(it*6364136223846793005ULL+1442695040888963407ULL);\n        long long e=greedy(it%4,2000,is,ist,ip,ism,ops,rng);if(e<be){be=e;bops=ops;}}\n    for(auto[v,i]:bops)cout<<v<<\" \"<<i<<\"\\n\";return 0;}","ahc027":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=41,MAXC=1601,BUD=100000;\nint N,n;bool hw[MAXN][MAXN],vw[MAXN][MAXN];int dv[MAXN][MAXN];\nconst int DI[]={0,1,0,-1},DJ[]={1,0,-1,0};const char DC[]=\"RDLU\";\nint C(int i,int j){return i*N+j;}int RI(int c){return c/N;}int RJ(int c){return c%N;}\nbool OK(int i,int j,int d){int ni=i+DI[d],nj=j+DJ[d];if(ni<0||ni>=N||nj<0||nj>=N)return false;if(d==0)return!vw[i][j];if(d==1)return!hw[i][j];if(d==2)return!vw[i][nj];return!hw[ni][j];}\nshort AP[MAXC][MAXC];int AF[MAXC][MAXC];\nvoid bfs(int s){memset(AP[s],0xFF,n*sizeof(short));int fs[MAXC];AP[s][s]=0;fs[s]=s;static int q[MAXC];int h=0,tail=0;q[tail++]=s;while(h<tail){int u=q[h++];for(int d=0;d<4;d++)if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(AP[s][v]<0){AP[s][v]=AP[s][u]+1;fs[v]=(u==s)?v:fs[u];q[tail++]=v;}}}for(int i=0;i<n;i++)AF[s][i]=(i==s)?s:fs[i];}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N;n=N*N;\n    for(int i=0;i<N-1;i++){string s;cin>>s;for(int j=0;j<N;j++)hw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++){string s;cin>>s;for(int j=0;j<N-1;j++)vw[i][j]=(s[j]=='1');}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>dv[i][j];\n    for(int s=0;s<n;s++)bfs(s);\n    short D_home[MAXC];for(int c=0;c<n;c++)D_home[c]=AP[c][0];\n    string route;route.reserve(BUD+10);\n    vector<int> lv(n,0);int pos=0,t=0;\n    {vector<bool> vis(n,false);vis[0]=true;vector<pair<int,int>> stk;stk.reserve(n);stk.push_back({0,0});\n    while(!stk.empty()){int u=stk.back().first;int&nd=stk.back().second;bool found=false;\n    while(nd<4){int d=nd++;if(OK(RI(u),RJ(u),d)){int v=C(RI(u)+DI[d],RJ(u)+DJ[d]);if(!vis[v]){route+=DC[d];t++;pos=v;lv[v]=t;vis[v]=true;stk.push_back({v,0});found=true;break;}}}\n    if(!found){stk.pop_back();if(!stk.empty()){int par=stk.back().first;for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==par){route+=DC[d];t++;pos=par;lv[par]=t;break;}}}};}\n    for(int c=0;c<n;c++)lv[c]=t;\n    float sqd[MAXC];for(int c=0;c<n;c++)sqd[c]=sqrtf((float)dv[RI(c)][RJ(c)]);\n    int committed=-1,sr=0;\n    while(t+(int)D_home[pos]+2<=BUD){\n        bool rrt=(committed<0)||(pos==committed)||(sr>=20);\n        if(!rrt&&t+(int)AP[pos][committed]+(int)D_home[committed]+2>BUD)rrt=true;\n        if(rrt){\n            const short*Ap=AP[pos];int best=-1;float bu=0.0f;\n            for(int c=0;c<n;c++){if(c==pos)continue;int dc=(int)Ap[c];if(t+dc+(int)D_home[c]+2>BUD)continue;\n                // Age-at-arrival: estimate dirtiness when we actually arrive\n                float u=sqd[c]*(float)(t+dc-lv[c]+1)/sqrtf((float)dc+1.0f);\n                if(u>bu){bu=u;best=c;}}\n            committed=best;sr=0;if(committed<0)break;}\n        int nx=AF[pos][committed];bool moved=false;\n        for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;sr++;lv[pos]=t;moved=true;break;}\n        if(!moved)break;}\n    while(pos!=0){int nx=AF[pos][0];for(int d=0;d<4;d++)if(OK(RI(pos),RJ(pos),d)&&C(RI(pos)+DI[d],RJ(pos)+DJ[d])==nx){route+=DC[d];pos=nx;t++;break;}}\n    cout<<route<<\"\\n\";return 0;}","ahc028":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,si,sj;\nvector<string> targets;\nvector<pair<int,int>> charPos[26];\nint ovM[200][200],tCI[200][200];\nint16_t EV[200][200];\nfloat amd[26][26],tC[200][200];\nconst int SCALE=100,OV_W=350,CL_K=20;\nint cands_cl[200][20],pos_of[200];\nvoid computeAll(){\n    for(int i=0;i<M;i++)for(int j=0;j<M;j++){if(i==j){ovM[i][j]=0;continue;}ovM[i][j]=0;for(int k=4;k>=1;k--){bool ok=true;for(int l=0;l<k&&ok;l++)if(targets[i][5-k+l]!=targets[j][l])ok=false;if(ok){ovM[i][j]=k;break;}}}\n    for(int c1=0;c1<26;c1++)for(int c2=0;c2<26;c2++){if(charPos[c1].empty()){amd[c1][c2]=0;continue;}float tot=0;for(auto&[r1,cc1]:charPos[c1]){int md=28;for(auto&[r2,cc2]:charPos[c2])md=min(md,abs(r1-r2)+abs(cc1-cc2));tot+=md;}amd[c1][c2]=tot/(float)charPos[c1].size();}\n    for(int i=0;i<M;i++)for(int j=0;j<M;j++){int ov=ovM[i][j],prev=targets[i][4]-'A';float cost=0;for(int k=ov;k<5;k++){int next=targets[j][k]-'A';cost+=amd[prev][next]+1;prev=next;}tC[i][j]=cost;}\n    for(int i=0;i<M;i++)for(int j=0;j<M;j++){tCI[i][j]=(int)(tC[i][j]*SCALE+0.5f);EV[i][j]=(int16_t)(ovM[i][j]*OV_W-tCI[i][j]);}\n    // Compute candidate lists for swapOpt\n    for(int i=0;i<M;i++){\n        vector<pair<int,int>> sc;\n        for(int j=0;j<M;j++)if(j!=i)sc.push_back({(int)EV[i][j]+(int)EV[j][i],j});\n        sort(sc.rbegin(),sc.rend());\n        for(int k=0;k<CL_K;k++)cands_cl[i][k]=sc[k].second;\n    }\n}\nint permCS(const vector<int>&p){int s=0;for(int i=1;i<(int)p.size();i++)s+=EV[p[i-1]][p[i]];return s;}\nvoid rebuildPos(const vector<int>&p){for(int i=0;i<(int)p.size();i++)pos_of[p[i]]=i;}\nvector<int> greedyP(int s){vector<bool> used(M,false);vector<int> p;p.reserve(M);p.push_back(s);used[s]=true;while((int)p.size()<M){int last=p.back(),best=-1,bcs=INT_MIN;for(int j=0;j<M;j++)if(!used[j]&&EV[last][j]>bcs){bcs=EV[last][j];best=j;}p.push_back(best);used[best]=true;}return p;}\nint swapCG(const vector<int>&p,int i,int j){int m=p.size(),a=p[i],b=p[j],cg=0;if(i>0)cg+=EV[p[i-1]][b]-EV[p[i-1]][a];if(j<m-1)cg+=EV[a][p[j+1]]-EV[b][p[j+1]];if(j==i+1)cg+=EV[b][a]-EV[a][b];else{if(i<m-1)cg+=EV[b][p[i+1]]-EV[a][p[i+1]];if(j>0)cg+=EV[p[j-1]][a]-EV[p[j-1]][b];}return cg;}\nbool swapOpt(vector<int>&p){\n    int m=p.size(),bg=0,bi=-1,bj=-1;\n    for(int i=0;i<m;i++){\n        int pi=p[i];\n        for(int ck=0;ck<CL_K;ck++){\n            int j=pos_of[cands_cl[pi][ck]];\n            if(j==i)continue;\n            int ii=min(i,j),jj=max(i,j);\n            int g=swapCG(p,ii,jj);\n            if(g>bg){bg=g;bi=ii;bj=jj;}\n        }\n    }\n    if(bi==-1)return false;\n    pos_of[p[bi]]=bj;pos_of[p[bj]]=bi;\n    swap(p[bi],p[bj]);return true;}\nbool orOpt(vector<int>&p){\n    int m=p.size(),bg=0,bk=-1,bp=-1;static int sr[200];\n    for(int k=0;k<m;k++){int x=p[k],ri=0;for(int i=0;i<m;i++)if(i!=k)sr[ri++]=p[i];\n        int lo=(k>0)?EV[p[k-1]][x]:0,ro=(k<m-1)?EV[x][p[k+1]]:0;int bo=(k>0&&k<m-1)?EV[p[k-1]][p[k+1]]:0,rc=lo+ro-bo;\n        for(int q=0;q<m;q++){int nl=(q>0)?EV[sr[q-1]][x]:0,nr=(q<m-1)?EV[x][sr[q]]:0;int nb=(q>0&&q<m-1)?EV[sr[q-1]][sr[q]]:0;int g=(nl+nr-nb)-rc;if(g>bg){bg=g;bk=k;bp=q;}}}\n    if(bk==-1)return false;\n    if(bp<=bk)rotate(p.begin()+bp,p.begin()+bk,p.begin()+bk+1);\n    else rotate(p.begin()+bk,p.begin()+bk+1,p.begin()+bp+1);\n    rebuildPos(p);return true;}\nbool revOpt(vector<int>&p){int m=p.size();if(m<2)return false;vector<int> cd(m-1),cp(m,0);for(int k=0;k<m-1;k++)cd[k]=EV[p[k+1]][p[k]]-EV[p[k]][p[k+1]];for(int k=0;k<m-1;k++)cp[k+1]=cp[k]+cd[k];int bg=0,bi=-1,bj=-1;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int g=cp[j]-cp[i];if(i>0)g+=EV[p[i-1]][p[j]]-EV[p[i-1]][p[i]];if(j<m-1)g+=EV[p[i]][p[j+1]]-EV[p[j]][p[j+1]];if(g>bg){bg=g;bi=i;bj=j;}}if(bi==-1)return false;reverse(p.begin()+bi,p.begin()+bj+1);rebuildPos(p);return true;}\nvoid localS(vector<int>&p,int maxP=1000){rebuildPos(p);bool imp=true;int pass=0;while(imp&&pass<maxP){imp=false;pass++;if(swapOpt(p))imp=true;if(orOpt(p))imp=true;if(revOpt(p))imp=true;}}\nvoid dblBridge(vector<int>&p,mt19937&rng){int m=p.size();if(m<4)return;uniform_int_distribution<int> d(1,m-1);int a,b,c;do{a=d(rng);b=d(rng);c=d(rng);}while(a==b||b==c||a==c);if(a>b)swap(a,b);if(b>c)swap(b,c);if(a>b)swap(a,b);vector<int> np;np.reserve(m);for(int i=0;i<a;i++)np.push_back(p[i]);for(int i=b;i<c;i++)np.push_back(p[i]);for(int i=a;i<b;i++)np.push_back(p[i]);for(int i=c;i<m;i++)np.push_back(p[i]);p=np;}\nstring buildStr(const vector<int>&p){string s=targets[p[0]];for(int i=1;i<(int)p.size();i++)s+=targets[p[i]].substr(ovM[p[i-1]][p[i]]);return s;}\npair<vector<pair<int,int>>,int> dpSolve(const string&s){\n    int L=s.size(),G=N*N;const int INF=1e9;vector<int> dp((L+1)*G,INF),prv((L+1)*G,-1);dp[si*N+sj]=0;\n    for(int i=0;i<L;i++){int c=s[i]-'A',base=i*G,nb=(i+1)*G;for(int p=0;p<G;p++){int val=dp[base+p];if(val==INF)continue;int r=p/N,cc=p%N;for(auto&[nr,nc]:charPos[c]){int np=nr*N+nc,cost=val+abs(r-nr)+abs(cc-nc)+1;if(cost<dp[nb+np]){dp[nb+np]=cost;prv[nb+np]=p;}}}}\n    int bc=INF,bp=-1,lb=L*G;for(int p=0;p<G;p++)if(dp[lb+p]<bc){bc=dp[lb+p];bp=p;}\n    vector<pair<int,int>> path(L);int pos=bp;for(int i=L;i>=1;i--){path[i-1]={pos/N,pos%N};pos=prv[i*G+pos];}return{path,bc};}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(nullptr);\n    auto t0=chrono::steady_clock::now();\n    auto ms=[&](){return chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now()-t0).count();};\n    cin>>N>>M>>si>>sj;\n    for(int i=0;i<N;i++){string row;cin>>row;for(int j=0;j<N;j++)charPos[row[j]-'A'].push_back({i,j});}\n    targets.resize(M);for(int i=0;i<M;i++)cin>>targets[i];\n    computeAll();\n    vector<pair<int,vector<int>>> cands;\n    for(int s=0;s<M;s++){auto p=greedyP(s);cands.push_back({permCS(p),p});}\n    sort(cands.rbegin(),cands.rend());\n    const int TOP_K=10;\n    vector<int> best;vector<pair<int,int>> bestPath;int bestT=INT_MAX;\n    for(int k=0;k<TOP_K;k++){auto p=cands[k].second;auto[path,T]=dpSolve(buildStr(p));if(T<bestT){bestT=T;best=p;bestPath=path;}}\n    localS(best);\n    auto[path2,T2]=dpSolve(buildStr(best));\n    if(T2<bestT){bestT=T2;bestPath=path2;}\n    mt19937 rng(42);\n    while(ms()<1700){\n        auto cur=best;dblBridge(cur,rng);localS(cur,15);\n        auto[curPath,curT]=dpSolve(buildStr(cur));\n        if(curT<bestT){bestT=curT;best=cur;bestPath=curPath;}\n    }\n    for(auto&[r,c]:bestPath)cout<<r<<\" \"<<c<<\"\\n\";\n    return 0;\n}","ahc030":"#include <cstdio>\n#include <cmath>\n#include <vector>\n#include <set>\n#include <algorithm>\n#include <random>\nusing namespace std;\ntypedef pair<int,int> pii;\nint main(){\n    int N,M,MAX_OPS,ops=0;double eps,coef;\n    scanf(\"%d%d%lf\",&N,&M,&eps);MAX_OPS=2*N*N;coef=1.0-2.0*eps;\n    struct Oil{int hi,hj;vector<pii>cells,pos;vector<int>rp,cp;};\n    vector<Oil>F(M);\n    for(int k=0;k<M;k++){\n        int d;scanf(\"%d\",&d);F[k].cells.resize(d);F[k].hi=F[k].hj=0;\n        for(int t=0;t<d;t++){scanf(\"%d%d\",&F[k].cells[t].first,&F[k].cells[t].second);F[k].hi=max(F[k].hi,F[k].cells[t].first);F[k].hj=max(F[k].hj,F[k].cells[t].second);}\n        F[k].rp.assign(F[k].hi+1,0);F[k].cp.assign(F[k].hj+1,0);\n        for(auto&c:F[k].cells){F[k].rp[c.first]++;F[k].cp[c.second]++;}\n        for(int di=0;di+F[k].hi<N;di++)for(int dj=0;dj+F[k].hj<N;dj++)F[k].pos.push_back({di,dj});\n    }\n    vector<vector<double>>prob(M);\n    for(int k=0;k<M;k++){int sz=(int)F[k].pos.size();prob[k].assign(sz>0?sz:1,sz>0?1.0/sz:1.0);}\n    vector<vector<int>>drld(N,vector<int>(N,-1));\n    vector<double>robs(N,0),cobs(N,0);int nrr=0,nrc=0;\n    auto qdiv=[&](const vector<pii>&c)->double{ops++;printf(\"q %d\",(int)c.size());for(auto&p:c)printf(\" %d %d\",p.first,p.second);printf(\"\\n\");fflush(stdout);int v;scanf(\"%d\",&v);return(double)v;};\n    auto qdrl=[&](int i,int j)->int{ops++;printf(\"q 1 %d %d\\n\",i,j);fflush(stdout);int v;scanf(\"%d\",&v);drld[i][j]=v;return v;};\n    auto qans=[&](const vector<pii>&oil)->bool{ops++;printf(\"a %d\",(int)oil.size());for(auto&p:oil)printf(\" %d %d\",p.first,p.second);printf(\"\\n\");fflush(stdout);int r;scanf(\"%d\",&r);return r==1;};\n    auto run_mf=[&](int nit){\n        if(!nrr&&!nrc)return;\n        double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n        vector<double>tmr(N,0),tmc(N,0);\n        for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(int r=0;r<=F[k].hi;r++)tmr[di+r]+=pp*F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)tmc[dj+c2]+=pp*F[k].cp[c2];}}\n        for(int it=0;it<nit;it++)for(int k=0;k<M;k++){\n            int np=(int)F[k].pos.size();if(!np)continue;\n            vector<double>kmr(N,0),kmc(N,0);\n            for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)kmc[dj+c2]+=pp*F[k].cp[c2];}\n            for(int i=0;i<N;i++)tmr[i]-=kmr[i];for(int j=0;j<N;j++)tmc[j]-=kmc[j];\n            vector<vector<double>>drow(N,vector<double>(F[k].hi+1,0)),dcol(N,vector<double>(F[k].hj+1,0));\n            for(int i=0;i<N;i++){double be=(double)nrr*(N*eps+tmr[i]*coef),bd=robs[i]-be;for(int r=0;r<=F[k].hi;r++){double e=(double)nrr*(N*eps+(F[k].rp[r]+tmr[i])*coef),d=robs[i]-e;drow[i][r]=(-d*d+bd*bd)/(2*vr);}}\n            for(int j=0;j<N;j++){double be=(double)nrc*(N*eps+tmc[j]*coef),bd=cobs[j]-be;for(int c2=0;c2<=F[k].hj;c2++){double e=(double)nrc*(N*eps+(F[k].cp[c2]+tmc[j])*coef),d=cobs[j]-e;dcol[j][c2]=(-d*d+bd*bd)/(2*vc);}}\n            vector<double>op2=prob[k],ll(np,0.0);double mx=-1e300;\n            for(int p=0;p<np;p++){int di=F[k].pos[p].first,dj=F[k].pos[p].second;double lp=0;for(int r=0;r<=F[k].hi;r++)lp+=drow[di+r][r];for(int c2=0;c2<=F[k].hj;c2++)lp+=dcol[dj+c2][c2];ll[p]=lp;if(lp>mx)mx=lp;}\n            double s=0;for(int p=0;p<np;p++){prob[k][p]=exp(ll[p]-mx);s+=prob[k][p];}\n            if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;else prob[k]=op2;\n            fill(kmr.begin(),kmr.end(),0);fill(kmc.begin(),kmc.end(),0);\n            for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(int r=0;r<=F[k].hi;r++)kmr[di+r]+=pp*F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)kmc[dj+c2]+=pp*F[k].cp[c2];}\n            for(int i=0;i<N;i++)tmr[i]+=kmr[i];for(int j=0;j<N;j++)tmc[j]+=kmc[j];\n        }\n    };\n    auto apply_hard=[&](){\n        for(int k=0;k<M;k++){int np=(int)F[k].pos.size();bool ch=false;\n            for(int p=0;p<np;p++){if(prob[k][p]<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells){if(drld[di+c.first][dj+c.second]==0){prob[k][p]=0;ch=true;break;}}}\n            if(ch){double s=0;for(double pp:prob[k])s+=pp;if(s>1e-15)for(double&pp:prob[k])pp/=s;else fill(prob[k].begin(),prob[k].end(),1.0/max(1,(int)prob[k].size()));}\n        }\n    };\n    auto get_oil=[&]()->vector<vector<double>>{\n        vector<vector<double>>noc(N,vector<double>(N,1.0));\n        for(int k=0;k<M;k++){vector<vector<double>>cvk(N,vector<double>(N,0.0));int np=(int)F[k].pos.size();for(int p=0;p<np;p++){double pp=prob[k][p];if(pp<1e-12)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells)cvk[di+c.first][dj+c.second]+=pp;}for(int i=0;i<N;i++)for(int j=0;j<N;j++)noc[i][j]*=max(0.0,1.0-cvk[i][j]);}\n        vector<vector<double>>op(N,vector<double>(N,0));for(int i=0;i<N;i++)for(int j=0;j<N;j++)op[i][j]=1-noc[i][j];return op;\n    };\n    auto make_g=[&](const vector<vector<double>>&op,double thr=0.5)->vector<pii>{\n        vector<pii>r;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(drld[i][j]>0||(drld[i][j]<0&&op[i][j]>thr))r.push_back({i,j});return r;\n    };\n    auto shape_q=[&](int k)->bool{\n        if(ops>=MAX_OPS-5)return false;int np=(int)F[k].pos.size();if(!np)return false;\n        int p1=0;for(int p=1;p<np;p++)if(prob[k][p]>prob[k][p1])p1=p;\n        if(prob[k][p1]>0.98)return false;\n        int p2=-1;for(int p=0;p<np;p++)if(p!=p1&&(p2<0||prob[k][p]>prob[k][p2]))p2=p;\n        int di1=F[k].pos[p1].first,dj1=F[k].pos[p1].second;\n        set<pii>Ss;\n        if(p2>=0){set<pii>c2;int di2=F[k].pos[p2].first,dj2=F[k].pos[p2].second;for(auto&c:F[k].cells)c2.insert({di2+c.first,dj2+c.second});for(auto&c:F[k].cells){pii cc={di1+c.first,dj1+c.second};if(cc.first>=0&&cc.first<N&&cc.second>=0&&cc.second<N&&!c2.count(cc))Ss.insert(cc);}}\n        if((int)Ss.size()<2){Ss.clear();for(auto&c:F[k].cells){pii cc={di1+c.first,dj1+c.second};if(cc.first>=0&&cc.first<N&&cc.second>=0&&cc.second<N)Ss.insert(cc);}}\n        if((int)Ss.size()<2)return false;\n        vector<pii>S(Ss.begin(),Ss.end());\n        vector<char>Sm(N*N,0);for(auto&p:S)Sm[p.first*N+p.second]=1;\n        vector<int>ovl(np,0);\n        for(int p=0;p<np;p++){int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells){int i=di+c.first,j=dj+c.second;if(i>=0&&i<N&&j>=0&&j<N&&Sm[i*N+j])ovl[p]++;}}\n        double omega=0;\n        for(int m=0;m<M;m++){if(m==k)continue;for(int p=0;p<(int)F[m].pos.size();p++){double pp=prob[m][p];if(pp<1e-12)continue;int di=F[m].pos[p].first,dj=F[m].pos[p].second;for(auto&c:F[m].cells){int i=di+c.first,j=dj+c.second;if(i>=0&&i<N&&j>=0&&j<N&&Sm[i*N+j])omega+=pp;}}}\n        double y=qdiv(S),sz=(double)S.size(),vq=max(1e-9,sz*eps*(1-eps));\n        double mx2=-1e300;vector<double>ll2(np);\n        for(int p=0;p<np;p++){double mu=sz*eps+((double)ovl[p]+omega)*coef,d=y-mu;ll2[p]=-d*d/(2*vq);if(ll2[p]>mx2)mx2=ll2[p];}\n        if(mx2>-1e290){double s=0;for(int p=0;p<np;p++){prob[k][p]*=(ll2[p]>mx2-500)?exp(ll2[p]-mx2):0.0;s+=prob[k][p];}if(s>1e-15)for(int p=0;p<np;p++)prob[k][p]/=s;else fill(prob[k].begin(),prob[k].end(),1.0/np);}\n        return true;\n    };\n    auto entropy=[&](int k)->double{double H=0;for(double p:prob[k])if(p>1e-12)H-=p*log(p);return H;};\n    auto find_best=[&](int nr2,int nit)->vector<int>{\n        if(!nrr&&!nrc){vector<int>st(M);for(int k=0;k<M;k++){int p1=0;for(int p=1;p<(int)F[k].pos.size();p++)if(prob[k][p]>prob[k][p1])p1=p;st[k]=p1;}return st;}\n        double vr=max(1e-9,(double)nrr*N*eps*(1-eps)),vc=max(1e-9,(double)nrc*N*eps*(1-eps));\n        auto cE=[&](const vector<double>&er,const vector<double>&ec)->double{\n            double E=0;for(int i=0;i<N;i++){double d=robs[i]-nrr*(N*eps+er[i]*coef);E+=d*d/(2*vr);}for(int j=0;j<N;j++){double d=cobs[j]-nrc*(N*eps+ec[j]*coef);E+=d*d/(2*vc);}return E;\n        };\n        vector<vector<int>>vps(M);\n        for(int k=0;k<M;k++){for(int p=0;p<(int)F[k].pos.size();p++){int di=F[k].pos[p].first,dj=F[k].pos[p].second;bool ok=true;for(auto&c:F[k].cells)if(drld[di+c.first][dj+c.second]==0){ok=false;break;}if(ok)vps[k].push_back(p);}if(vps[k].empty())for(int p=0;p<(int)F[k].pos.size();p++)vps[k].push_back(p);}\n        mt19937 rng(42);uniform_real_distribution<double>ur(0,1);\n        vector<int>gbest(M,0);double gbest_E=1e300;\n        for(int restart=0;restart<nr2;restart++){\n            vector<int>state(M);\n            if(restart==0){for(int k=0;k<M;k++){int p1=0;for(int p=1;p<(int)F[k].pos.size();p++)if(prob[k][p]>prob[k][p1])p1=p;state[k]=p1;}}\n            else{for(int k=0;k<M;k++){auto&vp=vps[k];int nv=(int)vp.size();double r2=ur(rng),cum=0;state[k]=vp[nv-1];for(int pi=0;pi<nv;pi++){cum+=prob[k][vp[pi]];if(cum>=r2){state[k]=vp[pi];break;}}}}\n            for(int k=0;k<M;k++){auto&vp=vps[k];bool ok=false;for(int p:vp)if(p==state[k])ok=true;if(!ok&&!vp.empty())state[k]=vp[0];}\n            vector<double>er(N,0),ec(N,0);\n            for(int k=0;k<M;k++){int di=F[k].pos[state[k]].first,dj=F[k].pos[state[k]].second;for(int r=0;r<=F[k].hi;r++)er[di+r]+=F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)ec[dj+c2]+=F[k].cp[c2];}\n            double cur_E=cE(er,ec);vector<int>best=state;double best_E=cur_E;\n            for(int it=0;it<nit;it++){\n                if(it%10000==0){fill(er.begin(),er.end(),0);fill(ec.begin(),ec.end(),0);for(int k=0;k<M;k++){int di=F[k].pos[state[k]].first,dj=F[k].pos[state[k]].second;for(int r=0;r<=F[k].hi;r++)er[di+r]+=F[k].rp[r];for(int c2=0;c2<=F[k].hj;c2++)ec[dj+c2]+=F[k].cp[c2];}cur_E=cE(er,ec);}\n                double T=5.0*exp(-6.0*it/nit)+0.01;\n                int k=rng()%M;auto&vp=vps[k];int nv=(int)vp.size();if(nv<=1)continue;\n                int new_p=vp[rng()%nv],old_p=state[k];if(new_p==old_p)continue;\n                int doi=F[k].pos[old_p].first,doj=F[k].pos[old_p].second,dni=F[k].pos[new_p].first,dnj=F[k].pos[new_p].second;\n                for(int r=0;r<=F[k].hi;r++){er[doi+r]-=F[k].rp[r];er[dni+r]+=F[k].rp[r];}\n                for(int c2=0;c2<=F[k].hj;c2++){ec[doj+c2]-=F[k].cp[c2];ec[dnj+c2]+=F[k].cp[c2];}\n                double new_E=cE(er,ec),dE=new_E-cur_E;\n                bool accept=(dE<=0)||ur(rng)<exp(-dE/T);\n                if(accept){state[k]=new_p;cur_E=new_E;if(cur_E<best_E){best_E=cur_E;best=state;}}\n                else{for(int r=0;r<=F[k].hi;r++){er[doi+r]+=F[k].rp[r];er[dni+r]-=F[k].rp[r];}for(int c2=0;c2<=F[k].hj;c2++){ec[doj+c2]+=F[k].cp[c2];ec[dnj+c2]-=F[k].cp[c2];}}\n            }\n            if(best_E<gbest_E){gbest_E=best_E;gbest=best;}\n        }\n        return gbest;\n    };\n    auto sa_guess=[&](const vector<int>&state)->vector<pii>{\n        set<pii>oil_set;\n        for(int k=0;k<M;k++){int di=F[k].pos[state[k]].first,dj=F[k].pos[state[k]].second;for(auto&c:F[k].cells){int i=di+c.first,j=dj+c.second;if(drld[i][j]!=0)oil_set.insert({i,j});}}\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(drld[i][j]>0)oil_set.insert({i,j});\n        return vector<pii>(oil_set.begin(),oil_set.end());\n    };\n    // Phase 1: Row/col queries - KEY CHANGE: adaptive n_reps for large N with high eps\n    int ideal_nr = eps>=0.15 ? min(5,1+N/5) : eps>=0.08 ? 2 : 1;\n    int max_nr = max(1,(MAX_OPS-N*N-20-5)/(2*N));\n    int nr = min(max_nr, ideal_nr);\n    for(int rep=0;rep<nr;rep++){\n        for(int i=0;i<N;i++){vector<pii>c;for(int j=0;j<N;j++)c.push_back({i,j});robs[i]+=qdiv(c);}nrr++;\n        for(int j=0;j<N;j++){vector<pii>c;for(int i=0;i<N;i++)c.push_back({i,j});cobs[j]+=qdiv(c);}nrc++;\n    }\n    run_mf(200);\n    // Phase 2: Shape queries - FIXED: properly iterate over all uncertain fields\n    {\n        int qb=min(40,max(0,MAX_OPS-ops-N*N-5));\n        for(int q=0;q<qb&&ops<MAX_OPS-N*N-3;q++){\n            int bk=-1;double be=0;\n            for(int k=0;k<M;k++){\n                int p1=0;for(int p=1;p<(int)F[k].pos.size();p++)if(prob[k][p]>prob[k][p1])p1=p;\n                if(prob[k][p1]>0.98)continue;\n                double h=entropy(k);if(h>be){be=h;bk=k;}\n            }\n            if(bk<0||be<0.05)break;\n            shape_q(bk);run_mf(10);\n        }\n    }\n    apply_hard();run_mf(100);\n    // Phase 3: SA guess + MF fallback\n    {\n        auto bs=find_best(5,200000);\n        {auto g=sa_guess(bs);if(ops<MAX_OPS&&qans(g))return 0;}\n        {auto op=get_oil();auto g=make_g(op);if(ops<MAX_OPS&&qans(g))return 0;}\n    }\n    // Phase 4: Targeted drilling + MF + SA guesses\n    {\n        auto op=get_oil();\n        while(ops<MAX_OPS-4){\n            int bi=-1,bj=-1;double bu=0;\n            for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(drld[i][j]>=0)continue;double u=min(op[i][j],1.0-op[i][j]);if(u>bu){bu=u;bi=i;bj=j;}}\n            if(bi<0||bu<0.1)break;\n            qdrl(bi,bj);\n            if(drld[bi][bj]==0){for(int k=0;k<M;k++){int np=(int)F[k].pos.size();for(int p=0;p<np;p++){if(prob[k][p]<1e-15)continue;int di=F[k].pos[p].first,dj=F[k].pos[p].second;for(auto&c:F[k].cells)if(di+c.first==bi&&dj+c.second==bj){prob[k][p]=0;break;}}double s=0;for(double pp:prob[k])s+=pp;if(s>1e-15)for(double&pp:prob[k])pp/=s;else fill(prob[k].begin(),prob[k].end(),1.0/max(1,(int)prob[k].size()));}}\n            run_mf(5);op=get_oil();\n        }\n        apply_hard();run_mf(20);\n        {auto g=make_g(get_oil());if(ops<MAX_OPS&&qans(g))return 0;}\n        {auto bs=find_best(3,80000);auto g=sa_guess(bs);if(ops<MAX_OPS&&qans(g))return 0;}\n    }\n    // Phase 5: Drill all remaining + final guess\n    for(int i=0;i<N&&ops<MAX_OPS-2;i++)for(int j=0;j<N&&ops<MAX_OPS-2;j++)if(drld[i][j]<0)qdrl(i,j);\n    if(ops<MAX_OPS){auto op=get_oil();auto g=make_g(op);qans(g);}\n    return 0;\n}","ahc031":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\ntypedef tuple<ll,int,int> T3;\nint W,D,N;\nvector<vector<int>>a;\nstruct CS{\nint s0,st,nc,cw;\nint r(int d,int k)const{return a[d][s0+k*st];}\nvector<int>ch(const vector<int>&days)const{\n    vector<int>h(nc,1);\n    auto be=[&](int k,int cur)->ll{ll b=0;for(int d:days){int df=r(d,k)-cur*cw;if(df>0)b+=(ll)min(cw,df);}return b;};\n    priority_queue<T3>pq;\n    for(int k=0;k<nc;k++){ll b=be(k,1);if(b>0)pq.push({b,k,1});}\n    for(int rem=W-nc;rem>0&&!pq.empty();){auto[b,kk,cu]=pq.top();pq.pop();if(b<=0)break;h[kk]++;rem--;ll nb=be(kk,h[kk]);if(nb>0)pq.push({nb,kk,h[kk]});}\n    sort(h.begin(),h.end());\n    {int s=0;for(int x:h)s+=x;if(s<W&&!h.empty())h.back()+=(W-s);}\n    return h;\n}\nll ac(int d,const vector<int>&h)const{ll c=0;for(int k=0;k<nc;k++){int df=r(d,k)-h[k]*cw;if(df>0)c+=(ll)df*100;}return c;}\nset<int>gb(const vector<int>&arr)const{set<int>S;int y=0;for(int i=0;i+1<(int)arr.size();i++){y+=arr[i];S.insert(y);}return S;}\nll bd(const set<int>&A,const set<int>&B)const{ll c=0;for(int x:A)if(!B.count(x))c++;for(int x:B)if(!A.count(x))c++;return c*(ll)cw;}\nvector<int>ag(const vector<int>&h,const set<int>&t)const{\n    vector<int>tg(t.begin(),t.end());multiset<int>av(h.begin(),h.end());\n    vector<int>arr;int S=0,j=0,nt=(int)tg.size();\n    while(!av.empty()){while(j<nt&&S>=tg[j])j++;if(j>=nt){for(int x:av)arr.push_back(x);break;}\n        int nd=tg[j]-S;auto it=av.find(nd);\n        if(it!=av.end()){arr.push_back(nd);S+=nd;av.erase(it);j++;}\n        else{auto ub=av.upper_bound(nd);\n            if(ub!=av.begin()){--ub;arr.push_back(*ub);S+=*ub;av.erase(ub);while(j<nt&&S>=tg[j])j++;}\n            else{it=av.begin();arr.push_back(*it);S+=*it;av.erase(it);while(j<nt&&S>=tg[j])j++;}\n        }\n    }return arr;\n}\nvector<int>hc(vector<int>arr,const set<int>&t)const{\n    if(t.empty()||(int)arr.size()<=1)return arr;\n    int n2=arr.size();vector<int>ps(n2+1,0);for(int i=0;i<n2;i++)ps[i+1]=ps[i]+arr[i];\n    bool im=true;while(im){im=false;\n        for(int i=0;i<n2-1;i++)for(int j=i+1;j<n2;j++){if(arr[i]==arr[j])continue;\n            int dl=arr[j]-arr[i],g=0;for(int k=i+1;k<=j;k++){g-=(int)t.count(ps[k]);g+=(int)t.count(ps[k]+dl);}\n            if(g>0){swap(arr[i],arr[j]);for(int k=i+1;k<=j;k++)ps[k]+=dl;im=true;}\n        }}return arr;\n}\npair<ll,vector<vector<int>>>solve()const{\n    vector<vector<int>>C;vector<int>ai(D);iota(ai.begin(),ai.end(),0);\n    C.push_back(ch(ai));\n    for(int d=0;d<D;d++)C.push_back(ch({d}));\n    for(int d=0;d+1<D;d++)C.push_back(ch({d,d+1}));\n    for(int d=0;d+2<D;d++)C.push_back(ch({d,d+1,d+2}));\n    for(int d=0;d+3<D;d++)C.push_back(ch({d,d+1,d+2,d+3}));\n    int NC=(int)C.size();\n    vector<set<int>>SS(NC);for(int L=0;L<NC;L++)SS[L]=gb(C[L]);\n    vector<vector<ll>>AR(D,vector<ll>(NC));for(int d=0;d<D;d++)for(int L=0;L<NC;L++)AR[d][L]=ac(d,C[L]);\n    vector<vector<ll>>pcg(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++){if(L1==L2)continue;pcg[L1][L2]=bd(SS[L1],gb(ag(C[L2],SS[L1])));}\n    vector<vector<ll>>pcgt(NC,vector<ll>(NC,0));\n    for(int L1=0;L1<NC;L1++)for(int L2=0;L2<NC;L2++)pcgt[L2][L1]=pcg[L1][L2];\n    vector<ll>zr(NC,0LL);\n    const ll INF=2e18;\n    vector<vector<ll>>dp(D,vector<ll>(NC,INF));vector<vector<int>>frm(D,vector<int>(NC,-1));\n    for(int L=0;L<NC;L++)dp[0][L]=AR[0][L];\n    for(int d=1;d<D;d++)for(int L=0;L<NC;L++)for(int pL=0;pL<NC;pL++){if(dp[d-1][pL]==INF)continue;ll cv=dp[d-1][pL]+pcg[pL][L]+AR[d][L];if(cv<dp[d][L]){dp[d][L]=cv;frm[d][L]=pL;}}\n    int bL=(int)(min_element(dp[D-1].begin(),dp[D-1].end())-dp[D-1].begin());\n    vector<int>dpseq(D);dpseq[D-1]=bL;for(int d=D-2;d>=0;d--)dpseq[d]=frm[d+1][dpseq[d+1]];\n    // DLS with configurable max iterations\n    auto dls=[&](vector<int>s,int mi=80)->vector<int>{\n        vector<ll>dc(D);\n        for(int d=0;d<D;d++){dc[d]=AR[d][s[d]];if(d>0&&s[d]!=s[d-1])dc[d]+=pcg[s[d-1]][s[d]];}\n        auto step=[&](int d)->bool{\n            int bL2=s[d];ll bDl=0;ll od=dc[d],od1=(d+1<D?dc[d+1]:0LL);\n            const ll*rp=(d>0)?pcg[s[d-1]].data():zr.data();\n            const ll*rt=(d+1<D)?pcgt[s[d+1]].data():zr.data();\n            ll b21=(d+1<D)?AR[d+1][s[d+1]]:0LL;const ll*ra=AR[d].data();\n            for(int L=0;L<NC;L++){ll dl=(ra[L]+rp[L]+b21+rt[L])-(od+od1);if(dl<bDl){bDl=dl;bL2=L;}}\n            if(bL2==s[d])return false;\n            s[d]=bL2;\n            dc[d]=AR[d][s[d]]+(d>0&&s[d]!=s[d-1]?pcg[s[d-1]][s[d]]:0LL);\n            if(d+1<D)dc[d+1]=AR[d+1][s[d+1]]+(s[d+1]!=s[d]?pcg[s[d]][s[d+1]]:0LL);\n            return true;\n        };\n        for(int it=0;it<mi;it++){bool any=false;\n            for(int d=0;d<D;d++)any|=step(d);\n            for(int d=D-1;d>=0;d--)any|=step(d);\n            if(!any)break;}\n        return s;\n    };\n    auto sa2phase=[&](vector<int>s,int sid)->vector<int>{\n        vector<ll>dc(D);\n        for(int d=0;d<D;d++){dc[d]=AR[d][s[d]];if(d>0&&s[d]!=s[d-1])dc[d]+=pcg[s[d-1]][s[d]];}\n        ll total=0;for(auto x:dc)total+=x;\n        ll best_total=total;vector<int>best_s=s;\n        uint64_t rs=(uint64_t)(nc+1)*(uint64_t)(cw+1)*(uint64_t)(D*NC+sid*7+1)+42;\n        auto rng=[&]()->uint64_t{rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;};\n        auto do_sa=[&](double T0,double TF,int NS){\n            const double dec=pow(TF/T0,1.0/NS);double T=T0;\n            for(int step=0;step<NS;step++){\n                T*=dec;\n                int d=(int)(rng()%(uint64_t)D);int L=(int)(rng()%(uint64_t)NC);if(L==s[d])continue;\n                ll od=dc[d],od1=(d+1<D?dc[d+1]:0LL);\n                ll nd2=AR[d][L]+(d>0?pcg[s[d-1]][L]:0LL);\n                ll nd21=(d+1<D)?AR[d+1][s[d+1]]+(s[d+1]!=L?pcg[L][s[d+1]]:0LL):0LL;\n                ll delta=(nd2+nd21)-(od+od1);\n                bool acc=(delta<=0);\n                if(!acc&&T>0.01&&(double)delta<5.0*T)\n                    acc=((double)(rng()>>11)*(1.0/(1LL<<53))<exp(-(double)delta/T));\n                if(acc){s[d]=L;total+=delta;dc[d]=nd2;if(d+1<D)dc[d+1]=nd21;\n                    if(total<best_total){best_total=total;best_s=s;}}\n            }\n        };\n        do_sa(100000.0,100.0,100000);\n        s=best_s;\n        for(int d=0;d<D;d++){dc[d]=AR[d][s[d]];if(d>0&&s[d]!=s[d-1])dc[d]+=pcg[s[d-1]][s[d]];}\n        total=best_total;\n        do_sa(10000.0,0.5,200000);\n        return best_s;\n    };\n    auto pcg_cost=[&](const vector<int>&sv)->ll{\n        ll t=0;for(int d=0;d<D;d++){t+=AR[d][sv[d]];if(d>0&&sv[d]!=sv[d-1])t+=pcg[sv[d-1]][sv[d]];}return t;\n    };\n    auto fs=[&](const vector<int>&s)->pair<ll,vector<vector<int>>>{\n        vector<vector<int>>arrs(D);ll cost=0;arrs[0]=C[s[0]];cost+=AR[0][s[0]];set<int>cur=gb(arrs[0]);\n        for(int d=1;d<D;d++){if(s[d]==s[d-1]){arrs[d]=arrs[d-1];cost+=AR[d][s[d]];}\n            else{arrs[d]=hc(ag(C[s[d]],cur),cur);set<int>ns=gb(arrs[d]);cost+=AR[d][s[d]]+bd(cur,ns);cur=ns;}}\n        return{cost,arrs};\n    };\n    auto slow_dls=[&](vector<int>s,int ni)->vector<int>{\n        vector<set<int>>Sv(D);vector<ll>dc(D);\n        {set<int>prev;for(int d=0;d<D;d++){\n            set<int>pv=prev;\n            if(d>0&&s[d]==s[d-1]){Sv[d]=Sv[d-1];dc[d]=AR[d][s[d]];}\n            else{auto arr=ag(C[s[d]],pv);Sv[d]=gb(arr);dc[d]=AR[d][s[d]]+(d>0?bd(pv,Sv[d]):0LL);}\n            prev=Sv[d];}}\n        for(int it=0;it<ni;it++){bool any=false;\n            for(int d=0;d<D;d++){int bL2=s[d];ll bDl=0;ll od=dc[d],od1=(d+1<D?dc[d+1]:0LL);\n                set<int>pv=(d>0)?Sv[d-1]:set<int>();\n                for(int L=0;L<NC;L++){if(L==s[d])continue;\n                    auto na=ag(C[L],pv);auto nSd=gb(na);\n                    ll nd2=AR[d][L]+(d>0?bd(pv,nSd):0LL);ll nd21=0;\n                    if(d+1<D){nd21=AR[d+1][s[d+1]];if(s[d+1]!=L)nd21+=bd(nSd,gb(ag(C[s[d+1]],nSd)));}\n                    ll dl=(nd2+nd21)-(od+od1);if(dl<bDl){bDl=dl;bL2=L;}}\n                if(bL2!=s[d]){s[d]=bL2;auto na=ag(C[s[d]],pv);Sv[d]=gb(na);\n                    dc[d]=AR[d][s[d]]+(d>0?bd(pv,Sv[d]):0LL);\n                    if(d+1<D){set<int>pv2=Sv[d];\n                        if(s[d+1]==s[d]){Sv[d+1]=Sv[d];dc[d+1]=AR[d+1][s[d+1]];}\n                        else{auto na1=ag(C[s[d+1]],pv2);Sv[d+1]=gb(na1);dc[d+1]=AR[d+1][s[d+1]]+bd(pv2,Sv[d+1]);}}\n                    any=true;}}\n            if(!any)break;}\n        return s;\n    };\n    auto run=[&](vector<int>sq,int sid)->pair<ll,vector<vector<int>>>{\n        auto s0=dls(sq,80);auto[c0,a0]=fs(s0);\n        auto bsa1=sa2phase(s0,sid);\n        auto bsa2=sa2phase(s0,sid+4);\n        auto best_sa=(pcg_cost(bsa1)<=pcg_cost(bsa2))?bsa1:bsa2;\n        auto s1=dls(best_sa,80);auto[c1,a1]=fs(s1);\n        if(c1<c0)return{c1,a1};return{c0,a0};\n    };\n    auto[c1,a1]=run(dpseq,0);\n    vector<int>gseq(D);{int L0=0;for(int L=0;L<NC;L++)if(AR[0][L]<AR[0][L0])L0=L;\n        gseq[0]=L0;for(int d=1;d<D;d++){ll bc=INF;int bL2=gseq[d-1];\n            for(int L=0;L<NC;L++){ll cv=AR[d][L]+(L!=gseq[d-1]?pcg[gseq[d-1]][L]:0LL);if(cv<bc){bc=cv;bL2=L;}}gseq[d]=bL2;}}\n    auto[c2,a2]=run(gseq,1);\n    vector<int>apseq(D);for(int d=0;d<D;d++)apseq[d]=d+1;\n    auto[c3,a3]=run(apseq,2);\n    vector<int>fseq(D,0);\n    auto[c4,a4]=run(fseq,3);\n    auto[cs,as_]=fs(slow_dls(dpseq,10));\n    // Best from structured runs\n    ll bc2=min({c1,c2,c3,c4,cs});\n    pair<ll,vector<vector<int>>>best_r;\n    if(bc2==c1)best_r={c1,a1};else if(bc2==c2)best_r={c2,a2};else if(bc2==c3)best_r={c3,a3};\n    else if(bc2==c4)best_r={c4,a4};else best_r={cs,as_};\n    // Random DLS restarts: explore completely different basins of attraction\n    {\n        uint64_t rr=(uint64_t)(nc+1)*(uint64_t)(cw+1)*(uint64_t)(D+NC+1)*98765ULL+12345ULL;\n        auto rnxt=[&]()->uint64_t{rr^=rr<<13;rr^=rr>>7;rr^=rr<<17;return rr;};\n        for(int tr=0;tr<6;tr++){\n            vector<int>rs(D);for(int d=0;d<D;d++)rs[d]=(int)(rnxt()%(uint64_t)NC);\n            auto[cr,ar]=fs(dls(rs,30));\n            if(cr<best_r.first)best_r={cr,ar};\n        }\n    }\n    return best_r;\n}\n};\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>W>>D>>N;a.resize(D,vector<int>(N));\n    for(int d=0;d<D;d++)for(int k=0;k<N;k++)cin>>a[d][k];\n    ll best=2e18;int bK=1;\n    vector<pair<ll,vector<vector<int>>>>bcr;\n    for(int K=1;K<=N;K++){\n        if(N%K!=0||W%K!=0)continue;\n        int npc=N/K,cw=W/K;\n        if(npc==1){\n            ll tc=0;vector<pair<ll,vector<vector<int>>>>cr(K);\n            for(int c=0;c<K;c++){ll cc=0;for(int d=0;d<D;d++){int df=a[d][c]-cw*W;if(df>0)cc+=(ll)df*100;}\n                cr[c]={cc,vector<vector<int>>(D,vector<int>(1,W))};tc+=cc;}\n            if(tc<best){best=tc;bK=K;bcr=cr;}continue;}\n        if(K>10)continue;\n        vector<pair<ll,vector<vector<int>>>>cr(K);ll tc=0;\n        for(int c=0;c<K;c++){CS cs{c,K,npc,cw};cr[c]=cs.solve();tc+=cr[c].first;}\n        if(tc<best){best=tc;bK=K;bcr=cr;}\n    }\n    int npc=N/bK,cw=W/bK;\n    for(int d=0;d<D;d++){\n        vector<array<int,4>>rects(N);\n        for(int c=0;c<bK;c++){int x0=c*cw,x1=x0+cw;const auto&arr=bcr[c].second[d];\n            vector<int>y(npc+1);y[0]=0;for(int j=0;j<npc;j++)y[j+1]=y[j]+arr[j];\n            vector<pair<int,int>>strips(npc);for(int j=0;j<npc;j++)strips[j]={arr[j],y[j]};\n            sort(strips.begin(),strips.end());\n            for(int j=0;j<npc;j++){int k=c+j*bK;rects[k]={strips[j].second,x0,strips[j].second+strips[j].first,x1};}\n        }\n        for(int k=0;k<N;k++)cout<<rects[k][0]<<\" \"<<rects[k][1]<<\" \"<<rects[k][2]<<\" \"<<rects[k][3]<<\"\\n\";\n    }\n    return 0;\n}","ahc032":"#include <bits/stdc++.h>\nusing namespace std;using namespace chrono;\nconstexpr long long MOD=998244353;\nint N,M,K;long long sv[20][3][3],b[9][9],cur_score;\nlong long base_b[9][9];long long base_score;\ninline long long add_mod(long long a,long long c){long long s=a+c;return s>=MOD?s-MOD:s;}\ninline long long sub_mod(long long a,long long c){return a>=c?a-c:a-c+MOD;}\nvoid apply_s(int m,int p,int q){for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long&c=b[p+i][q+j];long long nv=add_mod(c,sv[m][i][j]);cur_score+=nv-c;c=nv;}}\nvoid undo_s(int m,int p,int q){for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long&c=b[p+i][q+j];long long nv=sub_mod(c,sv[m][i][j]);cur_score+=nv-c;c=nv;}}\nstruct Op{int m,p,q;};\nconst int TK=17;\nlong long gdtv[3][3],gdts,gdtbest;int gdbs[9],gdcs[9],gdord[20],gdfl;bool gdto;steady_clock::time_point gddl;\nvoid tile_dfs(int dep,int mi){\n    if(gdto)return;\n    if(dep==9){if(++gdfl%200000==0&&steady_clock::now()>=gddl){gdto=true;return;}if(gdts>gdtbest){gdtbest=gdts;for(int d=0;d<9;d++)gdbs[d]=gdord[gdcs[d]];}return;}\n    long long ub=gdts;for(int i=0;i<3;i++)for(int j=0;j<3;j++)ub+=(MOD-1)-gdtv[i][j];if(ub<=gdtbest)return;\n    for(int idx=mi;idx<TK;idx++){int m=gdord[idx];gdcs[dep]=idx;\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(gdtv[i][j],sv[m][i][j]);gdts+=nv-gdtv[i][j];gdtv[i][j]=nv;}\n        tile_dfs(dep+1,idx);\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=sub_mod(gdtv[i][j],sv[m][i][j]);gdts+=nv-gdtv[i][j];gdtv[i][j]=nv;}\n        if(gdto)return;}\n}\nlong long compute_tile(int s[9],long long itv[3][3]){long long ts=0,tv[3][3];for(int i=0;i<3;i++)for(int j=0;j<3;j++){tv[i][j]=itv[i][j];ts+=itv[i][j];}for(int d=0;d<9;d++)for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(tv[i][j],sv[s[d]][i][j]);ts+=nv-tv[i][j];tv[i][j]=nv;}return ts;}\nvoid global_greedy(vector<Op>&ops){\n    bool changed=true;while(changed){changed=false;\n    for(int k=0;k<(int)ops.size();k++){Op oo=ops[k];undo_s(oo.m,oo.p,oo.q);\n    long long g_old=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)g_old+=add_mod(b[oo.p+i][oo.q+j],sv[oo.m][i][j])-b[oo.p+i][oo.q+j];\n    long long bg=g_old;int bm=oo.m,bp=oo.p,bq=oo.q;\n    for(int pp=0;pp<=N-3;pp++)for(int qq=0;qq<=N-3;qq++)for(int m=0;m<M;m++){long long g=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)g+=add_mod(b[pp+i][qq+j],sv[m][i][j])-b[pp+i][qq+j];if(g>bg){bg=g;bm=m;bp=pp;bq=qq;}}\n    apply_s(bm,bp,bq);if(bm!=oo.m||bp!=oo.p||bq!=oo.q){ops[k]={bm,bp,bq};changed=true;}}}\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N>>M>>K;cur_score=0;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){cin>>b[i][j];b[i][j]%=MOD;cur_score+=b[i][j];}\n    for(int m=0;m<M;m++)for(int i=0;i<3;i++)for(int j=0;j<3;j++)cin>>sv[m][i][j];\n    memcpy(base_b,b,sizeof(b));base_score=cur_score;\n    auto t0=steady_clock::now();const long long TL_US=1850000;\n    vector<Op>ops;ops.reserve(K);\n    const int tpos[9][2]={{0,0},{0,3},{0,6},{3,0},{3,3},{3,6},{6,0},{6,3},{6,6}};\n    gdfl=0;gdto=false;gddl=t0+milliseconds(1300);\n    for(int tile=0;tile<9;tile++){\n        int p=tpos[tile][0],q=tpos[tile][1];long long itv[3][3];long long its=0;\n        for(int i=0;i<3;i++)for(int j=0;j<3;j++){itv[i][j]=b[p+i][q+j];its+=itv[i][j];}\n        long long gn[20];int ord[20];iota(ord,ord+20,0);\n        for(int m=0;m<M;m++){gn[m]=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)gn[m]+=add_mod(itv[i][j],sv[m][i][j])-itv[i][j];}\n        sort(ord,ord+20,[&](int a,int b_){return gn[a]>gn[b_];});\n        long long grtv[3][3];memcpy(grtv,itv,sizeof(itv));long long grts=its;int grs[9];\n        for(int d=0;d<9;d++){long long bg=0;int bm=0;for(int m=0;m<M;m++){long long g=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)g+=add_mod(grtv[i][j],sv[m][i][j])-grtv[i][j];if(g>bg){bg=g;bm=m;}}grs[d]=bm;for(int i=0;i<3;i++)for(int j=0;j<3;j++){long long nv=add_mod(grtv[i][j],sv[bm][i][j]);grts+=nv-grtv[i][j];grtv[i][j]=nv;}}\n        memcpy(gdtv,itv,sizeof(itv));gdts=its;gdtbest=grts;for(int d=0;d<9;d++)gdbs[d]=grs[d];for(int m=0;m<20;m++)gdord[m]=ord[m];\n        tile_dfs(0,0);\n        int best_s[9];memcpy(best_s,gdbs,sizeof(gdbs));long long best_ts=gdtbest;\n        bool imp=true;while(imp){imp=false;for(int d=0;d<9;d++){int om=best_s[d];for(int m=0;m<M;m++){if(m==om)continue;int tmp[9];memcpy(tmp,best_s,sizeof(best_s));tmp[d]=m;long long ts=compute_tile(tmp,itv);if(ts>best_ts){best_ts=ts;memcpy(best_s,tmp,sizeof(tmp));imp=true;}}}}\n        bool imp2=true;while(imp2){imp2=false;long long b2ts=best_ts;int bd1=-1,bd2=-1,bm1=-1,bm2=-1;for(int d1=0;d1<9;d1++)for(int d2=d1+1;d2<9;d2++)for(int m1=0;m1<M;m1++)for(int m2=0;m2<M;m2++){if(m1==best_s[d1]&&m2==best_s[d2])continue;int tmp[9];memcpy(tmp,best_s,sizeof(best_s));tmp[d1]=m1;tmp[d2]=m2;long long ts=compute_tile(tmp,itv);if(ts>b2ts){b2ts=ts;bd1=d1;bd2=d2;bm1=m1;bm2=m2;}}if(bd1>=0){best_ts=b2ts;best_s[bd1]=bm1;best_s[bd2]=bm2;imp2=true;}}\n        for(int d=0;d<9;d++){apply_s(best_s[d],p,q);ops.push_back({best_s[d],p,q});}\n    }\n    long long overall_best=cur_score;vector<Op>overall_best_ops=ops;\n    double T_cal=1e8;\n    {mt19937 rc(777);long long sumd=0;int cnt=0;for(int i=0;i<3000&&!ops.empty();i++){int L=ops.size(),idx=rc()%L;Op oo=ops[idx];Op no={(int)(rc()%M),(int)(rc()%(N-2)),(int)(rc()%(N-2))};long long s0=cur_score;undo_s(oo.m,oo.p,oo.q);apply_s(no.m,no.p,no.q);long long d=cur_score-s0;sumd+=(d<0?-d:d);cnt++;undo_s(no.m,no.p,no.q);apply_s(oo.m,oo.p,oo.q);}if(cnt>0)T_cal=max(1.0,(double)sumd/cnt);}\n    global_greedy(ops);\n    if(cur_score>overall_best){overall_best=cur_score;overall_best_ops=ops;}\n    mt19937 rng(42);const int POS=N-2;\n    auto rand_op=[&]()->Op{return{(int)(rng()%M),(int)(rng()%POS),(int)(rng()%POS)};};\n    double T=T_cal,T_end=max(T_cal*1e-7,1.0);\n    // Restart boost: temperature that decays with half-life 30K iters\n    double T_restart=0.0;\n    const double T_restart_init=T_cal*0.05;\n    const double T_restart_decay=pow(0.5,1.0/30000.0); // halves every 30K iters\n    long long since_improvement=0;\n    const long long RESTART_THRESHOLD=500000LL;\n    for(long long it=0;;it++){\n        if(it%50000==0){long long el=duration_cast<microseconds>(steady_clock::now()-t0).count();if(el>=TL_US-50000)break;T=T_cal*pow(T_end/T_cal,max(0.0,min(1.0,(double)el/TL_US)));}\n        T_restart*=T_restart_decay; // Decay boost\n        if(since_improvement>=RESTART_THRESHOLD){\n            memcpy(b,base_b,sizeof(b));cur_score=base_score;\n            ops=overall_best_ops;\n            for(auto&op:ops)apply_s(op.m,op.p,op.q);\n            T_restart=T_restart_init; // Fresh boost at restart\n            since_improvement=0;}\n        double T_eff=max(T,T_restart);\n        int L=ops.size();Op n1=rand_op(),o1{},o2{},n2{};int i1=-1,i2=-1,mt;\n        if(L==0){mt=0;}else{int r=rng()%10;if(L==K)mt=(r<2)?1:(r<7)?2:3;else mt=(r<2)?0:(r<3)?1:(r<7)?2:3;if(mt==3&&L<2)mt=2;}\n        if(mt==1||mt==2){i1=rng()%L;o1=ops[i1];}\n        if(mt==3){i1=rng()%L;do{i2=rng()%L;}while(i2==i1);o1=ops[i1];o2=ops[i2];n2=rand_op();}\n        long long s0=cur_score;\n        switch(mt){case 0:apply_s(n1.m,n1.p,n1.q);break;case 1:undo_s(o1.m,o1.p,o1.q);break;case 2:undo_s(o1.m,o1.p,o1.q);apply_s(n1.m,n1.p,n1.q);break;case 3:undo_s(o1.m,o1.p,o1.q);undo_s(o2.m,o2.p,o2.q);apply_s(n1.m,n1.p,n1.q);apply_s(n2.m,n2.p,n2.q);break;}\n        long long delta=cur_score-s0;bool acc=(delta>=0)||(T_eff>0.5&&(double)(rng()%1000000)<exp((double)delta/T_eff)*1e6);\n        if(acc){switch(mt){case 0:ops.push_back(n1);break;case 1:ops[i1]=ops.back();ops.pop_back();break;case 2:ops[i1]=n1;break;case 3:ops[i1]=n1;ops[i2]=n2;break;}\n            if(cur_score>overall_best){overall_best=cur_score;overall_best_ops=ops;since_improvement=0;}\n            else since_improvement++;}\n        else{switch(mt){case 0:undo_s(n1.m,n1.p,n1.q);break;case 1:apply_s(o1.m,o1.p,o1.q);break;case 2:undo_s(n1.m,n1.p,n1.q);apply_s(o1.m,o1.p,o1.q);break;case 3:undo_s(n2.m,n2.p,n2.q);undo_s(n1.m,n1.p,n1.q);apply_s(o2.m,o2.p,o2.q);apply_s(o1.m,o1.p,o1.q);break;}\n            since_improvement++;}\n    }\n    memcpy(b,base_b,sizeof(b));cur_score=base_score;\n    ops=overall_best_ops;\n    for(auto&op:ops)apply_s(op.m,op.p,op.q);\n    global_greedy(ops);\n    if(cur_score>overall_best){overall_best=cur_score;overall_best_ops=ops;}\n    cout<<overall_best_ops.size()<<'\\n';for(auto&op:overall_best_ops)cout<<op.m<<' '<<op.p<<' '<<op.q<<'\\n';\n    return 0;\n}","ahc033":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=5;\nint A[N][N],posR[N*N],posP[N*N],grid[N][N];\nint craneR,craneC;bool craneHolding;int craneContainer;\nstring result;\nint smR_[N-1],smC_[N-1];bool smH_[N-1];int smCont_[N-1];\nbool smBombed_[N-1];int smStaged_[N-1];string smResult_[N-1];\nint recvSent[N],lgPU[N],dispatchCount[N];bool done_[N*N];\nmap<int,pair<int,int>> bufPos;set<pair<int,int>> usedBufs;\ninline bool gl(){return result.size()<9900;}\nchar getSmA(int i){\n    if(smBombed_[i])return '.';if(smStaged_[i]>=N)return 'B';\n    int r=i+1;\n    if(!smH_[i])return smC_[i]==0?(grid[r][0]!=-1?'P':'.'):'L';\n    if(smC_[i]==0)return grid[r][1]==-1?'R':'.';\n    return 'Q';\n}\nvoid applySmA(int i,char a){\n    smResult_[i]+=a;if(a=='B'){smBombed_[i]=true;return;}if(smBombed_[i])return;\n    int r=i+1;\n    if(a=='P'){smH_[i]=true;smCont_[i]=grid[r][smC_[i]];grid[r][smC_[i]]=-1;}\n    else if(a=='Q'){grid[r][smC_[i]]=smCont_[i];smH_[i]=false;smCont_[i]=-1;smStaged_[i]++;}\n    else if(a=='R')smC_[i]++;else if(a=='L')smC_[i]--;\n}\nvoid sRecv_(){\n    for(int r=0;r<N;r++){\n        bool bl=craneHolding&&craneR==r&&craneC==0;\n        for(int i=0;i<N-1;i++)if(!smBombed_[i]&&smH_[i]&&smR_[i]==r&&smC_[i]==0)bl=true;\n        if(!bl&&grid[r][0]==-1&&recvSent[r]<N)grid[r][0]=A[r][recvSent[r]++];\n    }\n}\nvoid sDisp_(){for(int r=0;r<N;r++)if(grid[r][N-1]!=-1){dispatchCount[r]++;grid[r][N-1]=-1;}}\nvoid turn_(char la){\n    if(!gl())return;\n    char sd[N-1];for(int i=0;i<N-1;i++)sd[i]=getSmA(i);\n    int lnr=craneR+(la=='D')-(la=='U'),lnc=craneC+(la=='R')-(la=='L');\n    for(int i=0;i<N-1;i++){\n        if(smBombed_[i]||sd[i]=='B')continue;\n        int snr=smR_[i]+(sd[i]=='D')-(sd[i]=='U'),snc=smC_[i]+(sd[i]=='R')-(sd[i]=='L');\n        if(lnr==smR_[i]&&lnc==smC_[i]&&snr==smR_[i]&&snc==smC_[i]){la='.';lnr=craneR;lnc=craneC;break;}\n        if(lnr==snr&&lnc==snc){sd[i]='.';continue;}\n        if(lnr==smR_[i]&&lnc==smC_[i]&&snr==craneR&&snc==craneC){sd[i]='.';continue;}\n    }\n    {int l2=craneR+(la=='D')-(la=='U'),c2=craneC+(la=='R')-(la=='L');\n    for(int i=0;i<N-1;i++){\n        if(smBombed_[i])continue;int sn=smR_[i],sc=smC_[i];\n        if(sd[i]=='R')sc++;else if(sd[i]=='L')sc--;\n        if(l2==sn&&c2==sc){la='.';break;}\n    }}\n    sRecv_();result+=la;\n    if(la=='P'){craneContainer=grid[craneR][craneC];grid[craneR][craneC]=-1;craneHolding=true;}\n    else if(la=='Q'){grid[craneR][craneC]=craneContainer;craneHolding=false;craneContainer=-1;}\n    else if(la=='U')craneR--;else if(la=='D')craneR++;\n    else if(la=='L')craneC--;else if(la=='R')craneC++;\n    for(int i=0;i<N-1;i++)applySmA(i,sd[i]);sDisp_();\n}\nvoid goto_(int tr,int tc){\n    while((craneR!=tr||craneC!=tc)&&gl()){\n        char d;\n        // Col-2 threshold: go to col 2 before changing rows (sm cranes only at col 0,1)\n        if(craneR!=tr&&craneC<2)d='R';\n        else if(craneR!=tr)d=(craneR<tr)?'D':'U';\n        else d=(craneC<tc)?'R':'L';\n        int nr=craneR+(d=='D')-(d=='U'),nc=craneC+(d=='R')-(d=='L');\n        bool cf=false;\n        for(int i=0;i<N-1;i++){\n            if(smBombed_[i])continue;\n            if(smR_[i]==nr&&smC_[i]==nc){\n                char s2=getSmA(i);if(s2=='B')continue;\n                int s2r=smR_[i]+(s2=='D')-(s2=='U'),s2c=smC_[i]+(s2=='R')-(s2=='L');\n                if((s2r==nr&&s2c==nc)||(s2r==craneR&&s2c==craneC)){cf=true;break;}\n            }\n        }\n        turn_(cf?'.':d);\n    }\n}\nvoid waitGate0(){while(grid[0][0]==-1&&gl()){if(recvSent[0]<N){turn_('P');return;}turn_('.');}if(gl())turn_('P');}\nint nNext(int g){return dispatchCount[g]<N?N*g+dispatchCount[g]:-1;}\nbool isAvailK(int k){\n    int r=posR[k],p=posP[k];\n    if(bufPos.count(k))return true;\n    if(r==0&&lgPU[0]==p)return true;\n    if(r>=1&&lgPU[r]==p&&smStaged_[r-1]>lgPU[r])return true;\n    return false;\n}\npair<int,int> freeBuf(int tR=-1){\n    auto ok=[&](int r,int c)->bool{\n        if(r>=1&&c==1&&!smBombed_[r-1])return false;\n        if(c==0&&!(recvSent[r]==N&&(r==0||smBombed_[r-1])))return false;\n        return !usedBufs.count({r,c})&&grid[r][c]==-1;\n    };\n    if(tR>=0)for(int c=N-2;c>=1;c--)if(ok(tR,c))return{tR,c};\n    for(int c=N-2;c>=1;c--)for(int r=0;r<N;r++)if(ok(r,c))return{r,c};\n    for(int r=0;r<N;r++)if(ok(r,0))return{r,0};\n    return{-1,-1};\n}\nvoid dGate(int g){goto_(0,0);waitGate0();if(!craneHolding)return;lgPU[0]++;int k=craneContainer;goto_(g,N-1);if(!gl())return;turn_('Q');done_[k]=true;}\nvoid dStaged(int r,int g){\n    goto_(r,N-1);goto_(r,1);if(!gl())return;\n    if(grid[r][1]==-1)return;\n    turn_('P');if(!craneHolding)return;\n    lgPU[r]++;int k=craneContainer;goto_(g,N-1);if(!gl())return;turn_('Q');done_[k]=true;\n}\nvoid dBuf(int br,int bc,int g){\n    goto_(br,bc);while(grid[br][bc]==-1&&gl())turn_('.');if(!gl())return;turn_('P');if(!craneHolding)return;\n    usedBufs.erase({br,bc});bufPos.erase(craneContainer);int k=craneContainer;\n    goto_(g,N-1);if(!gl())return;turn_('Q');done_[k]=true;\n}\nvoid bGate(int br,int bc){goto_(0,0);waitGate0();if(!craneHolding)return;lgPU[0]++;int c=craneContainer;usedBufs.insert({br,bc});bufPos[c]={br,bc};goto_(br,bc);if(!gl())return;turn_('Q');}\nvoid bStaged(int r,int br,int bc){\n    goto_(r,N-1);goto_(r,1);if(!gl())return;\n    if(grid[r][1]==-1)return;\n    turn_('P');if(!craneHolding)return;lgPU[r]++;int c=craneContainer;\n    usedBufs.insert({br,bc});bufPos[c]={br,bc};goto_(br,bc);if(!gl())return;turn_('Q');\n}\nvoid clearB(int r,bool rec=true){\n    if(r>=1&&smStaged_[r-1]<=lgPU[r])return;\n    int bl=A[r][lgPU[r]],gbl=bl/N;\n    for(int i=0;i<N&&nNext(gbl)!=bl;i++){\n        int pre=nNext(gbl);if(pre<0||done_[pre])break;\n        int pr=posR[pre],pp=posP[pre];\n        if(bufPos.count(pre)){auto[br,bc]=bufPos[pre];dBuf(br,bc,gbl);}\n        else if(pr==0&&lgPU[0]==pp){dGate(gbl);}\n        else if(pr>=1&&lgPU[pr]==pp&&smStaged_[pr-1]>lgPU[pr]){dStaged(pr,gbl);}\n        else if(pr>=1&&lgPU[pr]==pp-1&&rec){\n            int bl2=A[pr][lgPU[pr]];\n            if(nNext(bl2/N)==bl2){int pv=lgPU[pr];clearB(pr,false);if(lgPU[pr]>pv&&lgPU[pr]==pp)dStaged(pr,gbl);else break;}\n            else break;\n        } else break;\n    }\n    if(nNext(gbl)==bl){if(r==0)dGate(gbl);else dStaged(r,gbl);return;}\n    auto[br,bc]=freeBuf(gbl);\n    if(br!=-1){if(r==0)bGate(br,bc);else bStaged(r,br,bc);}\n    else{if(r==0)dGate(gbl);else dStaged(r,gbl);}\n}\nbool canC(int bl){\n    int gbl=bl/N,bp=bl%N,d=dispatchCount[gbl];\n    if(d>bp)return false;\n    for(int pos=d;pos<bp;pos++){\n        int need=N*gbl+pos;if(done_[need])continue;if(bufPos.count(need))continue;\n        if(isAvailK(need))continue;\n        int r=posR[need],p=posP[need];\n        if(r>=1&&lgPU[r]==p-1){int bl2=A[r][lgPU[r]];if(nNext(bl2/N)==bl2)continue;}\n        return false;\n    }return true;\n}\nvoid deliverFG(int gate){\n    int k=nNext(gate);if(k<0||done_[k])return;\n    if(bufPos.count(k)){auto[br,bc]=bufPos[k];dBuf(br,bc,gate);return;}\n    int r=posR[k],p=posP[k];\n    while(lgPU[r]<p&&gl()){if(r>=1&&smStaged_[r-1]<=lgPU[r])break;clearB(r);}\n    if(!gl())return;\n    if(lgPU[r]==p&&(r==0||smStaged_[r-1]>lgPU[r])){if(r==0)dGate(gate);else dStaged(r,gate);}\n}\nvector<int> planOrd(int initR=0,int initC=0){\n    const int ND=N+1;int DB=1;for(int i=0;i<N;i++)DB*=ND;const int NS=DB*N*N;\n    auto enc=[&](array<int,N>d,int r,int c)->int{int s=0;for(int i=0;i<N;i++)s=s*ND+d[i];return s*N*N+r*N+c;};\n    auto dec=[&](int s,array<int,N>&d,int&r,int&c){c=s%N;s/=N;r=s%N;s/=N;for(int i=N-1;i>=0;i--){d[i]=s%ND;s/=ND;}};\n    vector<int>dist(NS,INT_MAX/2),pS(NS,-1),pG(NS,-1);\n    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;\n    array<int,N>d0{};for(int i=0;i<N;i++)d0[i]=dispatchCount[i];\n    int s0=enc(d0,initR,initC);dist[s0]=0;pq.push({0,s0});\n    while(!pq.empty()){\n        auto[w,s]=pq.top();pq.pop();if(w>dist[s])continue;\n        array<int,N>d;int r,c;dec(s,d,r,c);\n        for(int g=0;g<N;g++){\n            if(d[g]>=N)continue;int k=N*g+d[g];\n            int sR,sC,tc;\n            if(bufPos.count(k)){auto&bp=bufPos[k];sR=bp.first;sC=bp.second;tc=abs(r-sR)+abs(c-sC)+abs(sR-g)+abs(sC-(N-1))+2+posP[k]*12;}\n            else if(posR[k]==0){sR=0;sC=0;tc=abs(r)+abs(c-(N-1))+g+2*(N-1)+2+posP[k]*12;}\n            else{sR=posR[k];sC=1;tc=abs(r-sR)+abs(c-(N-1))+abs(sR-g)+2*(N-2)+2+posP[k]*12;}\n            auto nd=d;nd[g]++;int ns=enc(nd,g,N-1);\n            if(dist[s]+tc<dist[ns]){dist[ns]=dist[s]+tc;pS[ns]=s;pG[ns]=g;pq.push({dist[ns],ns});}\n        }\n    }\n    array<int,N>gD;for(int i=0;i<N;i++)gD[i]=N;int best=-1,bd=INT_MAX;\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++){int gs=enc(gD,r,c);if(dist[gs]<bd){bd=dist[gs];best=gs;}}\n    vector<int>ord;if(best!=-1)for(int s=best;pS[s]!=-1;s=pS[s])ord.push_back(pG[s]);\n    reverse(ord.begin(),ord.end());return ord;\n}\nvoid solve(){\n    for(int r=0;r<N;r++)for(int c=0;c<N;c++)grid[r][c]=-1;\n    craneR=craneC=0;craneHolding=false;craneContainer=-1;\n    fill(recvSent,recvSent+N,0);fill(lgPU,lgPU+N,0);\n    fill(dispatchCount,dispatchCount+N,0);fill(done_,done_+N*N,false);\n    bufPos.clear();usedBufs.clear();result.clear();\n    for(int i=0;i<N-1;i++){smR_[i]=i+1;smC_[i]=0;smH_[i]=false;smCont_[i]=-1;smBombed_[i]=false;smStaged_[i]=0;smResult_[i].clear();}\n    for(int r=0;r<N;r++)for(int p=0;p<N;p++){posR[A[r][p]]=r;posP[A[r][p]]=p;}\n    auto ord1=planOrd(0,0);for(int g:ord1)if(gl())deliverFG(g);\n    auto ord2=planOrd(craneR,craneC);for(int g:ord2)if(gl())deliverFG(g);\n    for(int it=0;it<5000&&gl();it++){\n        bool done=true;for(int i=0;i<N;i++)if(dispatchCount[i]<N){done=false;break;}if(done)break;\n        int bK=-1,bSc=INT_MAX,bType=-1,bSR=-1,bSC=-1;\n        for(int g=0;g<N;g++){\n            int k=nNext(g);if(k<0||done_[k])continue;\n            int sR,sC,t,sc;\n            if(bufPos.count(k)){auto&bp=bufPos[k];sR=bp.first;sC=bp.second;t=2;sc=abs(craneR-sR)+abs(craneC-sC)+abs(sR-g)+abs(sC-(N-1))+2;}\n            else if(posR[k]==0&&lgPU[0]==posP[k]){sR=0;sC=0;t=0;sc=abs(craneR)+abs(craneC-(N-1))+g+2*(N-1)+2;}\n            else if(posR[k]>=1&&lgPU[posR[k]]==posP[k]&&smStaged_[posR[k]-1]>lgPU[posR[k]]){sR=posR[k];sC=N-1;t=1;sc=abs(craneR-sR)+abs(craneC-(N-1))+abs(sR-g)+2*(N-2)+2;}\n            else continue;\n            int fut=0;for(int j=dispatchCount[g]+1;j<N;j++){int f=N*g+j;if(isAvailK(f))fut++;}\n            sc-=fut*5;\n            if(sc<bSc){bSc=sc;bK=k;bType=t;bSR=sR;bSC=sC;}\n        }\n        if(bK>=0){if(bType==0)dGate(bK/N);else if(bType==1)dStaged(bSR,bK/N);else dBuf(bSR,bSC,bK/N);continue;}\n        int bGc=-1,bDc=INT_MAX,bGb=-1,bDb=INT_MAX;\n        for(int g=0;g<N;g++){\n            int k=nNext(g);if(k<0||done_[k]||bufPos.count(k))continue;\n            int r=posR[k],p=posP[k];if(lgPU[r]==p)continue;\n            if(r>=1&&smStaged_[r-1]<=lgPU[r])continue;\n            int bl=A[r][lgPU[r]],dd=abs(craneR-r)+abs(craneC-(r==0?0:N-1));\n            if(canC(bl)){if(dd<bDc){bDc=dd;bGc=g;}}else if(dd<bDb){bDb=dd;bGb=g;}\n        }\n        int bG=(bGc>=0)?bGc:bGb;\n        if(bG>=0){clearB(posR[nNext(bG)]);continue;}\n        turn_('.');\n    }\n}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(nullptr);\n    int n;cin>>n;for(int r=0;r<N;r++)for(int p=0;p<N;p++)cin>>A[r][p];\n    solve();cout<<result<<\"\\n\";for(int i=0;i<N-1;i++)cout<<smResult_[i]<<\"\\n\";\n    return 0;\n}","ahc034":"#include <bits/stdc++.h>\nusing namespace std;\nint N,h[20][20],origH[20][20],curR,curC,curLoad;\nvector<string>ops;long long totalCost;\nint g_dpv=0;\nvoid doLoad(int d){if(d<=0)return;totalCost+=d;ops.push_back(\"+\"+to_string(d));h[curR][curC]-=d;curLoad+=d;}\nvoid doUnload(int d){d=min(d,curLoad);if(d<=0)return;totalCost+=d;ops.push_back(\"-\"+to_string(d));h[curR][curC]+=d;curLoad-=d;}\nvoid moveStep(char dir,int dr,int dc){totalCost+=100LL+curLoad;curR+=dr;curC+=dc;ops.push_back(string(1,dir));if(h[curR][curC]>0)doLoad(h[curR][curC]);else if(h[curR][curC]<0&&curLoad>0)doUnload(min(curLoad,-h[curR][curC]));}\nvoid moveTo(int tr,int tc){\n    if(curR==tr&&curC==tc)return;\n    int nrow=abs(tr-curR),ncol=abs(tc-curC),rs=curR<tr?1:-1,cs=curC<tc?1:-1;\n    if(!nrow||!ncol){while(curR!=tr)moveStep(rs>0?'D':'U',rs,0);while(curC!=tc)moveStep(cs>0?'R':'L',0,cs);return;}\n    bool ld=(curLoad>0);\n    auto cv=[&](int r,int c)->int{int ri=curR+r*rs,ci=curC+c*cs;if(!ld)return max(0,h[ri][ci]);if(g_dpv==1&&h[ri][ci]<0)return min(curLoad,-h[ri][ci])*2;return abs(h[ri][ci]);};\n    int dp[21][21]={};bool fr[21][21]={};\n    for(int r=1;r<=nrow;r++){dp[r][0]=dp[r-1][0]+cv(r,0);fr[r][0]=1;}\n    for(int c=1;c<=ncol;c++)dp[0][c]=dp[0][c-1]+cv(0,c);\n    for(int r=1;r<=nrow;r++)for(int c=1;c<=ncol;c++){int a=dp[r-1][c]+cv(r,c),b=dp[r][c-1]+cv(r,c);if(a>=b){dp[r][c]=a;fr[r][c]=1;}else dp[r][c]=b;}\n    string path;int r=nrow,c=ncol;\n    while(r||c){if(!r){path+='c';c--;}else if(!c){path+='r';r--;}else if(fr[r][c]){path+='r';r--;}else{path+='c';c--;}}\n    reverse(path.begin(),path.end());\n    for(char ch:path)if(ch=='r')moveStep(rs>0?'D':'U',rs,0);else moveStep(cs>0?'R':'L',0,cs);\n}\nbool allZero(){for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])return false;return true;}\nvoid runCore(int th,bool sd,bool nls=false){\n    if(h[0][0]>0)doLoad(h[0][0]);\n    while(!allZero()&&(int)ops.size()<95000){\n        auto md=[&](int i,int j){return abs(i-curR)+abs(j-curC);};\n        int nD=INT_MAX,di=-1,dj=-1;double bDS=-1;int sdi=-1,sdj=-1;\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]<0){int d=md(i,j);if(d<nD){nD=d;di=i;dj=j;}if(sd&&curLoad>0){double sc=(double)min(curLoad,-h[i][j])/(d+1);if(sc>bDS){bDS=sc;sdi=i;sdj=j;}}}\n        int dI=(sd&&sdi>=0)?sdi:di,dJ=(sd&&sdj>=0)?sdj:dj;\n        if(curLoad==0){double bs=-1;int bi=-1,bj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0){double sc=(double)h[i][j]/(md(i,j)+1);if(sc>bs){bs=sc;bi=i;bj=j;}}if(bi<0)break;moveTo(bi,bj);if(h[bi][bj]>0)doLoad(h[bi][bj]);}\n        else{int fsi=-1,fsj=-1;if(th==-1){double bss=-1,bds=-1;int ssi=-1,ssj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++){int d=md(i,j);if(h[i][j]>0){double sc=(double)h[i][j]*100/((double)(d+1)*max(curLoad,1));if(sc>bss){bss=sc;ssi=i;ssj=j;}}if(h[i][j]<0){double sc=(double)min(curLoad,-h[i][j])/(d+1);if(sc>bds)bds=sc;}}if(bss>bds&&ssi>=0){fsi=ssi;fsj=ssj;}}\n        else{double bfs=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(h[i][j]<=0)continue;int d=md(i,j);if((long long)d*curLoad>=(long long)nD*th)continue;double sc=nls?1.0/(d+1):(double)h[i][j]/(d+1);if(sc>bfs){bfs=sc;fsi=i;fsj=j;}}}\n        if(fsi>=0){moveTo(fsi,fsj);if(h[fsi][fsj]>0)doLoad(h[fsi][fsj]);}else if(dI>=0){moveTo(dI,dJ);if(h[dI][dJ]<0&&curLoad>0)doUnload(min(curLoad,-h[dI][dJ]));}else break;}\n    }\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])totalCost+=10000LL+100LL*abs(h[i][j]);\n}\nvoid runDynamic(int minT,int maxT,bool sd=false){\n    int totalS=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(origH[i][j]>0)totalS+=origH[i][j];\n    if(h[0][0]>0)doLoad(h[0][0]);\n    while(!allZero()&&(int)ops.size()<95000){\n        auto md=[&](int i,int j){return abs(i-curR)+abs(j-curC);};\n        int rem=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0)rem+=h[i][j];\n        int th=totalS>0?minT+(long long)(maxT-minT)*rem/totalS:minT;\n        int nD=INT_MAX,di=-1,dj=-1;double bDS=-1;int sdi=-1,sdj=-1;\n        for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]<0){int d=md(i,j);if(d<nD){nD=d;di=i;dj=j;}if(sd&&curLoad>0){double sc=(double)min(curLoad,-h[i][j])/(d+1);if(sc>bDS){bDS=sc;sdi=i;sdj=j;}}}\n        int dI=(sd&&sdi>=0)?sdi:di,dJ=(sd&&sdj>=0)?sdj:dj;\n        if(curLoad==0){double bs=-1;int bi=-1,bj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0){double sc=(double)h[i][j]/(md(i,j)+1);if(sc>bs){bs=sc;bi=i;bj=j;}}if(bi<0)break;moveTo(bi,bj);if(h[bi][bj]>0)doLoad(h[bi][bj]);}\n        else{double bfs=-1;int fsi=-1,fsj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(h[i][j]<=0)continue;int d=md(i,j);if((long long)d*curLoad>=(long long)nD*th)continue;double sc=(double)h[i][j]/(d+1);if(sc>bfs){bfs=sc;fsi=i;fsj=j;}}\n        if(fsi>=0){moveTo(fsi,fsj);if(h[fsi][fsj]>0)doLoad(h[fsi][fsj]);}else if(dI>=0){moveTo(dI,dJ);if(h[dI][dJ]<0&&curLoad>0)doUnload(min(curLoad,-h[dI][dJ]));}else break;}\n    }\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])totalCost+=10000LL+100LL*abs(h[i][j]);\n}\nvoid optTour(vector<int>&t,vector<pair<int,int>>&c){int n=t.size();if(n<4)return;auto d=[&](int a,int b){return abs(c[a].first-c[b].first)+abs(c[a].second-c[b].second);};bool ip=true;int lm=0;while(ip&&lm++<50){ip=false;for(int i=0;i<n-1;i++)for(int j=i+2;j<n-1;j++)if(d(t[i],t[j])+d(t[i+1],t[j+1])<d(t[i],t[i+1])+d(t[j],t[j+1])){reverse(t.begin()+i+1,t.begin()+j+1);ip=true;}}ip=true;lm=0;while(ip&&lm++<50){ip=false;for(int i=1;i<n-1;i++){int rg=d(t[i-1],t[i])+d(t[i],t[i+1])-d(t[i-1],t[i+1]);if(rg<=0)continue;int bj=-1,bg=-1;for(int j=0;j<n-1;j++){if(j==i-1||j==i)continue;int g=rg-d(t[j],t[i])-d(t[i],t[j+1])+d(t[j],t[j+1]);if(g>bg){bg=g;bj=j;}}if(bg>0){int e=t[i];t.erase(t.begin()+i);int p=(bj>=i)?bj:bj+1;t.insert(t.begin()+p,e);ip=true;break;}}}}\nvoid runTSP(int fb,bool opt=false){\n    vector<pair<int,int>>cells;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(origH[i][j]!=0)cells.push_back({i,j});\n    int n=cells.size();vector<bool>vis(n,false);vector<int>tour;int cr=0,cc=0;\n    for(int s=0;s<n;s++){int best=-1,bd=INT_MAX;for(int i=0;i<n;i++){if(vis[i])continue;int d=abs(cells[i].first-cr)+abs(cells[i].second-cc);if(d<bd){bd=d;best=i;}}if(best<0)break;vis[best]=true;tour.push_back(best);cr=cells[best].first;cc=cells[best].second;}\n    if(opt)optTour(tour,cells);\n    for(int idx:tour){if((int)ops.size()>=88000)break;auto[r,c]=cells[idx];moveTo(r,c);if(h[r][c]>0)doLoad(h[r][c]);else if(h[r][c]<0&&curLoad>0)doUnload(min(curLoad,-h[r][c]));}\n    while(!allZero()&&(int)ops.size()<95000){auto md=[&](int i,int j){return abs(i-curR)+abs(j-curC);};int nD=INT_MAX,di=-1,dj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]<0){int d=md(i,j);if(d<nD){nD=d;di=i;dj=j;}}if(curLoad==0){double bs=-1;int bi=-1,bj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0){double sc=(double)h[i][j]/(md(i,j)+1);if(sc>bs){bs=sc;bi=i;bj=j;}}if(bi<0)break;moveTo(bi,bj);if(h[bi][bj]>0)doLoad(h[bi][bj]);}else{double bfs=-1;int fsi=-1,fsj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(h[i][j]<=0)continue;int d=md(i,j);if((long long)d*curLoad>=(long long)nD*fb)continue;double sc=(double)h[i][j]/(d+1);if(sc>bfs){bfs=sc;fsi=i;fsj=j;}}if(fsi>=0){moveTo(fsi,fsj);if(h[fsi][fsj]>0)doLoad(h[fsi][fsj]);}else if(di>=0){moveTo(di,dj);if(h[di][dj]<0&&curLoad>0)doUnload(min(curLoad,-h[di][dj]));}else break;}}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])totalCost+=10000LL+100LL*abs(h[i][j]);\n}\nvoid runSerpentine(int fb,bool col=false){\n    if(h[curR][curC]>0)doLoad(h[curR][curC]);else if(h[curR][curC]<0&&curLoad>0)doUnload(min(curLoad,-h[curR][curC]));\n    if(!col){for(int r=0;r<N&&(int)ops.size()<88000;r++){while(curR<r&&(int)ops.size()<88000)moveStep('D',1,0);if(r%2==0){while(curC<N-1&&(int)ops.size()<88000)moveStep('R',0,1);}else{while(curC>0&&(int)ops.size()<88000)moveStep('L',0,-1);}}}\n    else{for(int c=0;c<N&&(int)ops.size()<88000;c++){while(curC<c&&(int)ops.size()<88000)moveStep('R',0,1);if(c%2==0){while(curR<N-1&&(int)ops.size()<88000)moveStep('D',1,0);}else{while(curR>0&&(int)ops.size()<88000)moveStep('U',-1,0);}}}\n    while(!allZero()&&(int)ops.size()<95000){auto md=[&](int i,int j){return abs(i-curR)+abs(j-curC);};int nD=INT_MAX,di=-1,dj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]<0){int d=md(i,j);if(d<nD){nD=d;di=i;dj=j;}}if(curLoad==0){double bs=-1;int bi=-1,bj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j]>0){double sc=(double)h[i][j]/(md(i,j)+1);if(sc>bs){bs=sc;bi=i;bj=j;}}if(bi<0)break;moveTo(bi,bj);if(h[bi][bj]>0)doLoad(h[bi][bj]);}else{double bfs=-1;int fsi=-1,fsj=-1;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(h[i][j]<=0)continue;int d=md(i,j);if((long long)d*curLoad>=(long long)nD*fb)continue;double sc=(double)h[i][j]/(d+1);if(sc>bfs){bfs=sc;fsi=i;fsj=j;}}if(fsi>=0){moveTo(fsi,fsj);if(h[fsi][fsj]>0)doLoad(h[fsi][fsj]);}else if(di>=0){moveTo(di,dj);if(h[di][dj]<0&&curLoad>0)doUnload(min(curLoad,-h[di][dj]));}else break;}}\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(h[i][j])totalCost+=10000LL+100LL*abs(h[i][j]);\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N;for(int i=0;i<N;i++)for(int j=0;j<N;j++){cin>>h[i][j];origH[i][j]=h[i][j];}\n    long long best=LLONG_MAX;vector<string>bestOps;\n    auto go=[&](auto f){for(int i=0;i<N;i++)for(int j=0;j<N;j++)h[i][j]=origH[i][j];curR=curC=curLoad=0;ops.clear();totalCost=0;f();if(totalCost<best){best=totalCost;bestOps=ops;}};\n    g_dpv=0;\n    for(auto[t,sd,nls]:vector<tuple<int,bool,bool>>{{-1,0,0},{-1,1,0},{0,0,0},{0,1,0},{30,0,0},{50,0,0},{70,0,0},{80,0,0},{90,0,0},{100,0,0},{110,0,0},{120,0,0},{130,0,0},{150,0,0},{175,0,0},{200,0,0},{250,0,0},{300,0,0},{400,0,0},{500,0,0},{750,0,0},{1000,0,0},{2000,0,0},{80,1,0},{100,1,0},{120,1,0},{150,1,0},{200,1,0},{300,1,0},{80,0,1},{100,0,1},{120,0,1},{150,0,1}})go([&]{runCore(t,sd,nls);});\n    for(int fb:{80,100,150})go([&]{runTSP(fb,false);});\n    for(int fb:{80,100,150})go([&]{runTSP(fb,true);});\n    for(auto[fb,col]:vector<pair<int,bool>>{{100,false},{150,false},{100,true},{150,true}})go([&]{runSerpentine(fb,col);});\n    g_dpv=1;for(int t:{80,100,120,150,200})go([&]{runCore(t,false,false);});g_dpv=0;\n    for(auto[mn,mx,sd]:vector<tuple<int,int,bool>>{\n        {70,150,0},{80,200,0},{60,120,0},{50,100,0},{100,50,0},\n        {200,80,0},{200,100,0},{150,60,0},{150,80,0},{120,60,0},\n        {120,50,0},{100,40,0},{80,40,0},{70,200,0},{50,180,0},\n        {40,200,0},{60,200,0},{80,160,0},{30,150,0},{160,70,0},\n        {100,50,1},{80,200,1},{150,70,1},\n        {200,50,0},{250,80,0},{300,100,0},{250,50,0},{300,70,0},\n        {180,60,0},{130,40,0},{250,100,0},{200,60,0},{150,40,0},\n        {40,250,0},{50,300,0},{60,250,0},{80,250,0},{30,200,0},\n        {200,60,1},{150,50,1},{250,80,1},\n        {300,50,0},{350,100,0},{250,60,0},{350,80,0},\n        {40,350,0},{50,350,0},{70,300,0},{60,300,0},\n        {150,30,0},{100,20,0},{250,150,0},{180,90,0}\n    })go([&]{runDynamic(mn,mx,sd);});\n    for(auto&op:bestOps)cout<<op<<\"\\n\";\n}","ahc035":"#include <bits/stdc++.h>\nusing namespace std;\nint main(){\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,T; cin>>N>>M>>T;\n    const int SC=2*N*(N-1),nn=N*N;\n    vector<vector<int>> X(SC,vector<int>(M));\n    for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    mt19937 rng(42);\n    vector<array<int,4>> nbr(nn); vector<int> ndeg(nn,0);\n    for(int p=0;p<nn;p++){int r=p/N,c=p%N;if(r>0)nbr[p][ndeg[p]++]=p-N;if(r<N-1)nbr[p][ndeg[p]++]=p+N;if(c>0)nbr[p][ndeg[p]++]=p-1;if(c<N-1)nbr[p][ndeg[p]++]=p+1;}\n    for(int turn=0;turn<T;turn++){\n        auto ts=chrono::steady_clock::now();\n        vector<int> vals(SC,0);\n        for(int k=0;k<SC;k++) for(int l=0;l<M;l++) vals[k]+=X[k][l];\n        vector<bool> ins(SC,false); vector<int> sel;\n        for(int l=0;l<M;l++){int bk=0;for(int k=1;k<SC;k++)if(X[k][l]>X[bk][l])bk=k;if(!ins[bk]){ins[bk]=true;sel.push_back(bk);}}\n        {vector<int> ord(SC);iota(ord.begin(),ord.end(),0);sort(ord.begin(),ord.end(),[&](int a,int b){return vals[a]>vals[b];});for(int k:ord){if((int)sel.size()>=nn)break;if(!ins[k]){ins[k]=true;sel.push_back(k);}}}\n        vector<int> pst(nn*nn);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++){int s=0;for(int l=0;l<M;l++)s+=max(X[sel[i]][l],X[sel[j]][l]);pst[i*nn+j]=s;}\n        vector<int> psum(nn,0);\n        for(int i=0;i<nn;i++) for(int j=0;j<nn;j++) psum[i]+=pst[i*nn+j];\n        auto ctrb=[&](const vector<int>&g,int p)->int{int v=0;for(int d=0;d<ndeg[p];d++)v+=pst[g[p]*nn+g[nbr[p][d]]];return v;};\n        auto totsc=[&](const vector<int>&g)->int{int s=0;for(int p=0;p<nn;p++){if((p%N)<N-1)s+=pst[g[p]*nn+g[p+1]];if(p<nn-N)s+=pst[g[p]*nn+g[p+N]];}return s;};\n        auto locsrch=[&](vector<int> g)->vector<int>{bool imp=true;while(imp){imp=false;for(int a=0;a<nn;a++)for(int b=a+1;b<nn;b++){int bef=ctrb(g,a)+ctrb(g,b);swap(g[a],g[b]);int aft=ctrb(g,a)+ctrb(g,b);if(aft>bef)imp=true;else swap(g[a],g[b]);}}return g;};\n        auto grinit=[&]()->vector<int>{vector<int> g(nn,-1);vector<bool> used(nn,false);for(int pos=0;pos<nn;pos++){int r=pos/N,c=pos%N;int bs=-1;int64_t bv=-1;for(int s=0;s<nn;s++){if(used[s])continue;int cv=0;if(r>0)cv+=pst[s*nn+g[pos-N]];if(c>0)cv+=pst[s*nn+g[pos-1]];int64_t ev=(int64_t)cv*1000000LL+psum[s];if(ev>bv){bv=ev;bs=s;}}g[pos]=bs;used[bs]=true;}return g;};\n        int gbest=-1; vector<int> bg;\n        for(int rest=0;rest<3;rest++){\n            double rt0=chrono::duration<double>(chrono::steady_clock::now()-ts).count();\n            if(rt0>=0.185) break;\n            double tl=(0.185-rt0)/(3-rest),tend=rt0+tl;\n            vector<int> g(nn); double T0;\n            if(rest==0){g=grinit();T0=200.0;}else{iota(g.begin(),g.end(),0);shuffle(g.begin(),g.end(),rng);T0=1000.0;}\n            int cur=totsc(g),lb=cur; vector<int> lg=g; double temp=T0;\n            for(int it=0;;it++){\n                if((it&0x7FF)==0){double now=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(now>=tend)break;temp=T0*pow(0.1/T0,(now-rt0)/tl);}\n                int p1=rng()%nn,p2=rng()%nn; if(p1==p2)continue;\n                int bef=ctrb(g,p1)+ctrb(g,p2); swap(g[p1],g[p2]); int aft=ctrb(g,p1)+ctrb(g,p2); int d=aft-bef;\n                if(d>=0||(rng()%1000000)<(int)(1e6*exp((double)d/temp))){cur+=d;if(cur>lb){lb=cur;lg=g;}}else swap(g[p1],g[p2]);\n            }\n            lg=locsrch(lg); int sc=totsc(lg); if(sc>gbest){gbest=sc;bg=lg;}\n        }\n        for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(j)cout<<' ';cout<<sel[bg[i*N+j]];}cout<<'\\n';}\n        cout.flush();\n        for(int i=0;i<SC;i++) for(int j=0;j<M;j++) cin>>X[i][j];\n    }\n    return 0;\n}","ahc038":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,V;\nconst int DR[]={0,1,0,-1},DC[]={1,0,-1,0};\nint rx,ry,nfp,Vp,rfp=-1;\nint fpd[16],hld[16],fpl[16];\nstruct Del{int sr,sc,tr,tc;bool done;};\nvector<Del>P;int np;\nvector<vector<int>>g;\nmap<pair<int,int>,int>sm;\nvector<string>ops;\nint fpr(int k){return rx+fpl[k]*DR[fpd[k]];}\nint fpc(int k){return ry+fpl[k]*DC[fpd[k]];}\nbool navto(int tr,int tc,int pk,int td){\n    while((rx!=tr||ry!=tc||fpd[pk]!=td)&&(int)ops.size()<99990){\n        char mv='.';\n        if(rx!=tr||ry!=tc){if(rx<tr)mv='D';else if(rx>tr)mv='U';else if(ry<tc)mv='R';else mv='L';}\n        if(mv=='D')rx++;else if(mv=='U')rx--;else if(mv=='R')ry++;else if(mv=='L')ry--;\n        string op(2*Vp,'.');op[0]=mv;\n        if(fpd[pk]!=td){int cw=(td-fpd[pk]+4)%4;if(cw<=2){fpd[pk]=(fpd[pk]+1)%4;op[1+pk]='R';}else{fpd[pk]=(fpd[pk]+3)%4;op[1+pk]='L';}}\n        for(int k=0;k<nfp;k++){\n            int fr=fpr(k),fc=fpc(k);\n            if(fr<0||fr>=N||fc<0||fc>=N)continue;\n            if(hld[k]<0){if(k==rfp)continue;auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n            else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n        }\n        ops.push_back(op);\n    }\n    return rx==tr&&ry==tc&&fpd[pk]==td;\n}\nint pickfp(int di,int r,int c){\n    for(int k=0;k<nfp;k++)if(hld[k]==di)return k;\n    sm.erase({r,c});\n    int bk=-1,br=-1,bc_=-1,bdir=-1,bv=INT_MAX;\n    for(int k=0;k<nfp;k++){\n        if(hld[k]>=0)continue;\n        for(int d=0;d<4;d++){\n            int ar=r-fpl[k]*DR[d],ac=c-fpl[k]*DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;\n            int md=abs(rx-ar)+abs(ry-ac),rot=min((d-fpd[k]+4)%4,(fpd[k]-d+4)%4),v=max(md,rot);\n            if(v<bv){bv=v;bk=k;br=ar;bc_=ac;bdir=d;}\n        }\n    }\n    if(bk<0){sm[{r,c}]=di;return -1;}\n    rfp=bk;bool ok=navto(br,bc_,bk,bdir);rfp=-1;\n    if(!ok){sm[{r,c}]=di;return -1;}\n    if((int)ops.size()>=99990){sm[{r,c}]=di;return -1;}\n    string op(2*Vp,'.');bool picked=false;\n    for(int k=0;k<nfp;k++){\n        int fr=fpr(k),fc=fpc(k);if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k==bk&&fr==r&&fc==c&&g[r][c]==1&&hld[k]<0){hld[k]=di;g[r][c]=0;op[Vp+1+k]='P';picked=true;}\n        else if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}\n        else if(hld[k]>=0){int di2=hld[k];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k]=-1;op[Vp+1+k]='P';}}\n    }\n    ops.push_back(op);if(!picked){sm[{r,c}]=di;return -1;}return bk;\n}\nbool dropfp(int k,int di){\n    if(hld[k]!=di)return true;\n    int r=P[di].tr,c=P[di].tc;\n    int bdir=-1,bar=-1,bac=-1,bv=INT_MAX;\n    for(int d=0;d<4;d++){\n        int ar=r-fpl[k]*DR[d],ac=c-fpl[k]*DC[d];if(ar<0||ar>=N||ac<0||ac>=N)continue;\n        int md=abs(rx-ar)+abs(ry-ac),rot=min((d-fpd[k]+4)%4,(fpd[k]-d+4)%4),v=max(md,rot);\n        if(v<bv){bv=v;bdir=d;bar=ar;bac=ac;}\n    }\n    if(bdir<0)return false;\n    navto(bar,bac,k,bdir);if(hld[k]!=di)return true;\n    if((int)ops.size()>=99990)return false;\n    string op(2*Vp,'.');bool ok=false;\n    for(int k2=0;k2<nfp;k2++){\n        int fr=fpr(k2),fc=fpc(k2);if(fr<0||fr>=N||fc<0||fc>=N)continue;\n        if(k2==k&&fr==r&&fc==c&&g[r][c]==0&&hld[k2]==di){g[r][c]=1;P[di].done=true;hld[k2]=-1;op[Vp+1+k2]='P';ok=true;}\n        else if(hld[k2]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k2]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k2]='P';}}\n        else if(hld[k2]>=0){int di2=hld[k2];if(P[di2].tr==fr&&P[di2].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di2].done=true;hld[k2]=-1;op[Vp+1+k2]='P';}}\n    }\n    ops.push_back(op);return ok;\n}\nbool cbh(int bk){\n    if(hld[bk]<0)return false;int di=hld[bk];\n    pair<int,int>tmp={-1,-1};\n    {set<pair<int,int>>ts;for(auto&d:P)if(!d.done)ts.insert({d.tr,d.tc});\n    int bdist=INT_MAX;\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(!g[i][j]&&!ts.count({i,j})){int dist=abs(rx-i)+abs(ry-j);if(dist<bdist){bdist=dist;tmp={i,j};}}}\n    if(tmp.first<0){bdist=INT_MAX;for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(!g[i][j]){int dist=abs(rx-i)+abs(ry-j);if(dist<bdist){bdist=dist;tmp={i,j};}}}}}\n    if(tmp.first<0)return false;\n    int otr=P[di].tr,otc=P[di].tc;P[di].tr=tmp.first;P[di].tc=tmp.second;g[tmp.first][tmp.second]=0;\n    if(dropfp(bk,di)){P[di].done=false;P[di].tr=otr;P[di].tc=otc;P[di].sr=tmp.first;P[di].sc=tmp.second;sm[{tmp.first,tmp.second}]=di;return true;}\n    else{P[di].tr=otr;P[di].tc=otc;if(!g[tmp.first][tmp.second])g[tmp.first][tmp.second]=1;hld[bk]=-1;return false;}\n}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>V;\n    vector<string>sg(N),tg(N);for(auto&s:sg)cin>>s;for(auto&s:tg)cin>>s;\n    vector<pair<int,int>>S,T;g.assign(N,vector<int>(N,0));\n    for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(sg[i][j]=='1'){S.push_back({i,j});g[i][j]=1;}if(tg[i][j]=='1')T.push_back({i,j});}\n    int m=M;\n    nfp=min(V-1,15);Vp=nfp+1;\n    for(int k=0;k<16;k++){fpl[k]=(k/4)+1;hld[k]=-1;fpd[k]=0;}\n    cout<<Vp<<\"\\n\";\n    for(int k=0;k<nfp;k++)cout<<\"0 \"<<fpl[k]<<\"\\n\";\n    cout<<\"0 0\\n\";\n    rx=ry=0;\n    vector<int>mt(m,-1);\n    {vector<bool>su(m,false),tu(m,false);\n    for(int i=0;i<m;i++)if(!su[i])for(int j=0;j<m;j++)if(!tu[j]&&S[i]==T[j]){mt[i]=j;su[i]=tu[j]=true;break;}\n    for(int i=0;i<m;i++){if(su[i])continue;int bj=-1,bd=INT_MAX;for(int j=0;j<m;j++){if(tu[j])continue;int d=abs(S[i].first-T[j].first)+abs(S[i].second-T[j].second);if(d<bd){bd=d;bj=j;}}mt[i]=bj;su[i]=tu[bj]=true;}\n    bool imp=true;while(imp){imp=false;for(int i=0;i<m;i++)for(int j=i+1;j<m;j++){int si0=S[i].first,si1=S[i].second,sj0=S[j].first,sj1=S[j].second,ti0=T[mt[i]].first,ti1=T[mt[i]].second,tj0=T[mt[j]].first,tj1=T[mt[j]].second;if(abs(si0-tj0)+abs(si1-tj1)+abs(sj0-ti0)+abs(sj1-ti1)<abs(si0-ti0)+abs(si1-ti1)+abs(sj0-tj0)+abs(sj1-tj1)){swap(mt[i],mt[j]);imp=true;}}}}\n    P.clear();for(int i=0;i<m;i++)if(S[i]!=T[mt[i]])P.push_back({S[i].first,S[i].second,T[mt[i]].first,T[mt[i]].second,false});\n    np=(int)P.size();sm.clear();for(int i=0;i<np;i++)sm[{P[i].sr,P[i].sc}]=i;\n    auto och=[&](string&op){for(int k=0;k<nfp;k++){int fr=fpr(k),fc=fpc(k);if(fr<0||fr>=N||fc<0||fc>=N)continue;if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}}};\n    {string op(2*Vp,'.');\n    for(int k=0;k<nfp;k++){int d=k%4;if(d==1){op[1+k]='R';fpd[k]=1;}else if(d==2){op[1+k]='R';fpd[k]=1;}else if(d==3){op[1+k]='L';fpd[k]=3;}}\n    och(op);ops.push_back(op);}\n    if(nfp>=3){string op(2*Vp,'.');\n    for(int k=0;k<nfp;k++){if(k%4==2){op[1+k]='R';fpd[k]=2;}}\n    och(op);ops.push_back(op);}\n    vector<int>tsp(np);\n    if(np>0){\n        {vector<bool>used(np,false);int cr=0,cc=0;for(int s=0;s<np;s++){int best=-1,bd=INT_MAX;for(int i=0;i<np;i++){if(used[i])continue;int d=abs(cr-P[i].sr)+abs(cc-P[i].sc);if(d<bd){bd=d;best=i;}}tsp[s]=best;used[best]=true;cr=P[best].tr;cc=P[best].tc;}}\n        auto dc=[&](int a,int b)->int{if(b<0||b>=np)return 0;int r0=(a<0||a>=np)?0:P[tsp[a]].tr,c0=(a<0||a>=np)?0:P[tsp[a]].tc;return abs(r0-P[tsp[b]].sr)+abs(c0-P[tsp[b]].sc);};\n        {bool imp=true;while(imp){imp=false;for(int i=0;i<np;i++)for(int j=i+1;j<np;j++){int oc,nc;if(j==i+1){oc=dc(i-1,i)+dc(i,j)+dc(j,j+1);swap(tsp[i],tsp[j]);nc=dc(i-1,i)+dc(i,j)+dc(j,j+1);swap(tsp[i],tsp[j]);}else{oc=dc(i-1,i)+dc(i,i+1)+dc(j-1,j)+dc(j,j+1);swap(tsp[i],tsp[j]);nc=dc(i-1,i)+dc(i,i+1)+dc(j-1,j)+dc(j,j+1);swap(tsp[i],tsp[j]);}if(nc<oc){swap(tsp[i],tsp[j]);imp=true;}}}}\n        {bool imp=true;while(imp){imp=false;int bi=-1,bj=-1,bdelta=0;for(int i=0;i<np;i++){int pi=i-1,ni=i+1,rc=dc(pi,i)+dc(i,ni),bridge=dc(pi,ni);for(int j=0;j<np;j++){if(j==pi||j==i)continue;int nj=j+1,rj=dc(j,nj),ic=dc(j,i)+dc(i,nj),delta=bridge+ic-rc-rj;if(delta<bdelta){bdelta=delta;bi=i;bj=j;}}}if(bi>=0){imp=true;int val=tsp[bi];if(bj>bi){tsp.erase(tsp.begin()+bi);tsp.insert(tsp.begin()+bj,val);}else{tsp.erase(tsp.begin()+bi);tsp.insert(tsp.begin()+bj+1,val);}}}}\n    }\n    vector<int>tsp_rank(np,np);for(int s=0;s<np;s++)tsp_rank[tsp[s]]=s;\n    double tsp_w=(nfp>=8)?0.005:0.03; // reduced TSP weight for large nfp\n    int stall=0;\n    while((int)ops.size()<97000){\n        int tdone=0;for(auto&d:P)if(d.done)tdone++;if(tdone==np)break;\n        bool prog=false;\n        {bool any=true;\n        while(any&&(int)ops.size()<97000){\n            any=false;\n            vector<pair<int,int>>dr;\n            for(int k=0;k<nfp;k++){if(hld[k]<0)continue;int di=hld[k];if(g[P[di].tr][P[di].tc]!=0)continue;dr.push_back({k,di});}\n            if(dr.empty())break;\n            int n=dr.size();\n            vector<int>best(n);iota(best.begin(),best.end(),0);\n            if(n<=5){\n                vector<int>perm(n);iota(perm.begin(),perm.end(),0);int bc=INT_MAX;\n                do{int cost=0,cr=rx,cc=ry;for(int i:perm){int r=P[dr[i].second].tr,c=P[dr[i].second].tc;cost+=abs(cr-r)+abs(cc-c);cr=r;cc=c;}if(cost<bc){bc=cost;best=perm;}}while(next_permutation(perm.begin(),perm.end()));\n            }else{\n                {vector<bool>used(n,false);int cr=rx,cc=ry;\n                for(int step=0;step<n;step++){int bi=-1,bd=INT_MAX;for(int i=0;i<n;i++){if(used[i])continue;int r=P[dr[i].second].tr,c=P[dr[i].second].tc;int d=abs(cr-r)+abs(cc-c);if(d<bd){bd=d;bi=i;}}used[bi]=true;best[step]=bi;cr=P[dr[bi].second].tr;cc=P[dr[bi].second].tc;}}\n                {auto dd=[&](int a,int b)->int{int ra=(a<0)?rx:P[dr[best[a]].second].tr,ca=(a<0)?ry:P[dr[best[a]].second].tc;return abs(ra-P[dr[best[b]].second].tr)+abs(ca-P[dr[best[b]].second].tc);};\n                bool imp2=true;while(imp2){imp2=false;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){int oc,nc;if(j==i+1){oc=dd(i-1,i)+dd(i,j)+(j+1<n?dd(j,j+1):0);swap(best[i],best[j]);nc=dd(i-1,i)+dd(i,j)+(j+1<n?dd(j,j+1):0);swap(best[i],best[j]);}else{oc=dd(i-1,i)+dd(i,i+1)+dd(j-1,j)+(j+1<n?dd(j,j+1):0);swap(best[i],best[j]);nc=dd(i-1,i)+dd(i,i+1)+dd(j-1,j)+(j+1<n?dd(j,j+1):0);swap(best[i],best[j]);}if(nc<oc){swap(best[i],best[j]);imp2=true;}}}}\n            }\n            auto[k,di]=dr[best[0]];\n            if(hld[k]==di&&g[P[di].tr][P[di].tc]==0){if(!dropfp(k,di))cbh(k);any=true;prog=true;}\n        }}\n        if(!prog){\n            double bv=1e18;int fi=-1;\n            for(auto&[src,di]:sm){\n                if(P[di].done||g[P[di].tr][P[di].tc]!=0)continue;\n                int d=abs(rx-src.first)+abs(ry-src.second);\n                double val=d+tsp_w*tsp_rank[di];\n                if(val<bv){bv=val;fi=di;}\n            }\n            if(fi>=0){\n                int k=pickfp(fi,P[fi].sr,P[fi].sc);\n                if(k>=0){\n                    // Extras: global search with target proximity bonus\n                    for(int ex=0;ex<nfp-1;ex++){\n                        int fp=0;for(int j=0;j<nfp;j++)if(hld[j]<0)fp++;\n                        if(fp==0)break;\n                        int b2=-1;double bd2=1e18;\n                        for(auto&[src2,di2]:sm){\n                            if(P[di2].done||g[P[di2].tr][P[di2].tc]!=0)continue;\n                            int src_d=abs(rx-src2.first)+abs(ry-src2.second);\n                            int tgt_d=abs(P[fi].tr-P[di2].tr)+abs(P[fi].tc-P[di2].tc);\n                            double score=src_d+0.1*tgt_d;\n                            if(score<bd2){bd2=score;b2=di2;}\n                        }\n                        if(b2<0)break;\n                        pickfp(b2,P[b2].sr,P[b2].sc);\n                    }\n                    prog=true;\n                }\n            }\n        }\n        if(!prog){for(int k=0;k<nfp;k++)if(hld[k]>=0){if(cbh(k))prog=true;break;}\n            if(!prog){int ci=-1,bd=INT_MAX;for(auto&[src,di]:sm){int d=abs(rx-src.first)+abs(ry-src.second);if(d<bd){bd=d;ci=di;}}if(ci>=0){int k=pickfp(ci,P[ci].sr,P[ci].sc);if(k>=0&&cbh(k))prog=true;}}}\n        if(prog)stall=0;\n        else{stall++;if(stall>300)break;\n            string op(2*Vp,'.');for(int k=0;k<nfp;k++){int fr=fpr(k),fc=fpc(k);if(fr<0||fr>=N||fc<0||fc>=N)continue;if(hld[k]<0){auto it=sm.find({fr,fc});if(it!=sm.end()&&g[fr][fc]==1){hld[k]=it->second;sm.erase(it);g[fr][fc]=0;op[Vp+1+k]='P';}}else{int di=hld[k];if(P[di].tr==fr&&P[di].tc==fc&&g[fr][fc]==0){g[fr][fc]=1;P[di].done=true;hld[k]=-1;op[Vp+1+k]='P';}}}ops.push_back(op);}\n    }\n    for(auto&op:ops)cout<<op<<\"\\n\";\n    return 0;\n}","ahc039":"#include <bits/stdc++.h>\nusing namespace std;\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    using Clock=chrono::steady_clock;auto t0=Clock::now();\n    auto elMs=[&](){return(long long)chrono::duration_cast<chrono::milliseconds>(Clock::now()-t0).count();};\n    int N;cin>>N;int M=2*N;\n    vector<int>X(M),Y(M),W(M);\n    for(int i=0;i<M;i++){cin>>X[i]>>Y[i];W[i]=(i<N)?1:-1;}\n    const int CMAX=100000;\n    {int x1=X[0],x2=(x1<CMAX)?x1+1:x1-1,y1=Y[0],y2=(y1<CMAX)?y1+1:y1-1;\n     if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n     cout<<4<<\"\\n\"<<x1<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y2<<\"\\n\"<<x1<<\" \"<<y2<<\"\\n\";}\n    struct FE{int key,other,w;};\n    vector<FE>bx(M),by(M);\n    {vector<int>idx(M);iota(idx.begin(),idx.end(),0);\n     sort(idx.begin(),idx.end(),[&](int a,int b){return X[a]<X[b];});\n     for(int i=0;i<M;i++)bx[i]={X[idx[i]],Y[idx[i]],W[idx[i]]};\n     iota(idx.begin(),idx.end(),0);\n     sort(idx.begin(),idx.end(),[&](int a,int b){return Y[a]<Y[b];});\n     for(int i=0;i<M;i++)by[i]={Y[idx[i]],X[idx[i]],W[idx[i]]};}\n    auto kadane=[](const vector<FE>&f,int lo,int hi)->pair<int,int>{\n        int cur=0,cs=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n        for(int i=0,n=(int)f.size();i<n;){int xv=f[i].key,gs=0;\n            while(i<n&&f[i].key==xv){if(f[i].other>=lo&&f[i].other<=hi)gs+=f[i].w;i++;}\n            if(!ir){if(gs>0){cs=xv;cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs;bhi=xv;}}}\n            else{cur+=gs;if(cur>mx){mx=cur;blo=cs;bhi=xv;}if(cur<0){cur=0;ir=false;}}}\n        return{blo,bhi};};\n    auto evalRect=[&](int x1,int x2,int y1,int y2){int s=0;\n        for(int i=0;i<M;i++)if(X[i]>=x1&&X[i]<=x2&&Y[i]>=y1&&Y[i]<=y2)s+=W[i];return s;};\n    auto coordDescent=[&](int x1,int x2,int y1,int y2)->tuple<int,int,int,int,int>{\n        x1=max(0,min(CMAX,x1));x2=max(0,min(CMAX,x2));y1=max(0,min(CMAX,y1));y2=max(0,min(CMAX,y2));\n        if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);\n        int px1=-1,px2=-1,py1=-1,py2=-1;\n        for(int it=0;it<20;it++){if(x1==px1&&x2==px2&&y1==py1&&y2==py2)break;\n            px1=x1;px2=x2;py1=y1;py2=y2;\n            auto[nx1,nx2]=kadane(bx,y1,y2);if(nx1>=0){x1=nx1;x2=nx2;}\n            auto[ny1,ny2]=kadane(by,x1,x2);if(ny1>=0){y1=ny1;y2=ny2;}}\n        return make_tuple(evalRect(x1,x2,y1,y2),x1,x2,y1,y2);};\n    const int G=200,step=CMAX/G;\n    vector<vector<int>>grid(G,vector<int>(G,0));\n    for(int i=0;i<M;i++)grid[min(X[i]/step,G-1)][min(Y[i]/step,G-1)]+=W[i];\n    int bgx1=0,bgx2=0,bgy1=0,bgy2=0,bgs=0;\n    for(int gx1=0;gx1<G;gx1++){vector<int>cs(G,0);\n        for(int gx2=gx1;gx2<G;gx2++){for(int gy=0;gy<G;gy++)cs[gy]+=grid[gx2][gy];\n            int cur=0,cst=0,mx=0,ms=0,me=-1;\n            for(int gy=0;gy<G;gy++){cur+=cs[gy];if(cur>mx){mx=cur;ms=cst;me=gy;}if(cur<0){cur=0;cst=gy+1;}}\n            if(me>=0&&mx>bgs){bgs=mx;bgx1=gx1;bgx2=gx2;bgy1=ms;bgy2=me;}}}\n    int ix1=bgx1*step,ix2=min((bgx2+1)*step,CMAX),iy1=bgy1*step,iy2=min((bgy2+1)*step,CMAX);\n    int gscore=-1,rx1=0,rx2=1,ry1=0,ry2=1;\n    struct BR{int s,x1,x2,y1,y2;};\n    vector<BR>top_bases;const int NB=5;\n    auto tryRun=[&](int x1,int x2,int y1,int y2){\n        auto[s,a,b,c,d]=coordDescent(x1,x2,y1,y2);\n        if(s>gscore){gscore=s;rx1=a;rx2=b;ry1=c;ry2=d;}\n        if(s>0){\n            bool dup=false;\n            for(auto&br:top_bases){\n                if(abs(br.x1-a)+abs(br.x2-b)+abs(br.y1-c)+abs(br.y2-d)<4000){\n                    if(s>br.s){br.s=s;br.x1=a;br.x2=b;br.y1=c;br.y2=d;}\n                    dup=true;break;\n                }\n            }\n            if(!dup){\n                top_bases.push_back({s,a,b,c,d});\n                sort(top_bases.begin(),top_bases.end(),[](auto&a,auto&b){return a.s>b.s;});\n                if((int)top_bases.size()>NB)top_bases.resize(NB);\n            }\n        }};\n    tryRun(ix1,ix2,iy1,iy2);tryRun(0,CMAX,0,CMAX);\n    {long long cx=0,cy=0;for(int i=0;i<N;i++){cx+=X[i];cy+=Y[i];}cx/=N;cy/=N;\n     tryRun((int)cx-40000,(int)cx+40000,(int)cy-40000,(int)cy+40000);\n     tryRun((int)cx-15000,(int)cx+15000,(int)cy-15000,(int)cy+15000);}\n    mt19937 rng(42);\n    for(int trial=0;;trial++){\n        if(trial%100==0&&elMs()>1700)break;\n        int seed=rng()%N;int cx=X[seed],cy=Y[seed];int half;\n        switch(rng()%4){case 0:half=200+rng()%800;break;case 1:half=1000+rng()%9000;break;\n            case 2:half=10000+rng()%20000;break;default:half=30000+rng()%20000;break;}\n        tryRun(cx-half,cx+half,cy-half,cy+half);}\n    auto findArm=[&](const vector<tuple<int,int,int>>&fish,int clo,int chi)->tuple<int,int,int,int>{\n        vector<int>xs;\n        for(auto&[s,c,w]:fish)if(c>=clo&&c<=chi)xs.push_back(c);\n        sort(xs.begin(),xs.end());xs.erase(unique(xs.begin(),xs.end()),xs.end());\n        if(xs.empty())return{0,-1,-1,0};\n        int kx=(int)xs.size();vector<int>cum(kx,0);int bsc=0,bc1=-1,bc2=-1,bsw=0;\n        for(int i=0,n=(int)fish.size();i<n;){int csw=get<0>(fish[i]);\n            while(i<n&&get<0>(fish[i])==csw){auto&[s2,c,w]=fish[i];++i;\n                if(c>=clo&&c<=chi)cum[(int)(lower_bound(xs.begin(),xs.end(),c)-xs.begin())]+=w;}\n            int cur=0,cs2=-1,mx=0,blo=-1,bhi=-1;bool ir=false;\n            for(int j=0;j<kx;j++){int gs=cum[j];\n                if(!ir){if(gs>0){cs2=xs[j];cur=gs;ir=true;if(cur>mx){mx=cur;blo=cs2;bhi=xs[j];}}}\n                else{cur+=gs;if(cur>mx){mx=cur;blo=cs2;bhi=xs[j];}if(cur<0){cur=0;ir=false;}}}\n            if(mx>bsc){bsc=mx;bc1=blo;bc2=bhi;bsw=csw;}}\n        return{bsc,bc1,bc2,bsw};};\n    int global_best=-1;\n    auto runPipeline=[&](int bx1,int bx2,int by1,int by2,int dep)->void{\n        vector<tuple<int,int,int>>ft,fb,fr,fl;\n        for(int i=0;i<M;i++){\n            if(Y[i]>by2&&X[i]>=bx1&&X[i]<=bx2)ft.emplace_back(Y[i],X[i],W[i]);\n            if(Y[i]<by1&&X[i]>=bx1&&X[i]<=bx2)fb.emplace_back(-Y[i],X[i],W[i]);\n            if(X[i]>bx2&&Y[i]>=by1&&Y[i]<=by2)fr.emplace_back(X[i],Y[i],W[i]);\n            if(X[i]<bx1&&Y[i]>=by1&&Y[i]<=by2)fl.emplace_back(-X[i],Y[i],W[i]);}\n        sort(ft.begin(),ft.end());sort(fb.begin(),fb.end());sort(fr.begin(),fr.end());sort(fl.begin(),fl.end());\n        auto[ts,tax1,tax2,tay2]=findArm(ft,bx1,bx2);auto[bms,bax1,bax2,nb]=findArm(fb,bx1,bx2);int bay1=-nb;\n        auto[rms,ray1,ray2,rax2]=findArm(fr,by1,by2);auto[ls,lay1,lay2,nl]=findArm(fl,by1,by2);int lax1=-nl;\n        bool ht=ts>0&&tax1>=bx1&&tax2<=bx2&&tax1<tax2&&tay2>by2;\n        bool hb=bms>0&&bax1>=bx1&&bax2<=bx2&&bax1<bax2&&bay1<by1;\n        bool hr=rms>0&&ray1>=by1&&ray2<=by2&&ray1<ray2&&rax2>bx2;\n        bool hl=ls>0&&lay1>=by1&&lay2<=by2&&lay1<lay2&&lax1<bx1;\n        int ct=ht?2*(tay2-by2):0,cb2=hb?2*(by1-bay1):0,cr2=hr?2*(rax2-bx2):0,cl=hl?2*(bx1-lax1):0;\n        int P_b=2*(bx2-bx1)+2*(by2-by1),bud=400000-P_b;\n        // Brute force optimal selection of main arms (2^4=16 subsets, guaranteed optimal)\n        {\n            bool bht=false,bhb=false,bhr=false,bhl=false;int bsc=-1;\n            for(int mask=0;mask<16;mask++){\n                int cost=(mask&1?ct:0)+(mask&2?cb2:0)+(mask&4?cr2:0)+(mask&8?cl:0);\n                if(cost>bud)continue;\n                int sc=(mask&1?ts:0)+(mask&2?bms:0)+(mask&4?rms:0)+(mask&8?ls:0);\n                if(sc>bsc){bsc=sc;bht=mask&1;bhb=mask&2;bhr=mask&4;bhl=mask&8;}\n            }\n            ht=ht&&bht;hb=hb&&bhb;hr=hr&&bhr;hl=hl&&bhl;\n        }\n        int tc=(ht?ct:0)+(hb?cb2:0)+(hr?cr2:0)+(hl?cl:0);\n        struct AI{int c1,c2,sw,score,side;};\n        vector<AI>all_arms;\n        if(ht)all_arms.push_back({tax1,tax2,tay2,ts,0});if(hb)all_arms.push_back({bax1,bax2,-bay1,bms,1});\n        if(hr)all_arms.push_back({ray1,ray2,rax2,rms,2});if(hl)all_arms.push_back({lay1,lay2,-lax1,ls,3});\n        int ub=tc,uv=4*(int)all_arms.size();\n        auto acf=[&](const AI&a)->int{\n            if(a.side==0)return 2*(a.sw-by2);if(a.side==1)return 2*(by1+a.sw);\n            if(a.side==2)return 2*(a.sw-bx2);return 2*(bx1+a.sw);};\n        vector<AI>sc2;\n        function<void(const vector<tuple<int,int,int>>&,int,int,int,int)>far;\n        far=[&](const vector<tuple<int,int,int>>&fish,int clo,int chi,int side,int d){\n            if(clo>chi||d<=0||elMs()>1950)return;\n            auto[sc,c1,c2,sw]=findArm(fish,clo,chi);if(sc<=0||c1<0||c1>=c2)return;\n            sc2.push_back({c1,c2,sw,sc,side});\n            far(fish,clo,c1-1,side,d-1);far(fish,c2+1,chi,side,d-1);};\n        if(ht){far(ft,bx1,tax1-1,0,dep);far(ft,tax2+1,bx2,0,dep);}\n        if(hb){far(fb,bx1,bax1-1,1,dep);far(fb,bax2+1,bx2,1,dep);}\n        if(hr){far(fr,by1,ray1-1,2,dep);far(fr,ray2+1,by2,2,dep);}\n        if(hl){far(fl,by1,lay1-1,3,dep);far(fl,lay2+1,by2,3,dep);}\n        sort(sc2.begin(),sc2.end(),[](const AI&a,const AI&b){return a.score>b.score;});\n        {\n            int ni=min((int)sc2.size(),60);\n            int W=min((bud-ub)/2,100000);\n            if(ni>0&&W>0){\n                vector<vector<int>>dp(ni+1,vector<int>(W+1,0));\n                for(int i=0;i<ni;i++){\n                    int wt=min(acf(sc2[i])/2,W),val=sc2[i].score;\n                    for(int w=0;w<=W;w++){dp[i+1][w]=dp[i][w];if(w>=wt)dp[i+1][w]=max(dp[i+1][w],dp[i][w-wt]+val);}\n                }\n                int cw=W;\n                for(int i=ni-1;i>=0;i--){\n                    int wt=min(acf(sc2[i])/2,W),val=sc2[i].score;\n                    if(cw>=wt&&dp[i+1][cw]==dp[i][cw-wt]+val){\n                        int c=acf(sc2[i]);\n                        if(ub+c<=bud&&uv+4<=996){all_arms.push_back(sc2[i]);ub+=c;uv+=4;}\n                        cw-=wt;\n                    }\n                }\n                for(int i=ni;i<(int)sc2.size();i++){int c=acf(sc2[i]);if(c<=0||ub+c>bud||uv+4>996)continue;all_arms.push_back(sc2[i]);ub+=c;uv+=4;}\n            }else{for(auto&arm:sc2){int c=acf(arm);if(c<=0||ub+c>bud||uv+4>996)continue;all_arms.push_back(arm);ub+=c;uv+=4;}}\n        }\n        int bs=evalRect(bx1,bx2,by1,by2),combined=bs;\n        for(auto&a:all_arms)combined+=a.score;\n        if(combined<=global_best)return;\n        if(all_arms.empty()){\n            if(bs>global_best){global_best=bs;\n                int x1=bx1,x2=bx2,y1=by1,y2=by2;\n                if(x1>=x2){if(x2<CMAX)x2++;else x1--;}if(y1>=y2){if(y2<CMAX)y2++;else y1--;}\n                cout<<4<<\"\\n\"<<x1<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y1<<\"\\n\"<<x2<<\" \"<<y2<<\"\\n\"<<x1<<\" \"<<y2<<\"\\n\";}\n            return;}\n        vector<AI>ta,ba3,ra,la3;\n        for(auto&a:all_arms){if(a.side==0)ta.push_back(a);else if(a.side==1)ba3.push_back(a);\n            else if(a.side==2)ra.push_back(a);else la3.push_back(a);}\n        sort(ba3.begin(),ba3.end(),[](auto&a,auto&b){return a.c1<b.c1;});\n        sort(ra.begin(),ra.end(),[](auto&a,auto&b){return a.c1<b.c1;});\n        sort(ta.begin(),ta.end(),[](auto&a,auto&b){return a.c2>b.c2;});\n        sort(la3.begin(),la3.end(),[](auto&a,auto&b){return a.c2>b.c2;});\n        vector<pair<int,int>>v;\n        v.push_back({bx1,by1});\n        {int cx=bx1;for(auto&a:ba3){int b1=-a.sw;if(a.c1>cx)v.push_back({a.c1,by1});\n            v.push_back({a.c1,b1});v.push_back({a.c2,b1});v.push_back({a.c2,by1});cx=a.c2;}}\n        v.push_back({bx2,by1});\n        {int cy=by1;for(auto&a:ra){if(a.c1>cy)v.push_back({bx2,a.c1});\n            v.push_back({a.sw,a.c1});v.push_back({a.sw,a.c2});v.push_back({bx2,a.c2});cy=a.c2;}}\n        v.push_back({bx2,by2});\n        {int cx=bx2;for(auto&a:ta){if(a.c2<cx)v.push_back({a.c2,by2});\n            v.push_back({a.c2,a.sw});v.push_back({a.c1,a.sw});v.push_back({a.c1,by2});cx=a.c1;}}\n        v.push_back({bx1,by2});\n        {int cy=by2;for(auto&a:la3){int lx=-a.sw;if(a.c2<cy)v.push_back({bx1,a.c2});\n            v.push_back({lx,a.c2});v.push_back({lx,a.c1});v.push_back({bx1,a.c1});cy=a.c1;}}\n        vector<pair<int,int>>res;\n        for(auto&p:v){if(res.empty()||res.back()!=p)res.push_back(p);}\n        while(res.size()>1&&res.front()==res.back())res.pop_back();\n        if((int)res.size()<4)return;\n        {set<pair<int,int>>vs(res.begin(),res.end());if((int)vs.size()!=(int)res.size())return;}\n        global_best=combined;\n        cout<<(int)res.size()<<\"\\n\";for(auto&[x,y]:res)cout<<x<<\" \"<<y<<\"\\n\";};\n    for(int i=0;i<(int)top_bases.size()&&elMs()<1950;i++){\n        int dep=(i==0)?3:2;\n        runPipeline(top_bases[i].x1,top_bases[i].x2,top_bases[i].y1,top_bases[i].y2,dep);}\n    return 0;}","ahc040":"#pragma GCC optimize(\"O3,unroll-loops\")\n#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\n\nint N, T;\nvector<double> W, H;\ndouble sW, sH, mxW, mxH, totA;\n\nstruct Op { int p, r; char d; int b; };\n\npair<ll,ll> simulate(const vector<Op>& ops) {\n    vector<ll> x0(N,0),y0(N,0),x1(N,0),y1(N,0);\n    vector<bool> pl(N,false);\n    for (const auto& o : ops) {\n        int p = o.p;\n        ll w = max(1LL, llround(o.r ? H[p] : W[p]));\n        ll h = max(1LL, llround(o.r ? W[p] : H[p]));\n        if (o.d == 'U') {\n            ll xl = o.b >= 0 ? x1[o.b] : 0LL;\n            ll yt = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && x0[i] < xl+w && x1[i] > xl)\n                    yt = max(yt, y1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        } else {\n            ll yt = o.b >= 0 ? y1[o.b] : 0LL;\n            ll xl = 0;\n            for (int i = 0; i < N; i++)\n                if (pl[i] && y0[i] < yt+h && y1[i] > yt)\n                    xl = max(xl, x1[i]);\n            x0[p]=xl; y0[p]=yt; x1[p]=xl+w; y1[p]=yt+h;\n        }\n        pl[p] = true;\n    }\n    ll rW=0, rH=0;\n    for (int i = 0; i < N; i++)\n        if (pl[i]) { rW=max(rW,x1[i]); rH=max(rH,y1[i]); }\n    return {rW, rH};\n}\n\n// col=false: shelf packing (rows); col=true: column packing\n// For col=false, line0 uses U, rest use L\n// For col=true,  line0 uses L, rest use U\nvector<Op> make_pack(const vector<int>& rot, double tgt, bool col) {\n    vector<Op> ops; ops.reserve(N);\n    int cl = -1; double cm = 0;\n    vector<int> lr; vector<double> lc;\n    int p0 = -1;\n    for (int i = 0; i < N; i++) {\n        double m = col ? (rot[i] ? W[i] : H[i]) : (rot[i] ? H[i] : W[i]);\n        double c = col ? (rot[i] ? H[i] : W[i]) : (rot[i] ? W[i] : H[i]);\n        if (cl < 0 || cm + m > tgt) {\n            cl++; cm = m;\n            lr.push_back(i); lc.push_back(c);\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', -1});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        } else {\n            cm += m;\n            if (c > lc[cl]) { lc[cl]=c; lr[cl]=i; }\n            if (cl == 0) {\n                ops.push_back({i, rot[i], col?'L':'U', p0});\n                p0 = i;\n            } else {\n                ops.push_back({i, rot[i], col?'U':'L', lr[cl-1]});\n            }\n        }\n    }\n    return ops;\n}\n\ndouble calc_score(const vector<int>& rot, double tgt, bool col) {\n    auto [a,b] = simulate(make_pack(rot, tgt, col));\n    return (double)(a+b);\n}\n\nint main() {\n    ios_base::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    double sigma;\n    cin >> N >> T >> sigma;\n    W.resize(N); H.resize(N);\n    for (int i = 0; i < N; i++) cin >> W[i] >> H[i];\n\n    sW=sH=mxW=mxH=totA=0;\n    for (int i = 0; i < N; i++) {\n        sW+=W[i]; sH+=H[i];\n        mxW=max(mxW,W[i]); mxH=max(mxH,H[i]);\n        totA+=W[i]*H[i];\n    }\n\n    const double BUDGET = 2600.0;\n    auto t0 = chrono::steady_clock::now();\n    auto now = [&]() {\n        return chrono::duration<double,milli>(chrono::steady_clock::now()-t0).count();\n    };\n\n    vector<int> g_rot;\n    double g_tgt=0, g_score=1e18;\n    bool g_col=false;\n\n    for (int t = 0; t < T; t++) {\n        double ts = now();\n        double per = max(1.0, (BUDGET - ts) / (T - t));\n        double dl = ts + per * 0.95;\n\n        mt19937 rng(t * 1234567891u ^ 987654321u);\n        uniform_real_distribution<double> uni(0,1);\n\n        bool col;\n        double lo, hi, tgt;\n        vector<int> rot(N);\n\n        if (t < (T+1)/2) {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            // Init rotation: minimize cross-dim\n            for (int i = 0; i < N; i++)\n                rot[i] = col ? (H[i]<W[i] ? 1:0) : (W[i]<H[i] ? 1:0);\n            int nf = max(1, (int)sqrt((double)t+0.1));\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.4)));\n        } else if (g_score < 1e17) {\n            rot=g_rot; col=g_col; tgt=g_tgt;\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            int nf = max(1, N/8);\n            for (int k = 0; k < nf; k++) rot[rng()%N] ^= 1;\n            tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.12)));\n        } else {\n            col = (t & 1);\n            lo = col ? mxH : mxW;\n            hi = col ? sH  : sW;\n            tgt = max(lo, min(hi, sqrt(totA)));\n            for (int i = 0; i < N; i++) rot[i] = rng()%2;\n        }\n\n        // Greedy rotation improvement\n        double cur = calc_score(rot, tgt, col);\n        for (int i = 0; i < N; i++) {\n            rot[i] ^= 1;\n            double ns = calc_score(rot, tgt, col);\n            if (ns < cur) cur = ns;\n            else rot[i] ^= 1;\n        }\n\n        vector<int> br=rot;\n        double bt=tgt;\n        bool bc=col;\n        double bs=cur;\n\n        double Th = cur*0.05+1.0;\n        double Tl = max(1.0, cur*1e-5);\n\n        // Simulated Annealing\n        for (int it=0; ; it++) {\n            if ((it&63)==0 && now()>=dl) break;\n            double frac = max(0.0, min(1.0, (now()-ts)/per));\n            double Tc = max(Tl, Th * pow(Tl/Th, frac));\n\n            int mv = rng()%10, fi=-1;\n            double ot=tgt;\n            bool oc=col;\n            double olo=lo, ohi=hi;\n\n            if (mv < 7) {\n                fi = rng()%N;\n                rot[fi] ^= 1;\n            } else if (mv < 9) {\n                tgt = max(lo, min(hi, tgt * exp((uni(rng)*2-1)*0.35)));\n            } else {\n                col ^= 1;\n                lo = col ? mxH : mxW;\n                hi = col ? sH  : sW;\n                tgt = max(lo, min(hi, ot));\n            }\n\n            double ns = calc_score(rot, tgt, col);\n            double d = ns - cur;\n            if (d <= 0 || uni(rng) < exp(-d/Tc)) {\n                cur = ns;\n                if (ns < bs) { bs=ns; br=rot; bt=tgt; bc=col; }\n            } else {\n                if (fi >= 0) rot[fi] ^= 1;\n                else if (mv < 9) tgt = ot;\n                else { col=oc; lo=olo; hi=ohi; tgt=ot; }\n            }\n        }\n\n        // Final greedy passes\n        for (int pass=0; pass<3; pass++) {\n            bool imp=false;\n            for (int i=0; i<N; i++) {\n                br[i] ^= 1;\n                double ns = calc_score(br, bt, bc);\n                if (ns < bs) { bs=ns; imp=true; }\n                else br[i] ^= 1;\n            }\n            if (!imp) break;\n        }\n\n        if (bs < g_score) { g_score=bs; g_rot=br; g_tgt=bt; g_col=bc; }\n\n        auto ops = make_pack(br, bt, bc);\n        cout << (int)ops.size() << \"\\n\";\n        for (const auto& op : ops)\n            cout << op.p << \" \" << op.r << \" \" << op.d << \" \" << op.b << \"\\n\";\n        cout.flush();\n\n        ll Wf, Hf;\n        cin >> Wf >> Hf;\n    }\n\n    return 0;\n}","ahc041":"#include <bits/stdc++.h>\nusing namespace std;\ntypedef long long ll;\nint N,M,H,A[1000];\nvector<int>G[1000];\nint par[1000],dep[1000],ssm[1000],mdn[1000];\nvector<int>ch[1000];\nvoid dfs_init(int v){ssm[v]=A[v];mdn[v]=0;for(int c:ch[v]){dfs_init(c);ssm[v]+=ssm[c];mdn[v]=max(mdn[v],mdn[c]+1);}}\nvoid push_dep(int v,int d){dep[v]=d;for(int c:ch[v])push_dep(c,d+1);}\nbool in_sub(int w,int v){for(;w!=-1;w=par[w])if(w==v)return true;return false;}\nvoid pull_ssm(int v){for(;v!=-1;v=par[v]){int s=A[v];for(int c:ch[v])s+=ssm[c];ssm[v]=s;}}\nvoid pull_mdn(int v){for(;v!=-1;v=par[v]){int m=0;for(int c:ch[v])m=max(m,mdn[c]+1);mdn[v]=m;}}\nvoid do_move(int v,int np){int op=par[v];if(op!=-1){auto&c=ch[op];c.erase(find(c.begin(),c.end(),v));}par[v]=np;if(np!=-1){ch[np].push_back(v);push_dep(v,dep[np]+1);}else push_dep(v,0);if(op!=-1){pull_ssm(op);pull_mdn(op);}if(np!=-1){pull_ssm(np);pull_mdn(np);}}\nvoid rebuild(){for(int i=0;i<N;i++)ch[i].clear();fill(dep,dep+N,0);for(int v=0;v<N;v++)if(par[v]!=-1)ch[par[v]].push_back(v);for(int v=0;v<N;v++)if(par[v]==-1){queue<int>q;q.push(v);while(!q.empty()){int u=q.front();q.pop();for(int c:ch[u]){dep[c]=dep[u]+1;q.push(c);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nll compute_score(){ll s=0;for(int i=0;i<N;i++)s+=(ll)(dep[i]+1)*A[i];return s;}\nvoid run_greedy(mt19937&rng){for(int iter=0;;iter++){bool ok=false;vector<int>p(N);iota(p.begin(),p.end(),0);if(iter==0)sort(p.begin(),p.end(),[](int a,int b){return A[a]>A[b];});else shuffle(p.begin(),p.end(),rng);for(int v:p){int lim=H-1-mdn[v];if(lim<0)continue;int bp=par[v];ll bg=0;for(int w:G[v]){if(dep[w]>lim||in_sub(w,v))continue;ll g=(ll)(dep[w]+1-dep[v])*ssm[v];if(g>bg){bg=g;bp=w;}}if(bg>0){do_move(v,bp);ok=true;}}if(!ok)break;}}\nvoid build_bfs(vector<int>&ord){fill(par,par+N,-1);fill(dep,dep+N,0);for(int i=0;i<N;i++)ch[i].clear();vector<bool>vis(N,false);for(int s:ord){if(vis[s])continue;queue<int>q;q.push(s);vis[s]=true;while(!q.empty()){int v=q.front();q.pop();if(dep[v]>=H)continue;for(int u:G[v])if(!vis[u]){vis[u]=true;par[u]=v;dep[u]=dep[v]+1;ch[v].push_back(u);q.push(u);}}}for(int v=0;v<N;v++)if(par[v]==-1)dfs_init(v);}\nvoid greedy_one(int v,ll&cur){if(dep[v]+mdn[v]>=H)return;int lim=H-1-mdn[v];int bp=par[v];ll bg=0;for(int w:G[v]){if(dep[w]>lim||in_sub(w,v))continue;ll g=(ll)(dep[w]+1-dep[v])*ssm[v];if(g>bg){bg=g;bp=w;}}if(bg>0){do_move(v,bp);cur+=bg;}}\nint main(){\n    ios::sync_with_stdio(false);cin.tie(0);\n    cin>>N>>M>>H;for(int i=0;i<N;i++)cin>>A[i];\n    for(int i=0;i<M;i++){int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}\n    for(int i=0;i<N;i++){int x,y;cin>>x>>y;}\n    auto t0=chrono::steady_clock::now();\n    mt19937 rng(42);\n    ll best_sc=-1;vector<int>best_par(N);\n    for(int trial=0;;trial++){\n        if(chrono::duration<double>(chrono::steady_clock::now()-t0).count()>0.30)break;\n        vector<int>ord(N);iota(ord.begin(),ord.end(),0);\n        if(trial==0)sort(ord.begin(),ord.end(),[](int a,int b){return A[a]<A[b];});\n        else shuffle(ord.begin(),ord.end(),rng);\n        build_bfs(ord);run_greedy(rng);\n        ll sc=compute_score();if(sc>best_sc){best_sc=sc;copy(par,par+N,best_par.begin());}\n    }\n    copy(best_par.begin(),best_par.end(),par);rebuild();ll cur=best_sc;\n    uniform_real_distribution<double>uni(0,1);\n    auto ts=chrono::steady_clock::now();\n    double sa_t=max(0.05,1.97-chrono::duration<double>(ts-t0).count());\n    double T=1000.0;\n    for(long long step=0;;step++){\n        if(step%10000==0){double t=chrono::duration<double>(chrono::steady_clock::now()-ts).count();if(t>=sa_t)break;T=1000.0*pow(0.001,t/sa_t);}\n        int v=rng()%N;int lim=H-1-mdn[v];if(lim<0)continue;\n        if(G[v].empty())continue;int w=G[v][rng()%G[v].size()];\n        if(w==par[v]||dep[w]>lim||in_sub(w,v))continue;\n        ll gain=(ll)(dep[w]+1-dep[v])*ssm[v];\n        if(gain>0||(T>0.01&&uni(rng)<exp((double)gain/T))){\n            int op=par[v];\n            do_move(v,w);cur+=gain;\n            if(op!=-1)greedy_one(op,cur);\n            if(gain>0)greedy_one(v,cur);\n            if(cur>best_sc){best_sc=cur;copy(par,par+N,best_par.begin());}\n        }\n    }\n    if(chrono::duration<double>(chrono::steady_clock::now()-t0).count()<1.98){\n        copy(best_par.begin(),best_par.end(),par);rebuild();\n        run_greedy(rng);\n        ll sc=compute_score();if(sc>best_sc)copy(par,par+N,best_par.begin());\n    }\n    for(int v=0;v<N;v++){if(v)cout<<' ';cout<<best_par[v];}cout<<'\\n';\n}","ahc042":"#include <bits/stdc++.h>\nusing namespace std;\nint N,M,R_[42],C_[42],ctop[21],cbot[21],rlef[21],rrig[21];\nint gc_mode;\nint gc(int d,int v){if(gc_mode==0){if(d==0)return v+1;if(d==1)return N-v;if(d==2)return 2*(v+1);return 2*(N-v);}if(d==0)return 2*(v+1);if(d==1)return 2*(N-v);if(d==2)return v+1;return N-v;}\nint od(int k,int d){return(d<=1)?R_[k]:C_[k];}\nint ad_[42],ax_[42];\nvector<int>gv[4][21];\nvoid ins(int d,int a,int v){auto&vec=gv[d][a];vec.insert(lower_bound(vec.begin(),vec.end(),v),v);}\nvoid del(int d,int a,int v){auto&vec=gv[d][a];vec.erase(lower_bound(vec.begin(),vec.end(),v));}\nint gcv(int d,int a){if(gv[d][a].empty())return 0;return gc(d,(d==0||d==2)?gv[d][a].back():gv[d][a].front());}\nbool vg(int k,int d,int a){int r=R_[k],c=C_[k],kd=(d<=1)?r:c;if(d==0)return a==c&&kd<ctop[a];if(d==1)return a==c&&kd>cbot[a];if(d==2)return a==r&&kd<rlef[a];return a==r&&kd>rrig[a];}\nint bpc(int j){if(gc_mode==1)return 0;if(!gv[0][j].empty()&&!gv[1][j].empty())return min(gcv(0,j),gcv(1,j));return 0;}\nint bpr(int i){if(gc_mode==0)return 0;if(!gv[2][i].empty()&&!gv[3][i].empty())return min(gcv(2,i),gcv(3,i));return 0;}\nint TC(){int t=0;for(int d=0;d<4;d++)for(int i=0;i<N;i++)t+=gcv(d,i);for(int j=0;j<N;j++)t+=bpc(j);for(int i=0;i<N;i++)t+=bpr(i);return t;}\nint g1(int k,int nd,int na){if((ad_[k]==nd&&ax_[k]==na)||!vg(k,nd,na))return 0;int od_=ad_[k],oax=ax_[k],kdo=od(k,od_),ndo=od(k,nd);int axs[4];int nax=0;auto add=[&](int d,int x){int e=(d<=1)?x:N+x;for(int i=0;i<nax;i++)if(axs[i]==e)return;axs[nax++]=e;};add(od_,oax);add(nd,na);auto gp=[&](int e)->int{return(e<N)?bpc(e):bpr(e-N);};int og=gcv(od_,oax)+gcv(nd,na);for(int i=0;i<nax;i++)og+=gp(axs[i]);del(od_,oax,kdo);ins(nd,na,ndo);int ng=gcv(od_,oax)+gcv(nd,na);for(int i=0;i<nax;i++)ng+=gp(axs[i]);ins(od_,oax,kdo);del(nd,na,ndo);return og-ng;}\nint g2(int a,int b,int nd,int na){if(!vg(a,nd,na)||!vg(b,nd,na))return 0;bool at=(ad_[a]==nd&&ax_[a]==na),bt=(ad_[b]==nd&&ax_[b]==na);if(at&&bt)return 0;if(at)return g1(b,nd,na);if(bt)return g1(a,nd,na);int da=ad_[a],dax=ax_[a],db=ad_[b],dbx=ax_[b];bool sm=(da==db&&dax==dbx);int axs[4];int nax=0;auto add=[&](int d,int x){int e=(d<=1)?x:N+x;for(int i=0;i<nax;i++)if(axs[i]==e)return;axs[nax++]=e;};add(da,dax);add(db,dbx);add(nd,na);auto gp=[&](int e)->int{return(e<N)?bpc(e):bpr(e-N);};int og=gcv(da,dax);if(!sm)og+=gcv(db,dbx);og+=gcv(nd,na);for(int i=0;i<nax;i++)og+=gp(axs[i]);int ao=od(a,da),bo=od(b,db),an=od(a,nd),bn=od(b,nd);del(da,dax,ao);del(db,dbx,bo);ins(nd,na,an);ins(nd,na,bn);int ng=gcv(da,dax);if(!sm)ng+=gcv(db,dbx);ng+=gcv(nd,na);for(int i=0;i<nax;i++)ng+=gp(axs[i]);del(nd,na,an);del(nd,na,bn);ins(da,dax,ao);ins(db,dbx,bo);return og-ng;}\nvoid mv1(int k,int nd,int na){del(ad_[k],ax_[k],od(k,ad_[k]));ad_[k]=nd;ax_[k]=na;ins(nd,na,od(k,nd));}\nvoid mv2(int a,int b,int nd,int na){del(ad_[a],ax_[a],od(a,ad_[a]));del(ad_[b],ax_[b],od(b,ad_[b]));ad_[a]=nd;ax_[a]=na;ad_[b]=nd;ax_[b]=na;ins(nd,na,od(a,nd));ins(nd,na,od(b,nd));}\nvector<int>co[21],ro[21];\nvoid ls(){bool imp=true;while(imp){imp=false;int bg=0,bt=-1,bk=-1,ba=-1,bb=-1,bd=-1,bx=-1;for(int k=0;k<M;k++){int r=R_[k],c=C_[k];auto t1=[&](int d,int a){int g=g1(k,d,a);if(g>bg){bg=g;bt=1;bk=k;bd=d;bx=a;}};if(r<ctop[c])t1(0,c);if(r>cbot[c])t1(1,c);if(c<rlef[r])t1(2,r);if(c>rrig[r])t1(3,r);}for(int j=0;j<N;j++){int nn=co[j].size();for(int ai=0;ai<nn;ai++)for(int bi=ai+1;bi<nn;bi++){int a=co[j][ai],b=co[j][bi];auto t=[&](int d,int x){int g=g2(a,b,d,x);if(g>bg){bg=g;bt=2;ba=a;bb=b;bd=d;bx=x;}};t(0,j);t(1,j);}}for(int i=0;i<N;i++){int nn=ro[i].size();for(int ai=0;ai<nn;ai++)for(int bi=ai+1;bi<nn;bi++){int a=ro[i][ai],b=ro[i][bi];auto t=[&](int d,int x){int g=g2(a,b,d,x);if(g>bg){bg=g;bt=2;ba=a;bb=b;bd=d;bx=x;}};t(2,i);t(3,i);}}if(bg>0){if(bt==1)mv1(bk,bd,bx);else mv2(ba,bb,bd,bx);imp=true;}}}\nint bc=INT_MAX,bad_[42],bax_[42];\nvoid sb(){bc=TC();for(int k=0;k<M;k++){bad_[k]=ad_[k];bax_[k]=ax_[k];}}\nvoid rb(){for(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int k=0;k<M;k++){ad_[k]=bad_[k];ax_[k]=bax_[k];ins(ad_[k],ax_[k],od(k,ad_[k]));}}\nvoid grdy(bool det,mt19937&rng){for(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int ki=0;ki<M;ki++){int r=R_[ki],c=C_[ki];pair<int,int>ops[4];int n=0;if(r<ctop[c])ops[n++]={0,c};if(r>cbot[c])ops[n++]={1,c};if(c<rlef[r])ops[n++]={2,r};if(c>rrig[r])ops[n++]={3,r};int gd,ga;if(det){int best=INT_MAX;gd=ops[0].first;ga=ops[0].second;for(int i=0;i<n;i++){int v=gc(ops[i].first,od(ki,ops[i].first));if(v<best){best=v;gd=ops[i].first;ga=ops[i].second;}}}else{auto[d_,a_]=ops[rng()%n];gd=d_;ga=a_;}ad_[ki]=gd;ax_[ki]=ga;ins(gd,ga,od(ki,gd));}}\nvoid out_v1(){\n    for(int d=2;d<4;d++)for(int a=0;a<N;a++){if(gv[d][a].empty())continue;int rep=(d==2)?gv[d][a].back():gv[d][a].front();int s=(d==2)?rep+1:N-rep;for(int k=0;k<s;k++)cout<<(d==2?\"L \":\"R \")<<a<<'\\n';for(int k=0;k<s;k++)cout<<(d==2?\"R \":\"L \")<<a<<'\\n';}\n    for(int j=0;j<N;j++){bool hu=!gv[0][j].empty(),hd=!gv[1][j].empty();if(!hu&&!hd)continue;if(hu&&!hd){int s=gv[0][j].back()+1;for(int k=0;k<s;k++)cout<<\"U \"<<j<<'\\n';}else if(!hu&&hd){int s=N-gv[1][j].front();for(int k=0;k<s;k++)cout<<\"D \"<<j<<'\\n';}else{int sU=gv[0][j].back()+1,sD=N-gv[1][j].front();if(sD<=sU){for(int k=0;k<sD;k++)cout<<\"D \"<<j<<'\\n';for(int k=0;k<sD;k++)cout<<\"U \"<<j<<'\\n';for(int k=0;k<sU;k++)cout<<\"U \"<<j<<'\\n';}else{for(int k=0;k<sU;k++)cout<<\"U \"<<j<<'\\n';for(int k=0;k<sU;k++)cout<<\"D \"<<j<<'\\n';for(int k=0;k<sD;k++)cout<<\"D \"<<j<<'\\n';}}}\n}\nvoid out_v2(){\n    for(int d=0;d<2;d++)for(int a=0;a<N;a++){if(gv[d][a].empty())continue;int rep=(d==0)?gv[d][a].back():gv[d][a].front();int s=(d==0)?rep+1:N-rep;for(int k=0;k<s;k++)cout<<(d==0?\"U \":\"D \")<<a<<'\\n';for(int k=0;k<s;k++)cout<<(d==0?\"D \":\"U \")<<a<<'\\n';}\n    for(int a=0;a<N;a++){bool hl=!gv[2][a].empty(),hr=!gv[3][a].empty();if(!hl&&!hr)continue;if(hl&&!hr){int s=gv[2][a].back()+1;for(int k=0;k<s;k++)cout<<\"L \"<<a<<'\\n';}else if(!hl&&hr){int s=N-gv[3][a].front();for(int k=0;k<s;k++)cout<<\"R \"<<a<<'\\n';}else{int sL=gv[2][a].back()+1,sR=N-gv[3][a].front();if(sR<=sL){for(int k=0;k<sR;k++)cout<<\"R \"<<a<<'\\n';for(int k=0;k<sR;k++)cout<<\"L \"<<a<<'\\n';for(int k=0;k<sL;k++)cout<<\"L \"<<a<<'\\n';}else{for(int k=0;k<sL;k++)cout<<\"L \"<<a<<'\\n';for(int k=0;k<sL;k++)cout<<\"R \"<<a<<'\\n';for(int k=0;k<sR;k++)cout<<\"R \"<<a<<'\\n';}}}\n}\nint main(){ios_base::sync_with_stdio(false);cin.tie(NULL);cin>>N;vector<string>brd(N);for(int i=0;i<N;i++)cin>>brd[i];M=0;for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(brd[i][j]=='x'){R_[M]=i;C_[M]=j;M++;}if(!M)return 0;fill(ctop,ctop+N,N);fill(cbot,cbot+N,-1);fill(rlef,rlef+N,N);fill(rrig,rrig+N,-1);for(int i=0;i<N;i++)for(int j=0;j<N;j++)if(brd[i][j]=='o'){ctop[j]=min(ctop[j],i);cbot[j]=max(cbot[j],i);rlef[i]=min(rlef[i],j);rrig[i]=max(rrig[i],j);}for(int k=0;k<M;k++){co[C_[k]].push_back(k);ro[R_[k]].push_back(k);}\nmt19937 rng(42);\ngc_mode=0;bc=INT_MAX;grdy(true,rng);ls();sb();for(int i=0;i<149;i++){grdy(false,rng);ls();if(TC()<bc)sb();}\nint T1=bc;int bad1[42],bax1[42];memcpy(bad1,bad_,M*4);memcpy(bax1,bax_,M*4);\ngc_mode=1;bc=INT_MAX;grdy(true,rng);ls();sb();for(int i=0;i<149;i++){grdy(false,rng);ls();if(TC()<bc)sb();}\nint T2=bc;int bad2[42],bax2[42];memcpy(bad2,bad_,M*4);memcpy(bax2,bax_,M*4);\nif(T1<=T2){gc_mode=0;for(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int k=0;k<M;k++){ad_[k]=bad1[k];ax_[k]=bax1[k];ins(ad_[k],ax_[k],od(k,ad_[k]));}out_v1();}\nelse{gc_mode=1;for(int d=0;d<4;d++)for(int i=0;i<N;i++)gv[d][i].clear();for(int k=0;k<M;k++){ad_[k]=bad2[k];ax_[k]=bax2[k];ins(ad_[k],ax_[k],od(k,ad_[k]));}out_v2();}\nreturn 0;}","ahc044":"#include <bits/stdc++.h>\nusing namespace std;\nconst int MAXN=100;\nint N,L,T[MAXN],a[MAXN],b[MAXN],cv[MAXN],fv[MAXN],flow[MAXN];\nvoid computeFlow(){fill(flow,flow+N,0);for(int i=0;i<N;i++){flow[a[i]]+=cv[i];flow[b[i]]+=fv[i];}flow[0]++;}\nlong long flowErr(){long long e=0;for(int j=0;j<N;j++)e+=abs(flow[j]-T[j]);return e;}\nbool checkFwd(){bool vis[MAXN]={};int q[MAXN],qh=0,qt=0;vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];if(!vis[a[x]]){vis[a[x]]=true;q[qt++]=a[x];}if(!vis[b[x]]){vis[b[x]]=true;q[qt++]=b[x];}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nbool checkBwd(){if(T[0]==0)return true;static int rl[MAXN][2*MAXN],rc[MAXN];static bool vis[MAXN];int q[MAXN],qh=0,qt=0;fill(rc,rc+N,0);for(int i=0;i<N;i++){rl[a[i]][rc[a[i]]++]=i;rl[b[i]][rc[b[i]]++]=i;}fill(vis,vis+N,false);vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];for(int k=0;k<rc[x];k++){int y=rl[x][k];if(!vis[y]){vis[y]=true;q[qt++]=y;}}}for(int j=0;j<N;j++)if(T[j]>0&&!vis[j])return false;return true;}\nvoid fixFwdConn(){for(int pass=0;pass<N;pass++){bool vis[MAXN]={};int q[MAXN],qh=0,qt=0;vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];if(!vis[a[x]]){vis[a[x]]=true;q[qt++]=a[x];}if(!vis[b[x]]){vis[b[x]]=true;q[qt++]=b[x];}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bd=(long long)4e18;int bi=-1;bool bA=false;for(int i=0;i<N;i++){if(!vis[i])continue;if(a[i]!=u){int oa=a[i],w=cv[i];long long d=(w>0)?((long long)(abs(flow[oa]-w-T[oa])-abs(flow[oa]-T[oa]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bd){bd=d;bi=i;bA=true;}}if(b[i]!=u){int ob=b[i],w=fv[i];long long d=(w>0)?((long long)(abs(flow[ob]-w-T[ob])-abs(flow[ob]-T[ob]))+(long long)(abs(flow[u]+w-T[u])-abs(flow[u]-T[u]))):0LL;if(d<bd){bd=d;bi=i;bA=false;}}}if(bi<0)break;if(bA){if(cv[bi]>0){flow[a[bi]]-=cv[bi];flow[u]+=cv[bi];}a[bi]=u;}else{if(fv[bi]>0){flow[b[bi]]-=fv[bi];flow[u]+=fv[bi];}b[bi]=u;}}}\nvoid fixBwdConn(){if(T[0]==0)return;for(int pass=0;pass<N;pass++){static int rl[MAXN][2*MAXN],rc[MAXN];static bool vis[MAXN];int q[MAXN],qh=0,qt=0;fill(rc,rc+N,0);for(int i=0;i<N;i++){rl[a[i]][rc[a[i]]++]=i;rl[b[i]][rc[b[i]]++]=i;}fill(vis,vis+N,false);vis[0]=true;q[qt++]=0;while(qh<qt){int x=q[qh++];for(int k=0;k<rc[x];k++){int y=rl[x][k];if(!vis[y]){vis[y]=true;q[qt++]=y;}}}int u=-1;for(int j=0;j<N;j++)if(T[j]>0&&!vis[j]){u=j;break;}if(u<0)break;long long bd=(long long)4e18;int bk=-1;bool bA=false;for(int k=0;k<N;k++){if(!vis[k])continue;if(a[u]!=k){int oa=a[u];a[u]=k;bool fok=checkFwd();a[u]=oa;if(!fok)continue;int w=cv[u];long long d=(w>0)?((long long)(abs(flow[oa]-w-T[oa])-abs(flow[oa]-T[oa]))+(long long)(abs(flow[k]+w-T[k])-abs(flow[k]-T[k]))):0LL;if(d<bd){bd=d;bk=k;bA=true;}}if(b[u]!=k){int ob=b[u];b[u]=k;bool fok=checkFwd();b[u]=ob;if(!fok)continue;int w=fv[u];long long d=(w>0)?((long long)(abs(flow[ob]-w-T[ob])-abs(flow[ob]-T[ob]))+(long long)(abs(flow[k]+w-T[k])-abs(flow[k]-T[k]))):0LL;if(d<bd){bd=d;bk=k;bA=false;}}}if(bk<0)break;if(bA){if(cv[u]>0){flow[a[u]]-=cv[u];flow[bk]+=cv[u];}a[u]=bk;}else{if(fv[u]>0){flow[b[u]]-=fv[u];flow[bk]+=fv[u];}b[u]=bk;}}}\nvoid flowSearch(){long long ce=flowErr();bool imp=true;while(imp){imp=false;for(int i=0;i<N;i++)for(int t2=0;t2<2;t2++){int old=t2?b[i]:a[i],w=t2?fv[i]:cv[i];int bj=-1;long long bd=0;for(int j=0;j<N;j++){if(j==old)continue;long long d=(w>0)?((long long)(abs(flow[old]-w-T[old])-abs(flow[old]-T[old]))+(long long)(abs(flow[j]+w-T[j])-abs(flow[j]-T[j]))):0LL;if(d<bd){bd=d;bj=j;}}if(bj>=0){if(w>0){flow[old]-=w;flow[bj]+=w;}ce+=bd;if(t2)b[i]=bj;else a[i]=bj;imp=true;}}}}\nlong long simulateFull(int co[],int od[],int ed[]){int cnt[MAXN]={},vc[MAXN]={};fill(od,od+N,0);fill(ed,ed+N,0);int cur=0;cnt[0]=vc[0]=1;for(int w=2;w<=L;w++){if(vc[cur]&1){od[cur]++;cur=a[cur];}else{ed[cur]++;cur=b[cur];}cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++){co[j]=cnt[j];e+=abs(cnt[j]-T[j]);}return e;}\nlong long simulate(){int cnt[MAXN]={},vc[MAXN]={};int cur=0;cnt[0]=vc[0]=1;for(int w=2;w<=L;w++){int nxt=(vc[cur]&1)?a[cur]:b[cur];cur=nxt;cnt[cur]++;vc[cur]++;}long long e=0;for(int j=0;j<N;j++)e+=abs(cnt[j]-T[j]);return e;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    cin>>N>>L;for(int i=0;i<N;i++)cin>>T[i];\n    for(int i=0;i<N;i++){cv[i]=(T[i]+1)/2;fv[i]=T[i]/2;}\n    for(int i=0;i<N;i++)a[i]=b[i]=0;\n    vector<tuple<int,int,int>>items;\n    for(int i=0;i<N;i++){items.emplace_back(cv[i],0,i);items.emplace_back(fv[i],1,i);}\n    sort(items.rbegin(),items.rend());\n    int rem[MAXN];for(int j=0;j<N;j++)rem[j]=T[j];if(rem[0]>0)rem[0]--;\n    priority_queue<pair<int,int>>pq;for(int j=0;j<N;j++)pq.push({rem[j],j});\n    for(auto&[w,type,emp]:items){auto[cap,bin]=pq.top();pq.pop();if(type==0)a[emp]=bin;else b[emp]=bin;rem[bin]-=w;pq.push({rem[bin],bin});}\n    computeFlow();flowSearch();fixFwdConn();flowSearch();fixBwdConn();flowSearch();fixFwdConn();\n    int co[MAXN],od[MAXN],ed[MAXN];\n    long long curErr=simulateFull(co,od,ed),bestErr=curErr;\n    int ba[MAXN],bb[MAXN];copy(a,a+N,ba);copy(b,b+N,bb);\n    mt19937 rng(42);\n    auto t0=chrono::steady_clock::now();\n    auto el=[&](){return chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now()-t0).count();};\n    struct Cand{long long d;int i,t,j;bool operator<(const Cand&o)const{return d<o.d;}};\n    vector<Cand>cands;cands.reserve(20001);\n    int noImp=0;\n    // PHASE 1: EXACT 49,136,088 proxy search (1750ms)\n    while(el()<1750000LL){\n        cands.clear();\n        for(int i=0;i<N;i++){\n            if(od[i]>0){int oj=a[i];for(int j=0;j<N;j++){if(j==oj)continue;long long d2=(long long)(abs(co[oj]-od[i]-T[oj])-abs(co[oj]-T[oj]))+(long long)(abs(co[j]+od[i]-T[j])-abs(co[j]-T[j]));cands.push_back({d2,i,0,j});}}\n            if(ed[i]>0){int oj=b[i];for(int j=0;j<N;j++){if(j==oj)continue;long long d2=(long long)(abs(co[oj]-ed[i]-T[oj])-abs(co[oj]-T[oj]))+(long long)(abs(co[j]+ed[i]-T[j])-abs(co[j]-T[j]));cands.push_back({d2,i,1,j});}}\n        }\n        int K=min((int)cands.size(),50);\n        if(K>0)partial_sort(cands.begin(),cands.begin()+K,cands.end());\n        bool found=false;\n        for(int k=0;k<K&&!found;k++){auto&[d2,i,t,j]=cands[k];int&ptr=t?b[i]:a[i];int old=ptr;ptr=j;if(!checkFwd()){ptr=old;continue;}long long err=simulate();if(err<curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}curErr=simulateFull(co,od,ed);found=true;}else ptr=old;}\n        if(!found)for(int att=0;att<20&&!found;att++){int i=rng()%N,t=rng()%2,j=(int)(rng()%N);int&ptr=t?b[i]:a[i];int old=ptr;if(j==old)continue;ptr=j;if(!checkFwd()){ptr=old;continue;}long long err=simulate();if(err<curErr){curErr=err;if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}curErr=simulateFull(co,od,ed);found=true;}else ptr=old;}\n        if(found)noImp=0;\n        else{noImp++;\n            if(noImp>=15){\n                bool pittBetter=false;\n                for(int ptry=0;ptry<3&&!pittBetter;ptry++){\n                    copy(ba,ba+N,a);copy(bb,bb+N,b);\n                    for(int p=0;p<8;p++){int i=rng()%N,t=rng()%2,j=(int)(rng()%N);if(t)b[i]=j;else a[i]=j;}\n                    computeFlow();flowSearch();fixFwdConn();\n                    long long err=simulate();\n                    if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);curErr=simulateFull(co,od,ed);pittBetter=true;}\n                }\n                if(!pittBetter){copy(ba,ba+N,a);copy(bb,bb+N,b);curErr=simulateFull(co,od,ed);}\n                noImp=0;\n            }\n        }\n    }\n    // PHASE 2: Independent rng2 bonus exploration (~150ms extra, within 2s limit)\n    // Phase 1 is UNTOUCHED above - identical to 49,136,088\n    // Phase 2 can only improve bestErr, never regress\n    mt19937 rng2(12345);\n    while(el()<1900000LL){\n        copy(ba,ba+N,a);copy(bb,bb+N,b);\n        for(int p=0;p<8;p++){int i=rng2()%N,t=rng2()%2,j=(int)(rng2()%N);if(t)b[i]=j;else a[i]=j;}\n        computeFlow();flowSearch();fixFwdConn();\n        long long err=simulate();\n        if(err<bestErr){bestErr=err;copy(a,a+N,ba);copy(b,b+N,bb);}\n    }\n    copy(ba,ba+N,a);copy(bb,bb+N,b);\n    for(int i=0;i<N;i++)cout<<a[i]<<\" \"<<b[i]<<\"\\n\";\n    return 0;\n}","ahc045":"#include <bits/stdc++.h>\nusing namespace std;\nint main() {\n    ios_base::sync_with_stdio(false); cin.tie(NULL);\n    int N,M,Q,L,W; cin>>N>>M>>Q>>L>>W;\n    vector<int>G(M);for(int&g:G)cin>>g;\n    vector<double>cx(N),cy(N);\n    for(int i=0;i<N;i++){int lx,rx,ly,ry;cin>>lx>>rx>>ly>>ry;cx[i]=(lx+rx)/2.0;cy[i]=(ly+ry)/2.0;}\n    auto ed2=[&](int a,int b)->double{double dx=cx[a]-cx[b],dy=cy[a]-cy[b];return dx*dx+dy*dy;};\n    vector<int>mpar(N,-1);vector<double>mkey(N,0);\n    {vector<bool>vis(N,false);vector<double>key(N,1e18);key[0]=0;\n    for(int it=0;it<N;it++){int u=-1;for(int v=0;v<N;v++)if(!vis[v]&&(u==-1||key[v]<key[u]))u=v;\n    vis[u]=true;mkey[u]=key[u];for(int v=0;v<N;v++)if(!vis[v]){double d=ed2(u,v);if(d<key[v]){key[v]=d;mpar[v]=u;}}}}\n    vector<vector<int>>mch(N);for(int v=1;v<N;v++)mch[mpar[v]].push_back(v);\n    for(int v=0;v<N;v++)sort(mch[v].begin(),mch[v].end(),[&](int a,int b){return mkey[a]<mkey[b];});\n    vector<int>post,preord;\n    {stack<pair<int,int>>s;s.push({0,0});while(!s.empty()){auto&[v,ci]=s.top();if(ci<(int)mch[v].size())s.push({mch[v][ci++],0});else{post.push_back(v);s.pop();}}}\n    {stack<int>s;s.push(0);while(!s.empty()){int v=s.top();s.pop();preord.push_back(v);for(int i=(int)mch[v].size()-1;i>=0;i--)s.push(mch[v][i]);}}\n    vector<int>esz(N,1);for(int v:post)for(int c:mch[v])esz[v]+=esz[c];\n    vector<pair<double,int>>elist;for(int v=1;v<N;v++)elist.push_back({mkey[v],v});\n    sort(elist.begin(),elist.end(),greater<>());\n    multiset<int>remG(G.begin(),G.end());map<int,queue<int>>szg;for(int i=0;i<M;i++)szg[G[i]].push(i);\n    vector<bool>scut(N,false),asgn(N,false);vector<vector<int>>groups(M);\n    for(auto&[w,v]:elist){if(asgn[v])continue;int s=esz[v];if(s<=0||!remG.count(s))continue;\n        remG.erase(remG.find(s));int u=mpar[v];while(u!=-1&&!scut[u]){esz[u]-=s;u=mpar[u];}scut[v]=true;\n        int gid=szg[s].front();szg[s].pop();queue<int>q;q.push(v);\n        while(!q.empty()){int nu=q.front();q.pop();if(asgn[nu])continue;groups[gid].push_back(nu);asgn[nu]=true;for(int c:mch[nu])if(!asgn[c])q.push(c);}}\n    {vector<int>rem;for(int v:preord)if(!asgn[v])rem.push_back(v);\n    int pos=0;for(int i=0;i<M;i++)if(groups[i].empty())for(int j=0;j<G[i];j++)groups[i].push_back(rem[pos++]);}\n    bool use_o2=(W<=1500); // Or-opt-2 only for small W (estimates more reliable)\n    vector<vector<int>>sc(M);\n    for(int i=0;i<M;i++){\n        int g=G[i];auto&v=groups[i];if(g<=1){sc[i]=v;continue;}\n        int lxi=0,rxi=0,lyi=0,ryi=0,d1i=0,d2i=0,d3i=0,d4i=0,ceni=0;\n        double avgx=0,avgy=0;\n        for(int k=0;k<g;k++){avgx+=cx[v[k]];avgy+=cy[v[k]];\n            if(cx[v[k]]<cx[v[lxi]])lxi=k;if(cx[v[k]]>cx[v[rxi]])rxi=k;\n            if(cy[v[k]]<cy[v[lyi]])lyi=k;if(cy[v[k]]>cy[v[ryi]])ryi=k;\n            if(cx[v[k]]+cy[v[k]]>cx[v[d1i]]+cy[v[d1i]])d1i=k;\n            if(cy[v[k]]-cx[v[k]]>cy[v[d2i]]-cx[v[d2i]])d2i=k;\n            if(cx[v[k]]+cy[v[k]]<cx[v[d3i]]+cy[v[d3i]])d3i=k;\n            if(cy[v[k]]-cx[v[k]]<cy[v[d4i]]-cx[v[d4i]])d4i=k;}\n        avgx/=g;avgy/=g;double cd=1e18;\n        for(int k=0;k<g;k++){double d=(cx[v[k]]-avgx)*(cx[v[k]]-avgx)+(cy[v[k]]-avgy)*(cy[v[k]]-avgy);if(d<cd){cd=d;ceni=k;}}\n        auto nn=[&](int s0)->vector<int>{\n            vector<bool>used(g,false);vector<int>p;p.reserve(g);p.push_back(v[s0]);used[s0]=true;\n            for(int k=1;k<g;k++){int cur=p.back();double best=1e18;int bj=-1;\n                for(int j=0;j<g;j++)if(!used[j]){double d=ed2(cur,v[j]);if(d<best){best=d;bj=j;}}\n                p.push_back(v[bj]);used[bj]=true;}return p;};\n        auto plen=[&](const vector<int>&p)->double{double l=0;for(int k=1;k<g;k++)l+=ed2(p[k-1],p[k]);return l;};\n        auto topt=[&](vector<int>&p){\n            for(int it=0;it<30;it++){bool imp=false;\n                for(int a=0;a<g-1;a++)for(int b=a+2;b<g;b++){\n                    double dold=ed2(p[a],p[a+1]);if(b+1<g)dold+=ed2(p[b],p[b+1]);\n                    double dnew=ed2(p[a],p[b]);if(b+1<g)dnew+=ed2(p[a+1],p[b+1]);\n                    if(dnew<dold-1e-9){reverse(p.begin()+a+1,p.begin()+b+1);imp=true;}}\n                if(!imp)break;}};\n        auto run_oropt=[&](vector<int>&p){\n            if(g<4)return;\n            for(int it=0;it<10;it++){\n                double bg=1e-9;int ba=-1,bj=-1;\n                for(int a=1;a<g-1;a++){int c=p[a];\n                    double rg=ed2(p[a-1],c)+ed2(c,p[a+1])-ed2(p[a-1],p[a+1]);\n                    for(int j=1;j<g;j++){if(abs(j-a)<=1)continue;\n                        double ic=ed2(p[j-1],c)+ed2(c,p[j])-ed2(p[j-1],p[j]);\n                        if(rg-ic>bg){bg=rg-ic;ba=a;bj=j;}}}\n                if(ba<0)break;\n                int moved=p[ba];\n                if(bj<ba){for(int kk=ba;kk>bj;kk--)p[kk]=p[kk-1];p[bj]=moved;}\n                else{for(int kk=ba;kk<bj-1;kk++)p[kk]=p[kk+1];p[bj-1]=moved;}\n            }};\n        auto run_oropt2=[&](vector<int>&p){\n            if(g<5)return;\n            for(int it=0;it<5;it++){\n                double bg=1e-9;int ba=-1,bj=-1,bdir=0;\n                for(int a=1;a<g-2;a++){\n                    double rg=ed2(p[a-1],p[a])+ed2(p[a+1],p[a+2])-ed2(p[a-1],p[a+2]);\n                    for(int j=1;j<g-1;j++){\n                        if(j>=a-1&&j<=a+3)continue;\n                        double base=ed2(p[j-1],p[j]);\n                        double fwd=ed2(p[j-1],p[a])+ed2(p[a+1],p[j])-base;\n                        double bwd=ed2(p[j-1],p[a+1])+ed2(p[a],p[j])-base;\n                        double best=min(fwd,bwd);\n                        if(rg-best>bg){bg=rg-best;ba=a;bj=j;bdir=(bwd<fwd)?1:0;}\n                    }\n                }\n                if(ba<0)break;\n                int c1=p[ba],c2=p[ba+1];if(bdir)swap(c1,c2);\n                int ins=(bj>ba+1)?(bj-2):bj;\n                vector<int>np;np.reserve(g);int cnt=0;\n                for(int k=0;k<g;k++){\n                    if(k==ba||k==ba+1)continue;\n                    if(cnt==ins){np.push_back(c1);np.push_back(c2);}\n                    np.push_back(p[k]);cnt++;\n                }\n                if((int)np.size()<g){np.push_back(c1);np.push_back(c2);}\n                p=move(np);\n            }};\n        set<int>v7orig({lxi,rxi,lyi,ryi,ceni});\n        vector<int>starts={lxi,rxi,lyi,ryi,d1i,d2i,d3i,d4i,ceni};\n        sort(starts.begin(),starts.end());starts.erase(unique(starts.begin(),starts.end()),starts.end());\n        double bestl=1e18,bestl2=1e18,bestl_v7=1e18;\n        vector<int>sc2,sc_v7;\n        auto upd=[&](vector<int>&p,double l,bool isv7){\n            if(l<bestl){\n                bestl2=bestl;if((int)sc[i].size()==g)sc2=sc[i];\n                bestl=l;sc[i]=p;\n            } else if(l<bestl2){bestl2=l;sc2=p;}\n            if(isv7&&l<bestl_v7){bestl_v7=l;sc_v7=p;}};\n        for(int s:starts){auto p=nn(s);topt(p);double l=plen(p);upd(p,l,v7orig.count(s)>0);}\n        {vector<int>p(v);topt(p);double l=plen(p);upd(p,l,true);}\n        auto do_opt=[&](vector<int>&p){run_oropt(p);if(use_o2)run_oropt2(p);topt(p);};\n        {auto p=sc[i];do_opt(p);sc[i]=p;}\n        double best=plen(sc[i]);\n        if((int)sc2.size()==g){auto p=sc2;do_opt(p);double l=plen(p);if(l<best){best=l;sc[i]=p;}}\n        if((int)sc_v7.size()==g){auto p=sc_v7;do_opt(p);double l=plen(p);if(l<best){best=l;sc[i]=p;}}\n    }\n    int qrem=Q;vector<vector<pair<double,pair<int,int>>>>ae(M);\n    auto dq=[&](const vector<int>&qc,int gi){if((int)qc.size()<2||qrem<=0)return;qrem--;\n        cout<<\"? \"<<qc.size();for(int c:qc)cout<<\" \"<<c;cout<<\"\\n\"<<flush;\n        for(int k=0;k+1<(int)qc.size();k++){int a,b;cin>>a>>b;ae[gi].push_back({ed2(a,b),{a,b}});}};\n    auto nw=[&](int g)->int{if(g<=1)return 0;if(g<=L)return 1;return(g-2)/(L-1)+1;};\n    int tmand=0;for(int i=0;i<M;i++)tmand+=nw(G[i]);int xtra=Q-tmand;\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;if(g<=L){dq(sc[i],i);continue;}\n        int st=0;while(true){int en=min(st+L,g);bool last=(en>=g);if(last&&en-st<L){st=g-L;en=g;}\n            dq(vector<int>(sc[i].begin()+st,sc[i].begin()+en),i);if(last)break;st+=L-1;}}\n    {vector<int>lg;for(int i=0;i<M;i++)if(G[i]>L)lg.push_back(i);\n    if(!lg.empty()&&xtra>0)for(int qi=0;qi<xtra&&qrem>0;qi++){int gi=lg[qi%(int)lg.size()];int g=G[gi];\n        int stride=max(1,g/L),off=(qi/(int)lg.size())%stride;\n        vector<int>win;for(int k=off;k<g&&(int)win.size()<L;k+=stride)win.push_back(sc[gi][k]);\n        if((int)win.size()>=2)dq(win,gi);}}\n    vector<int>par(N);auto fu=[&](int x)->int{while(par[x]!=x){par[x]=par[par[x]];x=par[x];}return x;};\n    vector<vector<pair<int,int>>>ans(M);\n    for(int i=0;i<M;i++){int g=G[i];if(g<=1)continue;for(int k:sc[i])par[k]=k;sort(ae[i].begin(),ae[i].end());\n        for(auto&[d,e]:ae[i]){int ra=fu(e.first),rb=fu(e.second);if(ra!=rb){par[ra]=rb;ans[i].push_back(e);}}\n        for(int k=1;k<g;k++){int ra=fu(sc[i][k]),rb=fu(sc[i][k-1]);if(ra!=rb){par[ra]=rb;ans[i].push_back({sc[i][k],sc[i][k-1]});}}}\n    cout<<\"!\\n\";\n    for(int i=0;i<M;i++){for(int j=0;j<G[i];j++){if(j>0)cout<<\" \";cout<<groups[i][j];}cout<<\"\\n\";\n        for(auto&[a,b]:ans[i])cout<<a<<\" \"<<b<<\"\\n\";}\n    return 0;\n}","ahc046":"#include <bits/stdc++.h>\nusing namespace std;\nconst int N=20;bool grid[N][N];\nconst int DR[]={-1,1,0,0},DC[]={0,0,-1,1};\ninline bool inB(int r,int c){return(unsigned)r<(unsigned)N&&(unsigned)c<(unsigned)N;}\ninline void slE(int r,int c,int d,int er,int ec,int &sr,int &sc){\n    switch(d){case 0:sr=(ec==c&&er>=0&&er<r)?er+1:0;sc=c;return;case 1:sr=(ec==c&&er>r&&er<N)?er-1:N-1;sc=c;return;case 2:sr=r;sc=(er==r&&ec>=0&&ec<c)?ec+1:0;return;default:sr=r;sc=(er==r&&ec>c&&ec<N)?ec-1:N-1;}}\nconst int NS1=N*N*21*21;static int d1[NS1],p1[NS1],q1[NS1];static uint8_t a1[NS1];\nvector<pair<char,char>> fp1(int r0,int c0,int tr,int tc){\n    memset(d1,-1,sizeof(d1));int S=(r0*N+c0)*441,G=(tr*N+tc)*441;if(S==G)return{};\n    d1[S]=0;int qh=0,qt=0;q1[qt++]=S;\n    while(qh<qt&&d1[G]==-1){int s=q1[qh++],t=s,ec=t%21-1;t/=21;int er=t%21-1;t/=21;int c=t%N,r=t/N,dv=d1[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];\n            if(inB(nr,nc)&&!grid[nr][nc]&&!(nr==er&&nc==ec)){int ns=(nr*N+nc)*441+(er+1)*21+(ec+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(0<<2)|d;q1[qt++]=ns;}}\n            int sr,sc;slE(r,c,d,er,ec,sr,sc);if(sr!=r||sc!=c){int ns=(sr*N+sc)*441+(er+1)*21+(ec+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(1<<2)|d;q1[qt++]=ns;}}\n            if(inB(nr,nc)){if(nr==er&&nc==ec){int ns=(r*N+c)*441;if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}else if(er==-1&&!grid[nr][nc]){int ns=(r*N+c)*441+(nr+1)*21+(nc+1);if(d1[ns]==-1){d1[ns]=dv;p1[ns]=s;a1[ns]=(2<<2)|d;q1[qt++]=ns;}}}}}\n    if(d1[G]==-1){vector<pair<char,char>> res;int r=r0,c=c0;while(r!=tr){res.push_back({'M',r<tr?'D':'U'});r+=(r<tr?1:-1);}while(c!=tc){res.push_back({'M',c<tc?'R':'L'});c+=(c<tc?1:-1);}return res;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=p1[cur])path.push_back({\"MSA\"[a1[cur]>>2],\"UDLR\"[a1[cur]&3]});reverse(path.begin(),path.end());return path;}\n#define MAKEFPN(NM,NS,DP,PP,QP,AP,NPH,FALLSZ) \\\nconst int NS=N*N*NPH*21*21;static int DP[NS],PP[NS],QP[NS];static uint8_t AP[NS];\nMAKEFPN(fp2,NS2,d2,p2,q2,a2,2,2)\nMAKEFPN(fp3,NS3,d3,p3,q3,a3,3,3)\nMAKEFPN(fp4,NS4,d4,p4,q4,a4,4,4)\nMAKEFPN(fp5,NS5,d5,p5,q5,a5,5,5)\nMAKEFPN(fp6,NS6,d6,p6,q6,a6,6,6)\nMAKEFPN(fp7,NS7,d7,p7,q7,a7,7,7)\nMAKEFPN(fp8,NS8,d8,p8,q8,a8,8,8)\n#undef MAKEFPN\ntemplate<int NPH,int NSZ,int*DP,int*PP,int*QP,uint8_t*AP>\nvector<pair<char,char>> fpNimpl(int r0,int c0,const int*trs,const int*tcs){\n    memset(DP,-1,NSZ*sizeof(int));\n    auto E=[&](int r,int c,int ph,int er,int ec){return (r*N+c)*NPH*441+ph*441+(er+1)*21+(ec+1);};\n    int S=E(r0,c0,0,-1,-1),G=E(trs[NPH-1],tcs[NPH-1],NPH-1,-1,-1);\n    DP[S]=0;int qh=0,qt=0;QP[qt++]=S;\n    while(qh<qt&&DP[G]==-1){int s=QP[qh++],t=s,ec=t%21-1;t/=21;int er=t%21-1;t/=21;int ph=t%NPH;t/=NPH;int c=t%N,r=t/N,dv=DP[s]+1;\n        for(int d=0;d<4;d++){int nr=r+DR[d],nc=c+DC[d];\n            if(inB(nr,nc)&&!grid[nr][nc]&&!(nr==er&&nc==ec)){\n                int np=ph;if(ph<NPH-1&&nr==trs[ph]&&nc==tcs[ph])np=ph+1;\n                int ns=E(nr,nc,np,er,ec);if(DP[ns]==-1){DP[ns]=dv;PP[ns]=s;AP[ns]=(0<<2)|d;QP[qt++]=ns;}}\n            int sr,sc;slE(r,c,d,er,ec,sr,sc);if(sr!=r||sc!=c){\n                int np=ph;if(ph<NPH-1&&sr==trs[ph]&&sc==tcs[ph])np=ph+1;\n                int ns=E(sr,sc,np,er,ec);if(DP[ns]==-1){DP[ns]=dv;PP[ns]=s;AP[ns]=(1<<2)|d;QP[qt++]=ns;}}\n            if(inB(nr,nc)){if(nr==er&&nc==ec){int ns=E(r,c,ph,-1,-1);if(DP[ns]==-1){DP[ns]=dv;PP[ns]=s;AP[ns]=(2<<2)|d;QP[qt++]=ns;}}\n                else if(er==-1&&!grid[nr][nc]){int ns=E(r,c,ph,nr,nc);if(DP[ns]==-1){DP[ns]=dv;PP[ns]=s;AP[ns]=(2<<2)|d;QP[qt++]=ns;}}}}}\n    if(DP[G]==-1){vector<pair<char,char>> res;for(int i=0,pr=r0,pc=c0;i<NPH;i++){auto p=fp1(pr,pc,trs[i],tcs[i]);res.insert(res.end(),p.begin(),p.end());pr=trs[i];pc=tcs[i];}return res;}\n    vector<pair<char,char>> path;for(int cur=G;cur!=S;cur=PP[cur])path.push_back({\"MSA\"[AP[cur]>>2],\"UDLR\"[AP[cur]&3]});reverse(path.begin(),path.end());return path;}\nvector<pair<char,char>> fp2(int r0,int c0,int a,int b,int c,int d){int tr[]={a,c},tc[]={b,d};return fpNimpl<2,NS2,d2,p2,q2,a2>(r0,c0,tr,tc);}\nvector<pair<char,char>> fp3(int r0,int c0,int a,int b,int c,int d,int e,int f){int tr[]={a,c,e},tc[]={b,d,f};return fpNimpl<3,NS3,d3,p3,q3,a3>(r0,c0,tr,tc);}\nvector<pair<char,char>> fp4(int r0,int c0,int a,int b,int c,int d,int e,int f,int g,int h){int tr[]={a,c,e,g},tc[]={b,d,f,h};return fpNimpl<4,NS4,d4,p4,q4,a4>(r0,c0,tr,tc);}\nvector<pair<char,char>> fp5(int r0,int c0,int a,int b,int c,int d,int e,int f,int g,int h,int i,int j){int tr[]={a,c,e,g,i},tc[]={b,d,f,h,j};return fpNimpl<5,NS5,d5,p5,q5,a5>(r0,c0,tr,tc);}\nvector<pair<char,char>> fp6(int r0,int c0,int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l){int tr[]={a,c,e,g,i,k},tc[]={b,d,f,h,j,l};return fpNimpl<6,NS6,d6,p6,q6,a6>(r0,c0,tr,tc);}\nvector<pair<char,char>> fp7(int r0,int c0,int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,int n){int tr[]={a,c,e,g,i,k,m},tc[]={b,d,f,h,j,l,n};return fpNimpl<7,NS7,d7,p7,q7,a7>(r0,c0,tr,tc);}\nvector<pair<char,char>> fp8(int r0,int c0,int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,int n,int o,int p){int tr[]={a,c,e,g,i,k,m,o},tc[]={b,d,f,h,j,l,n,p};return fpNimpl<8,NS8,d8,p8,q8,a8>(r0,c0,tr,tc);}\nint cr,cc,eebr=-1,eebc=-1;\nvoid execPath(const vector<pair<char,char>>&path){\n    for(auto[a,d]:path){cout<<a<<' '<<d<<'\\n';int di=d=='U'?0:d=='D'?1:d=='L'?2:3;int nr=cr+DR[di],nc=cc+DC[di];\n        if(a=='M'){cr=nr;cc=nc;}else if(a=='S'){int sr,sc;slE(cr,cc,di,eebr,eebc,sr,sc);cr=sr;cc=sc;}\n        else{if(nr==eebr&&nc==eebc){eebr=eebc=-1;}else if(eebr==-1&&!grid[nr][nc]){eebr=nr;eebc=nc;}else grid[nr][nc]^=1;}}\n    eebr=eebc=-1;}\nint main(){\n    ios_base::sync_with_stdio(false);cin.tie(NULL);\n    int Nin,M;cin>>Nin>>M;vector<pair<int,int>> pts(M);\n    for(int i=0;i<M;i++)cin>>pts[i].first>>pts[i].second;\n    memset(grid,0,sizeof(grid));cr=pts[0].first;cc=pts[0].second;eebr=eebc=-1;\n    int k=1;\n    while(k<M){\n        int tr=pts[k].first,tc=pts[k].second;auto pk=fp1(cr,cc,tr,tc);\n        if(k+1<M){\n            int tr2=pts[k+1].first,tc2=pts[k+1].second;\n            auto pk1=fp1(tr,tc,tr2,tc2);auto pkk1=fp2(cr,cc,tr,tc,tr2,tc2);\n            if(k+2<M){\n                int tr3=pts[k+2].first,tc3=pts[k+2].second;\n                auto pk2=fp1(tr2,tc2,tr3,tc3);auto pk1k2=fp2(tr,tc,tr2,tc2,tr3,tc3);auto pkkk=fp3(cr,cc,tr,tc,tr2,tc2,tr3,tc3);\n                if(k+3<M){\n                    int tr4=pts[k+3].first,tc4=pts[k+3].second;\n                    auto pk3=fp1(tr3,tc3,tr4,tc4);auto pk2k3=fp2(tr2,tc2,tr3,tc3,tr4,tc4);\n                    auto pk1k2k3=fp3(tr,tc,tr2,tc2,tr3,tc3,tr4,tc4);\n                    auto pkkkk=fp4(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4);\n                    int bc=(int)pk.size()+(int)pk1k2k3.size();int ba=1;\n                    if((int)pkk1.size()+(int)pk2k3.size()<bc){bc=(int)pkk1.size()+(int)pk2k3.size();ba=2;}\n                    if((int)pkkk.size()+(int)pk3.size()<bc){bc=(int)pkkk.size()+(int)pk3.size();ba=3;}\n                    if((int)pkkkk.size()<bc){bc=(int)pkkkk.size();ba=4;}\n                    if(k+4<M){\n                        int tr5=pts[k+4].first,tc5=pts[k+4].second;\n                        auto pk4=fp1(tr4,tc4,tr5,tc5);\n                        auto pfp5=fp5(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4,tr5,tc5);\n                        int g5=bc+(int)pk4.size();int best5=min((int)pfp5.size(),g5);\n                        if(k+5<M){\n                            int tr6=pts[k+5].first,tc6=pts[k+5].second;\n                            auto pk5=fp1(tr5,tc5,tr6,tc6);\n                            auto pfp6=fp6(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4,tr5,tc5,tr6,tc6);\n                            int best6=min((int)pfp6.size(),best5+(int)pk5.size());\n                            if(k+6<M){\n                                int tr7=pts[k+6].first,tc7=pts[k+6].second;\n                                auto pk6=fp1(tr6,tc6,tr7,tc7);\n                                auto pfp7=fp7(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4,tr5,tc5,tr6,tc6,tr7,tc7);\n                                int best7=min((int)pfp7.size(),best6+(int)pk6.size());\n                                if(k+7<M){\n                                    int tr8=pts[k+7].first,tc8=pts[k+7].second;\n                                    auto pk7=fp1(tr7,tc7,tr8,tc8);\n                                    auto pfp8=fp8(cr,cc,tr,tc,tr2,tc2,tr3,tc3,tr4,tc4,tr5,tc5,tr6,tc6,tr7,tc7,tr8,tc8);\n                                    if((int)pfp8.size()<best7+(int)pk7.size()){execPath(pfp8);cr=tr8;cc=tc8;k+=8;continue;}\n                                }\n                                if((int)pfp7.size()<best6+(int)pk6.size()){execPath(pfp7);cr=tr7;cc=tc7;k+=7;continue;}\n                            }\n                            if((int)pfp6.size()<best5+(int)pk5.size()){execPath(pfp6);cr=tr6;cc=tc6;k+=6;continue;}\n                        }\n                        if((int)pfp5.size()<g5){execPath(pfp5);cr=tr5;cc=tc5;k+=5;continue;}\n                    }\n                    if(ba==4){execPath(pkkkk);cr=tr4;cc=tc4;k+=4;}\n                    else if(ba==3){execPath(pkkk);cr=tr3;cc=tc3;k+=3;}\n                    else if(ba==2){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                    else{execPath(pk);cr=tr;cc=tc;k+=1;}\n                    continue;\n                }\n                int bc3=(int)pk.size()+(int)pk1k2.size();int ba3=1;\n                if((int)pkk1.size()+(int)pk2.size()<bc3){bc3=(int)pkk1.size()+(int)pk2.size();ba3=2;}\n                if((int)pkkk.size()<bc3){ba3=3;}\n                if(ba3==3){execPath(pkkk);cr=tr3;cc=tc3;k+=3;}\n                else if(ba3==2){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                else{execPath(pk);cr=tr;cc=tc;k+=1;}\n            }else{\n                if((int)pkk1.size()<(int)pk.size()+(int)pk1.size()){execPath(pkk1);cr=tr2;cc=tc2;k+=2;}\n                else{execPath(pk);cr=tr;cc=tc;k+=1;}\n            }\n        }else{execPath(pk);cr=tr;cc=tc;k+=1;}\n    }\n    return 0;\n}"}}}