#845. 更快的旋转(rotate)

更快的旋转(rotate)

题目描述

小灰灰拿到了一个 n×nn \times n 的方阵 aa,其中第 ii 行第 jj 列的元素满足:

ai,j=(i1)×n+ja_{i,j} = (i - 1) \times n + j

现在小蓝对该方阵进行了 qq 次操作,每次操作属于以下两种类型之一:

  • 输入 1 x y len,表示将以 (x,y)(x, y) 为左上角、边长为 lenlen 的子矩阵进行一次 顺时针旋转
  • 输入 2 x y len,表示将以 (x,y)(x, y) 为左上角、边长为 lenlen 的子矩阵进行一次 逆时针旋转

所有操作完成后,小灰灰希望查询若干个位置的数值。 给定 dd 个查询,每个查询给出一个坐标 (dxi,dyi)(dx_i, dy_i),你需要输出最终矩阵中该位置上的数值。

输入格式

第一行输入一个整数 nn

第二行输入一个整数 qq

接下来 qq 行,每行描述一个操作,格式为:op x y len

接下来一行输入一个整数 dd

接下来 dd 行,每行输入两个整数 dxi,dyidx_i, dy_i

输出格式

输出共 dd 行,第 ii 行输出一个整数,表示最终矩阵中 (dxi,dyi)(dx_i, dy_i) 位置上的数值。

样例 1 输入

3
2
1 2 2 2
2 2 1 2
4
1 3
3 1
2 2
3 3

样例 1 输出

3
4
9
6

样例 1 解释

两次操作分别对局部子矩阵进行了顺时针与逆时针旋转,最终得到目标位置的结果。

样例 2

见选手目录下的 rotate/rotate2.inrotate/rotate2.ans。 该测试用例满足测试点 131613 \sim 16 的约束条件。

样例 3

见选手目录下的 rotate/rotate3.inrotate/rotate3.ans。 该测试用例满足测试点 172017 \sim 20 的约束条件。

数据范围

对于 100%100\% 的数据:

  • 1n,q1051 \le n, q \le 10^5
  • 1d101 \le d \le 10
  • op{1,2}op \in \{1, 2\}
  • 1x,y,len,dxi,dyin1 \le x, y, len, dx_i, dy_i \le n
  • x+len1nx + len - 1 \le n
  • y+len1ny + len - 1 \le n

各测试点的附加限制如下表所示:

测试点编号 n,qn, q \le 特殊性质
121\sim 2 100000100000 保证所有的 lenlen 均为 11
363 \sim 6 100100 保证所有的 lenlen 均为 nn
797 \sim 9 所有的 opop 值均为 11
101210 \sim 12 所有的 opop 值均为 22
131613 \sim 16
172017 \sim 20 100000100000

点击下载大样例