#abc269e. [abc269_e]Last Rook

[abc269_e]Last Rook

题目描述

这是一个交互式任务(你的程序通过输入和输出与评测程序进行交互)。

我们有一个N×N的棋盘和N个车。其中,第i行从上到下,第j列从左到右的方格用(i,j)(i,j)表示。
考虑将车放在棋盘的方格上。在这里,你必须放置车,以满足以下所有条件:

  • 每一行都不能放置两个或更多的车。
  • 每一列都不能放置两个或更多的车。

现在,在棋盘上已经放置了N1N-1辆车,以满足上述所有条件。你需要选择一个没有被车占据的方格,并在该方格上放置一辆车。(可以证明,在这些条件下至少存在一个可以放置车的方格。)

然而,你无法直接看到哪些方格被车占据。
相反,你可以向评测程序最多提问20次,以以下方式提问:

  • 选择整数AABBCCDD,满足1ABN,1CDN1 \leq A \leq B \leq N, 1 \leq C \leq D \leq N,并询问方格(i,j)(i, j)组成的矩形区域中有多少辆车,其中AiB,CjDA \leq i \leq B, C \leq j \leq D

找到一个可以放置车的方格。

约束条件

  • 2N1032 \leq N \leq 10^3
  • NN是一个整数。

输入和输出

这是一个交互式任务(你的程序通过输入和输出与评测程序进行交互)。

首先,从标准输入接收棋盘的大小NN

NN

然后,重复提问,直到找到一个可以放置车的方格。
问题应以以下格式打印到标准输出:

?? AA BB CC DD

响应将以下列格式从标准输入给出:

TT

其中,TT是对问题的响应,如果问题无效或已经提问超过20次,则为-1

当评测程序返回-1时,提交已被视为不正确。在这种情况下,立即终止程序。

当你找到一个可以放置车的方格时,设(X,Y)(X, Y)是该方格,并以以下格式打印出答案。然后立即终止程序。

!! XX YY

如果有多个合适的答案,任何一个都将被接受。

注意事项

  • 每次打印时,请在末尾加上一个换行符并刷新标准输出。否则,可能会导致超时错误。