#include using namespace std; using pii=pair; using tii=tuple; using qii=tuple; using ll=long long; using ld=long double; const int INF=1e9; #define rep(i,n) for (int i=0;i<(int)(n);i++) #define all(v) v.begin(),v.end() template void chmin(T &a,T b){ if(a>b){ a=b; } } template void chmax(T &a,T b){ if(a> tree; //0->back,1->front->2->center struct Solver{ double score(vector> &ans){ ll sum_h2=0; int sum_h=0; rep(i,K){ int now=0; rep(j,4){ now+=tree[min(2,j)][ans[i][j]].h; } sum_h2+=(ll)now*(ll)now; sum_h+=now; } return ((double)sum_h2/(double)K)-((double)sum_h/(double)K)*((double)sum_h/(double)K); } int true_score(vector> &ans){ int mx=-INF,mn=INF; rep(i,K){ int now=0; rep(j,4){ now+=tree[min(2,j)][ans[i][j]].h; } chmax(mx,now); chmin(mn,now); } return mx-mn; } void solve(){ set st_back,st_center; rep(i,N) st_back.insert({tree[0][i].w,i}); rep(i,2*N) st_center.insert({tree[2][i].w,i}); vector> ans(K,vector(4,-10)); //back->front->center1->center2 int cnt_tree=0; vector front_ord(N),center_ord(2*N); rep(i,N) front_ord[i]=i; rep(i,2*N) center_ord[i]=i; sort(all(front_ord),[&](int i,int j){return tree[1][i].w>tree[1][j].w;}); sort(all(center_ord),[&](int i,int j){return tree[2][i].w> used(3,vector(2*N,0)); rep(i,K){ rep(j,4){ used[min(2,j)][ans[i][j]]=1; } } vector> not_used(3); rep(i,3){ rep(j,2*N){ if(i!=2&&j==N) break; if(!used[i][j]) not_used[i].push_back(j); } } mt19937 mt; set st; vector sum_h(K,0); rep(i,K){ rep(j,4){ sum_h[i]+=tree[min(2,j)][ans[i][j]].h; } st.insert({sum_h[i],i}); } int min_score=(*st.rbegin()).first-(*st.begin()).first; auto start=chrono::system_clock::now(); while(true){ auto now=chrono::system_clock::now(); int ms=chrono::duration_cast(now-start).count(); if(1200<=ms) break; int x=(*st.rbegin()).second,y=mt()%4; if(mt()%2==0) x=(*st.begin()).second; if(mt()%4==0){ int p=mt()%K,q=y; if(x==p) continue; if(2<=y) q=2+mt()%2; st.erase({sum_h[x],x}); st.erase({sum_h[p],p}); int before_sum_h_x=sum_h[x],before_sum_h_p=sum_h[p]; sum_h[x]-=tree[min(2,y)][ans[x][y]].h; sum_h[p]-=tree[min(2,y)][ans[p][q]].h; sum_h[x]+=tree[min(2,y)][ans[p][q]].h; sum_h[p]+=tree[min(2,y)][ans[x][y]].h; swap(ans[x][y],ans[p][q]); st.insert({sum_h[x],x}); st.insert({sum_h[p],p}); bool ok=true; rep(i,3){ if(tree[min(2,i+1)][ans[x][i+1]].w<=tree[min(2,i)][ans[x][i]].w){ ok=false; break; } } rep(i,3){ if(tree[min(2,i+1)][ans[p][i+1]].w<=tree[min(2,i)][ans[p][i]].w){ ok=false; break; } } int new_score=(*st.rbegin()).first-(*st.begin()).first; if(ok&&new_score<=min_score){ min_score=new_score; }else{ swap(ans[x][y],ans[p][q]); st.erase({sum_h[x],x}); st.erase({sum_h[p],p}); sum_h[x]=before_sum_h_x; sum_h[p]=before_sum_h_p; st.insert({sum_h[x],x}); st.insert({sum_h[p],p}); } }else{ int z=mt()%not_used[min(2,y)].size(); int before_sum_h_x=sum_h[x]; st.erase({sum_h[x],x}); sum_h[x]-=tree[min(2,y)][ans[x][y]].h; sum_h[x]+=tree[min(2,y)][not_used[min(2,y)][z]].h; swap(ans[x][y],not_used[min(2,y)][z]); st.insert({sum_h[x],x}); bool ok=true; rep(i,3){ if(tree[min(2,i+1)][ans[x][i+1]].w<=tree[min(2,i)][ans[x][i]].w){ ok=false; break; } } int new_score=(*st.rbegin()).first-(*st.begin()).first; if(ok&&new_score<=min_score){ min_score=new_score; }else{ swap(ans[x][y],not_used[min(2,y)][z]); st.erase({sum_h[x],x}); sum_h[x]=before_sum_h_x; st.insert({sum_h[x],x}); } } } rep(i,K){ cout << ans[i][1]+1 << ' ' << ans[i][2]+1 << ' ' << ans[i][3]+1 << ' ' << ans[i][0]+1 << '\n'; } } }Solver; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> K; tree.resize(3); tree[1].resize(N); tree[2].resize(2*N); tree[0].resize(N); rep(i,N) cin >> tree[1][i].w; rep(i,N) cin >> tree[1][i].h; rep(i,2*N) cin >> tree[2][i].w; rep(i,2*N) cin >> tree[2][i].h; rep(i,N) cin >> tree[0][i].w; rep(i,N) cin >> tree[0][i].h; Solver.solve(); }