Visual Python++

시간 제한5초메모리 제한512 MB

요약
n개의 왼쪽 위 모서리와 n개의 오른쪽 아래 모서리를 짝지어 사각형들이 올바르게 중첩되거나 분리되도록 만들고, 불가능하면 syntax error를 출력한다.
난이도

어려움10점 중 8점

유형
정렬, 스택, 그리디, 구현
정답자
아직 제출이 없습니다

문제

Visual Python++ 프로그래밍 언어에서 문장 블록은 문자로 이루어진 직사각형이다. 왼쪽 위 모서리는 r1r_1행 c1c_1열에 있고, 오른쪽 아래 모서리는 r2r_2행 c2c_2열에 있다. r1≤r≤r2r_1 \le r \le r_2이고 c1≤c≤c2c_1 \le c \le c_2인 위치 (r,c)(r, c)의 문자는 모두 그 블록에 속한다. 이 위치 중 r=r1r = r_1, r=r2r = r_2, c=c1c = c_1, c=c2c = c_2 가운데 하나를 만족하는 위치가 블록의 테두리다.

블록은 몇 단계든 중첩할 수 있다. 문법에 맞는 프로그램에서 두 블록은 한쪽이 다른 쪽 안에 들어가 있거나, 위치를 하나도 공유하지 않는다. 두 경우 모두 테두리가 겹치면 안 된다. 따라서 블록 BB가 블록 AA 안에 들어가 있으면 r1A<r1B≤r2B<r2Ar_1^A < r_1^B \le r_2^B < r_2^A와 c1A<c1B≤c2B<c2Ac_1^A < c_1^B \le c_2^B < c_2^A를 만족하고, 중첩 관계가 아닌 두 블록은 공통 위치가 없다.

프로그래머는 직사각형을 직접 그리지 않는다. 다 그리려면 시간이 너무 오래 걸리므로 블록의 왼쪽 위 모서리에 문자 p 하나를, 오른쪽 아래 모서리에 문자 y 하나를 적는다. 그러면 파서가 모서리를 짝지어 프로그램의 중첩 구조를 복원한다.

파서에서 이 짝짓기를 맡는 부분을 작성하라.

입력

첫째 줄에 모서리 쌍의 개수 nn이 주어진다 (1≤n≤1051 \le n \le 10^5).

다음 nn개 줄에 두 정수 rr과 cc가 주어진다 (1≤r,c≤1091 \le r, c \le 10^9). rr행 cc열에 왼쪽 위 모서리가 있다는 뜻이다. 이어지는 nn개 줄에는 같은 형식으로 오른쪽 아래 모서리가 주어진다. 2n2n개 모서리 위치는 모두 서로 다르다.

출력

모서리를 짝지어 블록 nn개가 문법에 맞는 프로그램을 이루게 할 수 있으면 nn개 줄을 출력한다. ii번째 줄에는 ii번째 왼쪽 위 모서리와 짝을 이루는 오른쪽 아래 모서리의 번호 jj를 출력한다. 왼쪽 위 모서리와 오른쪽 아래 모서리는 각각 입력에 나온 순서대로 1번부터 nn번까지 번호를 매긴다. 문법에 맞는 프로그램을 만드는 짝짓기는 많아야 하나이므로 답은 유일하다.

그런 짝짓기가 없으면 syntax error를 한 줄에 출력한다.

예제4

  1. 예제 1

    입력
    2
    4 7
    9 8
    14 17
    19 18
    
    예상 출력
    2
    1
    
  2. 예제 2

    입력
    2
    4 7
    14 17
    9 8
    19 18
    
    예상 출력
    1
    2
    
  3. 예제 3

    입력
    2
    4 8
    9 7
    14 18
    19 17
    
    예상 출력
    syntax error
    
  4. 예제 4

    입력
    3
    1 1
    4 8
    8 4
    10 6
    6 10
    10 10
    
    예상 출력
    syntax error