아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

나선 행렬

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

요약
질의로 주어진 부분 행렬마다 모든 칸을 인접 칸으로 이어 한 번씩 방문하는 경로가 있는지, 그리고 방문 순서대로 적은 값이 연속된 정수 구간을 이루는지 판별합니다.
난이도

어려움10점 중 9점

유형
행렬, 누적 합, 구현
정답자
아직 제출이 없습니다

문제

두 칸이 인접한다는 것은 다음 중 하나를 만족한다는 뜻이다.

  • ra=rbr_a = r_b이고 ∣ca−cb∣=1|c_a - c_b| = 1이다.
  • ca=cbc_a = c_b이고 ∣ra−rb∣=1|r_a - r_b| = 1이다.

나선 행렬은 다음 조건을 모두 만족하는 행렬이다.

  • 행렬에는 서로 다른 양의 정수만 들어 있다.
  • 어떤 칸 (i,j)(i, j)에서 출발해 나머지 모든 칸을 하나의 경로로 방문할 수 있다. 경로에서 연속한 두 칸은 항상 인접한다. 방문한 순서대로 값을 읽으면 연속된 정수 구간 [l..r][l..r]을 이룬다.

n×mn \times m 크기의 서로 다른 양의 정수 행렬과 qq개의 질의가 주어진다. 각 질의는 꼭짓점 (r1,c1)(r_1, c_1)과 (r2,c2)(r_2, c_2)로 부분 행렬을 나타낸다. 각 질의에 대해 이 부분 행렬이 나선 행렬인지 판단한다.

입력

첫 줄에 세 정수 nn, mm, qq (1≤n,m≤20001 \le n, m \le 2000, 1≤q≤1061 \le q \le 10^6)가 주어진다. 각각 행렬의 크기와 질의의 개수이다.

다음 nn개 줄에는 각각 mm개의 정수가 주어진다. ii번째 줄의 jj번째 정수는 ii행 jj열의 원소 ai,ja_{i, j}이다 (1≤ai,j≤1091 \le a_{i, j} \le 10^9). 모든 원소는 서로 다르다고 보장된다.

다음 qq개 줄에는 네 정수 r1r_1, c1c_1, r2r_2, c2c_2 (1≤r1≤r2≤n1 \le r_1 \le r_2 \le n, 1≤c1≤c2≤m1 \le c_1 \le c_2 \le m)가 주어진다. 부분 행렬의 꼭짓점이다.

출력

각 질의에 대해 부분 행렬이 나선 행렬이면 YES를, 아니면 NO를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    5 7 10
    10 11 12 13 14 15 16
    9 2 3 32 31 30 17
    8 1 4 25 26 29 18
    7 6 5 24 27 28 19
    52 51 50 23 22 21 20
    1 1 5 7
    1 1 4 1
    2 2 5 3
    1 4 5 7
    1 1 4 3
    1 1 5 3
    2 2 2 2
    2 2 2 3
    3 4 5 7
    3 3 4 4
    
    예상 출력
    NO
    YES
    NO
    YES
    YES
    NO
    YES
    YES
    YES
    NO