만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

새해와 직사각형

시간 제한3초메모리 제한1024 MB

요약
n x n 격자에 숨겨진 직사각형을 개수 질의로 찾습니다. 질의 횟수 q 안에 끝내야 하며 대화형으로 진행됩니다.
난이도

어려움10점 중 8점

유형
이분 탐색, 구현, 완전 탐색
정답자
아직 제출이 없습니다

문제

이 문제는 대화형 문제다.

새해에 데드 모로즈가 글렙에게 오랫동안 바라던 선물을 주었다. 그 선물은 n×nn \times n 크기의 격자 정사각형이다. 이 선물에는 비밀이 숨어 있다. 데드 모로즈가 정사각형 안에서 공백이 아닌 직사각형 하나를 고르고, 그 직사각형의 모든 칸에 귤을 한 개씩 놓았다.

글렙은 선물을 받으려면 데드 모로즈와 게임을 해야 한다. 글렙은 귤이 모두 들어 있는 직사각형이 어디인지 맞혀야 한다. 행과 열은 아래에서 위로, 왼쪽에서 오른쪽으로 11부터 nn까지 번호가 붙어 있다. 글렙은 두 가지 질의를 할 수 있다.

  • ? x_1 y_1 x_2 y_2 (1≤x1≤x2≤n1 \le x_1 \le x_2 \le n, 1≤y1≤y2≤n1 \le y_1 \le y_2 \le n): 왼쪽 아래 칸이 (x1,y1)(x_1, y_1)이고 오른쪽 위 칸이 (x2,y2)(x_2, y_2)인 직사각형 안에 귤이 몇 개 있는지 데드 모로즈가 답한다.
  • ! x_1 y_1 x_2 y_2 (1≤x1≤x2≤n1 \le x_1 \le x_2 \le n, 1≤y1≤y2≤n1 \le y_1 \le y_2 \le n): 글렙이 위치를 확신하면 이 질의로 답을 보고한다. (x1,y1)(x_1, y_1)은 예상한 직사각형의 왼쪽 아래 칸이고, (x2,y2)(x_2, y_2)는 오른쪽 위 칸이다.

입력

프로그램은 정사각형의 크기를 나타내는 정수 nn (1≤n≤2⋅1091 \leq n \leq 2 \cdot 10^9) 하나를 입력으로 받는다.

? 질의를 할 때마다, 요청한 직사각형 안에 있는 귤의 개수가 주어진다.

출력

위 형식에 맞는 올바른 질의만 출력해야 한다. 마지막에는 ! 질의 하나만 출력하고, 그 직후 프로그램을 즉시 종료해야 한다. 출력할 수 있는 ? 질의는 최대 qq개다 (qq는 그룹 번호에 따라 다르다). 마지막 ! 질의는 이 qq개에 포함되지 않는다.

출력 형식을 정확히 지켜야 한다. 각 줄을 출력한 뒤에는 출력 버퍼를 비운다. Pascal이나 Delphi에서는 flush(output), C/C++에서는 fflush(stdout) 또는 cout.flush(), Python에서는 sys.stdout.flush(), Java에서는 System.out.flush()를 쓴다.

힌트

첫 번째 테스트를 통과하려고 예제와 똑같은 질의를 할 필요는 없다.

예제1

  1. 예제 1

    입력
    4
    
    6
    
    6
    
    4
    
    
    예상 출력
    
    ? 1 1 4 4
    
    ? 1 3 4 4
    
    ? 2 3 4 4
    
    ! 1 3 3 4