This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/* https://boi2018.progolymp.se/spoiler-day1.pdf */
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef basic_string<int> BI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=998244353;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
int n,m,k,q;
map<array<int,3>,int> val;
int ask(int x,int y,int z) {
if (x<1||x>n||y<1||y>m||z<1||z>k) return 0;
if (!val.count({x,y,z})) {
printf("? %d %d %d\n",x,y,z);
fflush(stdout);
scanf("%d",&val[{x,y,z}]);
}
return val[{x,y,z}];
}
bool good(int x,int y,int z){
if(x<1||x>n||y<1||y>m||z<1||z>k) return false;
if (ask(x,y,z)<ask(x+1,y,z)) return false;
if (ask(x,y,z)<ask(x,y+1,z)) return false;
if (ask(x,y,z)<ask(x,y,z+1)) return false;
if (ask(x,y,z)<ask(x-1,y,z)) return false;
if (ask(x,y,z)<ask(x,y-1,z)) return false;
if (ask(x,y,z)<ask(x,y,z-1)) return false;
return true;
}
int main() {
scanf("%d%d%d%d",&n,&m,&k,&q);
if(m==1&&k==1) {
int l=1,r=n,x=0.618*l+0.382*r,y=0.382*l+0.618*r;
while (l+10<r) {
if (x>=y) {
x=0.618*l+0.382*r;
y=0.382*l+0.618*r;
if(x>=y) break;
}
if (ask(x,1,1)<ask(y,1,1)) {
l=x+1; x=y; y=0.382*l+0.618*r;
} else {
r=y-1; y=x; x=0.618*l+0.382*r;
}
}
int ans=l;
rep(i,l,r+1) if (good(i,1,1)) ans=i;
printf("! %d 1 1",ans);
fflush(stdout);
return 0;
}
}
Compilation message (stderr)
worm.cpp: In function 'int ask(int, int, int)':
worm.cpp:33:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
33 | scanf("%d",&val[{x,y,z}]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
worm.cpp: In function 'int main()':
worm.cpp:50:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
50 | scanf("%d%d%d%d",&n,&m,&k,&q);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |