오마르는 세계에서 가장 어린 프로그래머다. 태어난 지 11개월밖에 되지 않았다. 이진 탐색 설명을 읽고 직접 구현해 보기로 했다.
오마르가 작성한 함수는 다음과 같다. 문법은 올바르고, C++와 Java에서 똑같이 동작한다.
int findFirstGreaterThanOrEqual(int array[], int N, int X) {
int start = 0, end = N;
while (start < end) {
int middle = (start + end) / 2;
if (array[middle] > X) {
end = middle;
} else {
start = middle + 1;
}
}
return start;
}
이 함수는 항상 다음 조건을 모두 만족하는 인자로 호출된다.
오마르가 원하는 동작은 이렇다. 배열에 X보다 크거나 같은 정수가 없으면 함수는 N을 반환한다. 그렇지 않으면 X보다 크거나 같은 정수 중 가장 작은 값의 인덱스를 반환한다. 첫 번째 원소의 인덱스는 0이다.
그런데 함수에 버그가 있어서 어떤 입력에서는 잘못된 값을 반환한다. 오마르는 너무 어려서 버그를 찾지 못한다. 함수를 시험할 배열을 만들어 오마르를 도와주자.
첫째 줄에 테스트 케이스의 개수 T가 주어진다 (1≤T≤100).
이어지는 T개의 줄에 테스트 케이스가 한 줄씩 주어진다. 각 줄에는 공백 하나로 구분된 정수 세 개 N X Y가 있다 (1≤N≤99, 1≤X≤100, 1≤Y≤2). N은 두 번째 인자의 값이고 X는 세 번째 인자의 값이다. Y가 1이면 그 인자로 함수를 호출했을 때 올바른 값을 반환하게 하는 배열을 만들어야 한다. Y가 2이면 잘못된 값을 반환하게 하는 배열을 만들어야 한다. 어느 쪽이든 배열은 위 조건을 만족해야 한다.
올바른 값인지 잘못된 값인지는 코드가 실제로 하는 동작이 아니라 오마르가 원하는 동작을 기준으로 판단한다.
각 테스트 케이스마다 만든 배열의 정수 N개를 배열에 놓인 순서대로 공백 하나로 구분해 한 줄에 출력한다. 조건을 만족하는 배열이 여러 개면 사전순으로 가장 앞선 것을 출력한다.
길이가 같은 두 배열을 비교할 때, 처음으로 값이 달라지는 인덱스에 더 작은 값이 놓인 배열이 사전순으로 앞선다.