卡片翻转
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

现在有一张卡片,卡片被横线和竖线分成了 n \times m 的格子, 第 i 行, 第 j 列的格子中有数字 a_{i, j} (1 \le i \le n, 1 \le j \le m)

进行 T 次操作, 总共有两种操作:

  • 第一种操作,给定两个数字 x, y , 表示将该卡片分成四个部分 ([1, 1, x, y], [x + 1, 1, n, y], [1, y + 1, x, m], [x + 1, y + 1, n, m]), 其中[x1, y1, x2, y2]表示一个以[x1, y1]为左上角, [x2, y2] 为右下角的矩形

    再将这四个部分的矩形分别旋转 180° , 得到新的卡片

  • 第二种操作, 表示将该卡片以主对角线(左上角到右下角)为轴进行翻转,设新的卡片上第 i 行, 第 j 列的格子中有数字 b_{i, j}, 则 b_{i, j} = a_{j, i}, 原先 n \times m 的卡片也变成了 m \times n 的尺寸

数据保证 1 \le n \times m \le 10^6, 1 \le T \le 10^6, 1 \le a_{i, j} \le 10^9

样例解释 :

输入描述:

第一行,三个正整数 n, m, T

接下来 nm 列,共 n \times m个正整数,表示该卡片的初始状态

接下来 T 行, 每行第一个正整数 op 表示操作的种类,如果是第一种操作,op 后面紧跟两个正整数 x, y, 其中 op, x, y 三个正整数用空格隔开

输出描述:

nm 列 或者 mn 列, 表示卡片的最终状态
示例1

输入

复制
4 5 5
8 19 8 20 19
11 19 6 10 2
2 12 20 13 14
19 7 1 1 13
1 4 3
1 2 4
2
1 2 3
1 2 1

输出

复制
19 2 14 13
8 11 2 19
19 19 12 7
8 6 20 1
20 10 13 1