Submission #265504

#TimeUsernameProblemLanguageResultExecution timeMemory
265504TadijaSebezWorm Worries (BOI18_worm)C++11
22 / 100
34 ms556 KiB
#include <bits/stdc++.h>
using namespace std;
map<array<int,3>,int> was;
int n,m,k,q;
int Ask(int i,int j,int k){
	if(was.count({i,j,k}))return was[{i,j,k}];
	if(i<1||j<1||k<1||i>n||j>m||k>::k)return 0;
	printf("? %i %i %i\n",i,j,k);
	fflush(stdout);
	int b;scanf("%i",&b);
	was[{i,j,k}]=b;
	return b;
}
void Ans(int i,int j,int k){
	printf("! %i %i %i\n",i,j,k);
	fflush(stdout);
	exit(0);
}
void Check(int i,int j,int k){
	int now=Ask(i,j,k);
	for(int a=-1;a<=1;a+=2)
		if(now<max({Ask(i+a,j,k),Ask(i,j+a,k),Ask(i,j,k+a)}))
			return;
	Ans(i,j,k);
}
int main(){
	scanf("%i %i %i %i",&n,&m,&k,&q);
	if(m==1&&k==1){
		int top=n,bot=1;
		while(top!=bot){
			int mid1=(top+bot+bot)/3;
			int mid2=(top+top+bot+2)/3;
			if(Ask(mid1,1,1)<Ask(mid2,1,1))bot=mid1+1;
			else top=mid2-1;
		}
		Ans(bot,1,1);
	}else if(k==1){
		/*mt19937 rng(time(0));
		for(int i=1;i<=100;i++){
			int x=rng()%n+1;
			int y=rng()%m+1;
			for(int j=1;j<=10;j++){
				int now=Ask(x,y,1);
				int mx=0;
				pair<int,int> nxt;
				if(Ask(x+1,y,1)>mx)mx=Ask(x+1,y,1),nxt={x+1,y};
				if(Ask(x-1,y,1)>mx)mx=Ask(x-1,y,1),nxt={x-1,y};
				if(Ask(x,y+1,1)>mx)mx=Ask(x,y+1,1),nxt={x,y+1};
				if(Ask(x,y-1,1)>mx)mx=Ask(x,y-1,1),nxt={x,y-1};
				if(mx<=now)Ans(x,y,1);
				tie(x,y)=nxt;
			}
		}
		Ans(1,1,1);*/
		int X1=1,X2=n,Y1=1,Y2=n,Xm=X1+X2>>1,Ym;
		while(X1<X2&&Y1<Y2){
			int mx=0,pos=0;
			for(int i=Y1;i<=Y2;i++){
				int now=Ask(Xm,i,1);
				if(now>mx)mx=now,pos=i;
			}
			if(min(Ask(Xm-1,pos,1),Ask(Xm+1,pos,1))>mx){
				if(Xm-X1<X2-Xm)X2=Xm-1;
				else X1=Xm+1;
			}else if(Ask(Xm-1,pos,1)>mx){
				X2=Xm-1;
			}else if(Ask(Xm+1,pos,1)>mx){
				X1=Xm+1;
			}else Ans(Xm,pos,1);
			Ym=pos;
			mx=0,pos=0;
			for(int i=X1;i<=X2;i++){
				int now=Ask(i,Ym,1);
				if(now>mx)mx=now,pos=i;
			}
			if(min(Ask(pos,Ym-1,1),Ask(pos,Ym+1,1))>mx){
				if(Ym-Y1<Y2-Ym)Y2=Ym-1;
				else Y1=Ym+1;
			}else if(Ask(pos,Ym-1,1)>mx){
				Y2=Ym-1;
			}else if(Ask(pos,Ym+1,1)>mx){
				Y1=Ym+1;
			}else Ans(pos,Ym,1);
			Xm=pos;
		}
		for(int i=X1;i<=X2;i++){
			for(int j=Y1;j<=Y2;j++){
				Check(i,j,1);
			}
		}
	}else{

	}
	return 0;
}

Compilation message (stderr)

worm.cpp: In function 'int main()':
worm.cpp:55:32: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |   int X1=1,X2=n,Y1=1,Y2=n,Xm=X1+X2>>1,Ym;
      |                              ~~^~~
worm.cpp: In function 'int Ask(int, int, int)':
worm.cpp:10:13: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   10 |  int b;scanf("%i",&b);
      |        ~~~~~^~~~~~~~~
worm.cpp: In function 'int main()':
worm.cpp:27:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   27 |  scanf("%i %i %i %i",&n,&m,&k,&q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...