#include<stdio.h>
int main()
{
int n,m,t,b=0,p,q,d=1;
char s[10];
scanf("%d %d %d",&n,&m,&t);
int a[n*m],a1[n*m];//确定所需要的数组包含元素个数
p=n,q=m;
for(int i=0;i<n;i++)
{
for(int j=0; j<m; j++)
{
scanf("%d",&a[b]);
b++;
}
}//输入初始矩阵的元素
gets(s);//gets和scanf相覆盖 抵消一下
for(int i=1;i<=t;i++)
{
gets(s);
if(s[0]=='1')//1的时候将转换的矩阵行列数转换成数字
{
p=s[2]-'0';
q=s[4]-'0';
continue;
}
if(s[0]=='2')//2的时候用一个新的数组来记录新的顺序,记录完之后交换行和列
{
int b1=0;
if(d==1)
{
int t=p;
for(int k=0; k<q;k++)
{
for(int l=0; l<p;l++)
{
a1[b1]=a[l*q+k];
b1++;
}
}
p=q;
q=t;
d*=-1;//交换偶数次是 1奇数次是-1,用于持续变换新的数组顺序
}
if(d==-1)
{
int t=p;
for(int k=0; k<q;k++)
{
for(int l=0; l<p;l++)
{
a[b1]=a1[l*q+k];
b1++;
}
}
p=q;
q=t;
d*=-1;
}
}
if(s[0]=='3'&&d==1)//根据pq的值去输出对应数组中的值
{
if(i!=t)
{
printf("%d\n",a[(s[2]-'0')*q+(s[4]-'0')]);
continue;
}
else//不是最后一行的时候换行 在最后一行的时候不换行
{
printf("%d",a[(s[2]-'0')*q+(s[4]-'0')]);
break;
}
}
if(s[0]=='3'&&d==-1)
{
if(i!=t)
{
printf("%d\n",a1[(s[2]-'0')*q+(s[4]-'0')]);
continue;
}
else
{
printf("%d",a1[(s[2]-'0')*q+(s[4]-'0')]);
break;
}
}
}
}