제출 #1335982

#제출 시각아이디문제언어결과실행 시간메모리
1335982lto5Worm Worries (BOI18_worm)C++20
0 / 100
608 ms1114112 KiB
#include<bits/stdc++.h>
#define ll long long
#define ntr "\n"
#define mod (ll)(1e9+7)
#define taskname "temp"
#define frep freopen(taskname".inp","r",stdin); freopen(taskname".out","w",stdout);
using namespace std;
ll n,m,k,q;
ll movex[]={1,-1,0,0,0,0};
ll movey[]={0,0,1,-1,0,0};
ll movez[]={0,0,0,0,1,-1};
bool check(ll x,ll y,ll z){
    return x>0&&x<=n&&y>0&&y<=m&&z>0&&z<=k;
}
void query(ll x,ll y,ll z){
    cout<<"? "<<x<<' '<<y<<' '<<z<<endl;
    cout.flush();
}
void ans(ll x,ll y,ll z){
    cout<<"! "<<x<<' '<<y<<' '<<z<<endl;
    cout.flush();
}
int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    //frep;
    cin>>n>>m>>k>>q;
    ll board[n+1][m+1][k+1],vis[n+1][m+1][k+1];
    memset(board,0x3f,sizeof(board));
    memset(vis,0,sizeof(vis));
    priority_queue<array<ll,4>> pq;
    vector<ll> a={1,n},b={1,m},c={1,k};
    for(auto x:a){
        for(auto y:b){
            for(auto z:c){
                if(board[x][y][z]>1e9){
                    query(x,y,z);
                    ll c;
                    cin>>c;
                    board[x][y][z]=c;
                    pq.push({c,x,y,z});
                }
            }
        }
    }
    while(q>0){
        ll x=pq.top()[1];
        ll y=pq.top()[2];
        ll z=pq.top()[3];
        pq.pop();
        //cout<<x<<' '<<y<<' '<<z<<ntr;
        for(int i=0;i<6;i++){
            ll nx=x+movex[i];
            ll ny=y+movey[i];
            ll nz=z+movez[i];
            if(q==0) break;
            if(check(nx,ny,nz)){
                if(board[nx][ny][nz]>1e9){
                    query(nx,ny,nz);
                    ll c;
                    cin>>c;
                    board[nx][ny][nz]=c;
                    pq.push({c,nx,ny,nz});
                    q--;
                    if(c>board[x][y][z]) break;
                }
            }
        }
        ll mx=-1;
        for(int i=0;i<6;i++){
            ll nx=x+movex[i];
            ll ny=y+movey[i];
            ll nz=z+movez[i];
            if(check(nx,ny,nz)){
                mx=max(mx,board[nx][ny][nz]);
            }
        }
        //cout<<x<<' '<<y<<' '<<z<<' '<<mx<<endl;
        if(board[x][y][z]>=mx){
            ans(x,y,z);
            return 0;
        }
        if(q==0) break;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...