시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 1024 MB 94 28 28 41.791%

문제

이 문제는 인터랙티브 문제다.

국렬이는 $1$ 이상 $10^9$ 이하의 $N$개의 자연수로 이루어진 두 배열 $A$, $B$를 가지고 있다. 당신은 $A$, $B$를 합쳤을 때 중간값을 구해야 한다. 중간값은 $2N$개 수들을 오름차순으로 정렬했을 때 $N$번째 수를 중간값이라고 한다.

국렬이는 인성이 나빠서 배열 $A$, $B$를 당신에게 제공하지 않을 것이다. 그래도 약간의 자비가 있기에 특정 배열의 $x$번째 수가 무엇인지 물어볼 기회를 줬다. 다만 40번까지 질문이 가능하며, 그 이상으로 질문할 경우 국렬이는 틀렸습니다로 당신을 때릴 것이다. 답을 출력하는 것은 질문 횟수에 포함되지 않는다.

40번 이하로 질문해서 중간값을 구해보자.

입력

입력의 첫 줄에 배열의 길이 $N$이 주어진다. $N$은 $2^k$으로 표현할 수 있는 양의 정수만 주어진다. ($0 \le k \le 19$)

출력

다음 중 하나를 표준 출력 스트림(stdout)으로 한 줄에 출력하여, 배열의 원소를 질문 할 수 있다.

  • ? A x : 배열 $A$의 $x$번째 수 ($1 \le x \le N$)
  • ? B x : 배열 $B$의 $x$번째 수 ($1 \le x \le N$)

어떤 배열에서 $x$번째 수는, 그 배열을 오름차순으로 정렬했을 때 $x$번째인 수를 의미한다

각 질문을 출력한 후에는 반드시 표준 출력 버퍼를 flush해 주어야 하고, 표준 입력 스트림(stdin)을 통해 질문에 대한 답을 입력받아야 한다. 질문에 대한 답을 입력받지 않으면 런타임에러를 받게 된다. 최대 질문 횟수는 40번으로, 그 이상으로 질문을 요청한 경우 틀렸습니다!를 받는다.

만약 중간값을 알아낸 경우, 표준 출력 스트림으로 다음을 한 줄에 출력한다.

  • ! x : 배열 A, B를 합쳤을 때의 중앙값은 $x$이다.

그 후 반드시 표준 출력 버퍼를 flush해야 하고, 프로그램을 종료한다. 이것은 질문 횟수에 포함되지 않는다.

언어별로 표준 출력 버퍼를 flush하는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()

예제 입력 1

2

1

2

2

3

예제 출력 1

 
? A 1

? A 2

? B 1

? B 2

! 2

입출력이 어떤 방식으로 이루어지는지 이해를 돕기 위해 의도적으로 개행 간격 등을 조절한 것으로, 실제 입출력과는 다르다.

위 예시는 $N=2$이고, $A=[1,2]$, $B=[2,3]$인 경우에 대한 입출력이다.

출처

Camp > ICPC Sinchon Algorithm Camp > 2021 ICPC Sinchon Winter Algorithm Camp Contest - 중급 C번

채점 및 기타 정보

  • 예제는 채점하지 않는다.