#include <math.h>
#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF= 2147483647;
#define MAX(a,b) ((a>b)?a:b)
#define MIN(a,b) ((a<b)?a:b)
#define REP(i,a) for(int i=0;i<(a);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define pb(x) push_back(x)
#define SORT(a,n) sort(begin(a),begin(a)+n)
#define REV(a,n) reverse(begin(a),begin(a)+n)
#define ll long long
#define pii pair<int,int>
#define MOD 1000000007
#define DEBUG(x) cout<<">>>> "<<x<<endl
int matrix[100][100];
int queryType[10000];
int value[10000];
int main(){
//int n;
//int m;
//
//scanf("%d %d",&n,&m);
//
//int T;
//scanf("%d %d",&T);
//
int n,m,q;
cin>>n>>m>>q;
int idx=0;
REP(i,q){
int type=0;
cin>>type;
if(type==1 || type==2){
queryType[idx]=type;
cin>>value[idx];
idx++;
}else{
int x,y;
cin>>x>>y;
int finalX=y-1;
int finalY=x-1;
REP(j,idx){
if(queryType[j]==1 && value[j]==x){
finalX++;
if(finalX>m-1){
finalX=0;
}
}else if(queryType[j]==2 && value[j]==y){
finalY--;
if(finalY<0){
finalY=n-1;
}
}
}
//cout<<finalX<<" "<<finalY<<endl<<endl;
cin>>matrix[finalY][finalX];
}
}
REP(i,n){REP(j,m){cout<<matrix[i][j]<<" ";}cout<<endl;}
return 0;
}
I2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IElORj0gMjE0NzQ4MzY0NzsKCiNkZWZpbmUgTUFYKGEsYikgKChhPmIpP2E6YikKI2RlZmluZSBNSU4oYSxiKSAoKGE8Yik/YTpiKQojZGVmaW5lIFJFUChpLGEpIGZvcihpbnQgaT0wO2k8KGEpO2krKykKI2RlZmluZSBGT1IoaSxhLGIpIGZvcihpbnQgaT0oYSk7aTw9KGIpO2krKykKI2RlZmluZSBwYih4KSBwdXNoX2JhY2soeCkKI2RlZmluZSBTT1JUKGEsbikgc29ydChiZWdpbihhKSxiZWdpbihhKStuKQojZGVmaW5lIFJFVihhLG4pIHJldmVyc2UoYmVnaW4oYSksYmVnaW4oYSkrbikKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBwaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CiNkZWZpbmUgREVCVUcoeCkgY291dDw8Ij4+Pj4gIjw8eDw8ZW5kbAogCgppbnQgbWF0cml4WzEwMF1bMTAwXTsKaW50IHF1ZXJ5VHlwZVsxMDAwMF07CmludCB2YWx1ZVsxMDAwMF07CmludCBtYWluKCl7CiAKCS8vaW50IG47CgkvL2ludCBtOwoJLy8KCS8vc2NhbmYoIiVkICVkIiwmbiwmbSk7CgkvLwoJLy9pbnQgVDsKCS8vc2NhbmYoIiVkICVkIiwmVCk7CgkvLwoJaW50IG4sbSxxOwoJY2luPj5uPj5tPj5xOwoJaW50IGlkeD0wOwoJUkVQKGkscSl7CgkJaW50IHR5cGU9MDsKCQljaW4+PnR5cGU7CgkJaWYodHlwZT09MSB8fCB0eXBlPT0yKXsKCQkJcXVlcnlUeXBlW2lkeF09dHlwZTsKCQkJY2luPj52YWx1ZVtpZHhdOwoJCQlpZHgrKzsKCQl9ZWxzZXsKCQkJaW50IHgseTsKCQkJY2luPj54Pj55OwoJCQlpbnQgZmluYWxYPXktMTsKCQkJaW50IGZpbmFsWT14LTE7CgoJCQlSRVAoaixpZHgpewoJCQkJaWYocXVlcnlUeXBlW2pdPT0xICYmIHZhbHVlW2pdPT14KXsKCQkJCQlmaW5hbFgrKzsKCQkJCQlpZihmaW5hbFg+bS0xKXsKCQkJCQkJZmluYWxYPTA7CgkJCQkJfQoJCQkJfWVsc2UgaWYocXVlcnlUeXBlW2pdPT0yICYmIHZhbHVlW2pdPT15KXsKCQkJCQlmaW5hbFktLTsKCQkJCQlpZihmaW5hbFk8MCl7CgkJCQkJCWZpbmFsWT1uLTE7CgkJCQkJfQoJCQkJfQoJCQkKCQkJfQoJCQkvL2NvdXQ8PGZpbmFsWDw8IiAiPDxmaW5hbFk8PGVuZGw8PGVuZGw7CgkJCWNpbj4+bWF0cml4W2ZpbmFsWV1bZmluYWxYXTsKCQl9Cgl9CgoJUkVQKGksbil7UkVQKGosbSl7Y291dDw8bWF0cml4W2ldW2pdPDwiICI7fWNvdXQ8PGVuZGw7fQoKCXJldHVybiAwOwp9Cg==