배찬우는 배열을 좋아해

아직 제출이 없습니다시간 제한3초메모리 제한512 MB

문제

찬우는 오늘 프로그래밍 기초 강의에서 2차원 배열에 대해 배웠다. 너무 재미있던 찬우는 2차원 배열에다 연산을 진행하기로 결심했다.

아래와 같은 두 가지 종류의 연산이 쿼리로 주어진다.

  • 0 i j k : ii번 행의 jj번 열의 값을 kk로 바꾼다.
  • 1 i j : ii번 행과 jj번 행을 swap한다.

swap 이란 ii번 행의 모든 원소와 jj번 행의 모든 원소를 바꾸는 연산이다.

qq개의 쿼리를 수행한 후 바뀐 배열의 최종 결과를 출력하시오.

입력

첫째 줄에 행의 개수 NN과 열의 개수 MM, 쿼리의 개수 qq가 주어진다. (1N,M3000,1q106)(1 \le N , M \le 3000, 1 \le q \le 10^6)

2번째 줄부터 NN개의 줄에 걸쳐 NNMM열의 2차원 배열이 입력으로 주어진다. 배열의 각 원소의 값은 11 이상 10,00010\\,000 이하의 정수이다.

이후 qq개 줄에 걸쳐 쿼리가 입력으로 주어진다.

쿼리는 0 i j k 혹은 1 i j의 형태로 주어지며, 쿼리의 첫 번째 값이 0이면 첫 번째 쿼리를, 1이면 두 번째 쿼리를 수행한다.

첫 번째 쿼리의 경우 ii, jj, kk의 범위는 (0iN1,0jM1,1k10,000)(0 \le i \le N-1, 0 \le j \le M-1, 1 \le k \le 10\\,000)이며 kk는 정수이다.

두 번째 쿼리의 경우 ii, jj의 범위는 (0i,jN1)(0 \le i, j \le N-1)이다.

출력

qq개의 쿼리를 전부 수행한 후의 2차원 배열을 출력한다.