#pragma GCC target("prefer-vector-width=512") #pragma GCC target("avx512f,avx512dq,avx512ifma,avx512cd,avx512bw,avx512vl,avx512vbmi,avx512vbmi2,avx512vnni,avx512bitalg,avx512vpopcntdq") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; using pii=pair; using tii=tuple; using qii=tuple; using ll=long long; using ull=unsigned long long; using ld=long double; constexpr int INF=1e9; constexpr ll INF_ll=1e18; #define rep(i,n) for (int i=0;i<(int)(n);i++) #define replr(i,l,r) for (int i=(int)(l);i<(int)(r);i++) #define all(v) v.begin(),v.end() #define len(v) ((int)v.size()) template inline bool chmin(T &a,T b){ if(a>b){ a=b; return true; } return false; } template inline bool chmax(T &a,T b){ if(a inline bool chmin_ref(T &a,const T &b){ if(a>b){ a=b; return true; } return false; } template inline bool chmax_ref(T &a,const T &b){ if(a(now-start).count(); return ms; } int get_ms_all_program(){ auto now=chrono::steady_clock::now(); int ms=chrono::duration_cast(now-program_start).count(); return ms; } } mt19937 mt; uint32_t rand_int(uint32_t r){ //[0,r) assert(r!=0); return ((uint64_t)mt()*r)>>32; } int rand_int(int l,int r){ //[l,r) assert(l T get_random_element(const vector &v){ assert(!v.empty()); return v[rand_int(len(v))]; } template void add(vector &a,vector b){ for(auto i:b) a.push_back(i); } constexpr int N=14,K=3000,T=400,M=1000000; array A,B; array,N*N> G; vector E; int one(int i,int j){ return i*N+j; } pii two(int x){ return {x/N,x%N}; } namespace Solver{ array,N*N> start_dist; array dist_cnt; vector first_edges; struct State{ vector edges; State(){ edges=first_edges; } void output_ans(){ int sz=len(edges); vector income; income.push_back(0); auto dist=start_dist; for(auto [u,v]:edges){ rep(i,N*N){ rep(j,N*N){ chmin(dist[i][j],dist[i][u]+223+dist[v][j]); chmin(dist[i][j],dist[i][v]+223+dist[u][j]); } } int sum=0; rep(i,K){ sum+=dist_cnt[dist[A[i]][B[i]]]; } income.push_back(sum*60); } const int P=100; vector> dp(sz+1,vector(P,{T+1,T+1})); vector> pre(sz+1,vector(P,{-1,-1,-1,-1})); dp[0][1]={0,-M}; rep(k,sz){ rep(i,P){ auto [turn,money]=dp[k][i]; if(turn==T+1) continue; money=-money; replr(j,i,P){ int cost=floor((double)1e7/sqrt(j)); int add_turn=j-i; int income_income=(50000+income[k]); int income_turn=(max(0,cost-(money+income[k]*add_turn))+income_income-1)/income_income; int new_turn=turn+add_turn+income_turn+1; //if(dp[k+1][j].first ans; rep(k,sz+1){ rep(i,P){ auto [turn,money]=dp[k][i]; if(T> x >> y; if(t==1){ auto [a,b]=two(u); auto [c,d]=two(v); cout << "1 " << a+1 << ' ' << b+1 << ' ' << c+1 << ' ' << d+1 << '\n'; cout.flush(); }else{ cout << t << '\n'; cout.flush(); } } } }; void init(){ rep(i,N*N){ start_dist[i].fill(INF); priority_queue,greater> pq; start_dist[i][i]=0; pq.push({0,i}); while(!pq.empty()){ auto [d,x]=pq.top(); pq.pop(); if(start_dist[i][x]!=d) continue; for(auto y:G[x]){ if(y==-1) continue; if(chmin(start_dist[i][y],start_dist[i][x]+1000)){ pq.push({start_dist[i][y],y}); } } } } dist_cnt.fill(-1); rep(i,N*2){ for(int j=0;j*223<=N*2*1000;j++){ assert(dist_cnt[i*1000+j*223]==-1); dist_cnt[i*1000+j*223]=j; } } auto dist=start_dist; int pre_sum=0; set st; rep(loop,100){ int best_sum=-1; int best_u=-1,best_v=-1; for(auto [u,v]:E){ if(loop> k >> t; assert(k==K); assert(t==T); A.fill(-1); B.fill(-1); rep(i,K){ int a,b,c,d; cin >> a >> b >> c >> d; a--; b--; c--; d--; A[i]=one(a,b); B[i]=one(c,d); } rep(i,N*N) G[i].fill(-1); rep(i,N){ rep(j,N){ if(j+1