CPC 문제 정렬 순서

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

요약
각 문제에 [l_i, r_i] 범위의 정수 난이도와 1번부터 M번까지의 섹션을 배정하되, 각 섹션이 비어 있지 않고 k번 섹션의 모든 난이도가 k+1번 섹션보다 낮도록 만든다. 불가능하면 -1을 출력한다.
난이도

보통10점 중 7점

유형
그리디, 정렬, 투 포인터
정답자
아직 제출이 없습니다

문제

CPC 문제 번호는 A1, B1, B2, B3, C1, C2, C3, D1, D2와 같이 섹션명 뒤에 숫자를 붙여 구성된다. 섹션명은 난이도 순서를 보장하지만, 같은 섹션명 내에서 숫자는 난이도 순서를 보장하지 않는다. 예를 들어 섹션명의 순서를 알파벳 사전순으로 정하였을 때 C2가 C1보다 어렵다는 보장은 없지만, B2는 항상 A1보다 어렵다.

CPC 운영진은 공개 이전에 문제의 난이도를 정확히 예측하기 어렵기에 다음 규칙에 따라 문제 정렬 순서를 정한다.

  • NN개의 문제를 MM개의 섹션으로 나누어야 한다.
  • ii번 문제는 l_il\_i 이상, r_ir\_i 이하의 정수 난이도를 가질 수 있다. (1≤i≤N;(1 \le i \le N; l_il\_i, r_ir\_i는 정수)) 
  • jj번 섹션에 ii번 문제를 넣을 때는 문제의 난이도를 l_il\_i 이상 r_ir\_i 이하의 정수 중 하나로 결정한 후 jj번 섹션에 넣는다. (1≤j≤M)(1 \le j \le M)
  • kk번 섹션 문제 중 가장 높은 난이도의 문제의 난이도가 k+1k+1번 섹션 문제 중 가장 낮은 난이도의 문제의 난이도보다 낮아야 한다. (1≤k<M)(1 \le k \lt M)
  • 모든 문제가 정확히 하나의 섹션에 속해야 한다.
  • 각 섹션에 문제가 하나 이상 있어야 한다.

만들 수 있는 정렬 순서 중 아무거나 하나를 찾아 각 문제마다 결정한 난이도와 속한 섹션 번호를 출력하자.

입력

첫 번째 줄에 정수 NN과 MM이 공백으로 구분되어 주어진다.

두 번째 줄부터 NN개의 줄에 걸쳐 문제 난이도 정보가 주어진다. 그중 ii번째 줄은 정수 l_il\_i, r_ir\_i가 공백으로 구분되어 주어진다.

출력

문제의 정보를 총 NN개의 줄에 걸쳐 출력한다. 그중 ii번째 줄에는 정수 d_id\_i와 s_is\_i를 공백으로 구분하여 출력한다. d_id\_i는 ii번 문제의 결정한 난이도, s_is\_i는 ii번 문제가 속한 섹션 번호를 의미한다. 가능한 문제 정렬 순서가 여러 가지라면 그중 아무거나 하나를 출력한다.

만약 MM개의 섹션으로 나누는 게 불가능하다면 -1을 대신 출력한다.

제한

  • 1≤N,M≤400,0001 \le N, M \le 400\\,000
  • 1≤l_i≤r_i≤1091 \le l\_i \le r\_i \le 10^9
  • 1≤i≤N1 \le i \le N
  • l_i≤d_i≤r_il\_i \le d\_i \le r\_i
  • 1≤s_i≤M1 \le s\_i \le M

예제2

  1. 예제 1

    입력
    3 2
    3 3
    2 4
    1 5
    
    예상 출력
    3 2
    2 1
    2 1
    
  2. 예제 2

    입력
    3 4
    1 6
    3 8
    3 3
    
    예상 출력
    -1