#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
 
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;

const int C = 3;
const int BL = 800;

unsigned int B[100001][3];

struct change
{
	unsigned int add,mult;
};

struct block
{
	int l,r;
	change mod[3][3];
	unsigned int sum[3];
};

block init(int l, int r)
{
	block tmp;
	memset(tmp.sum,0,sizeof(tmp.sum));
	////////cerr<<"SUM : "<<tmp.sum[0]<<'\n';
	for(int j=0;j<3;j++)
	{
		for(int i=l;i<=r;i++)
		{
			tmp.sum[j]+=B[i][j];
			//////cerr<<i<<' '<<j<<' '<<B[i][j]<<' '<<tmp.sum[j]<<' '<<l<<' '<<r<<'\n';
		}
		//////cerr<<l<<' '<<r<<' '<<tmp.sum[j]<<'\n';
	}
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			tmp.mod[i][j].add=0;
			if(i==j) tmp.mod[i][j].mult=1;
			else tmp.mod[i][j].mult=0;
		}
	}
	tmp.l=l; tmp.r=r;
	return tmp;
}


list<block> vec; //linked list of blocks
typedef list<block>::iterator lit;

unsigned int queryblock(lit a, int idx)
{
	return a->sum[idx];
}

void propogate(lit it) //update a for the part it
{
	int l = it->l; int r = it->r;
	for(int i = l; i <= r; i++)
	{
		unsigned int s[3];
		for(int j = 0; j < 3; j++)
		{
			s[j]=0;
			for(int k = 0; k < 3; k++)
			{
				s[j] += B[i][k]*it->mod[j][k].mult;
				s[j] += it->mod[j][k].add;
				////cerr<<it->mod[j][k].mult<<' '<<it->mod[j][k].add<<" | ";
			}
			////cerr<<s[j]<<' ';
			////cerr<<'\n';
		}
		////cerr<<'\n';
		for(int j=0;j<3;j++) 
		{
			B[i][j]=s[j];
		}
	}	
}

void recalc(int n) //recalculates the whole thing. call recalc(w)
{
	for(lit it = vec.begin(); it != vec.end(); it++)
	{
		propogate(it);
	}	
	vec.clear();
	for(int i = 0; i < n; i+=BL)
	{
		int l = i; int r = min(n-1,i+BL-1);
		vec.pb(init(l,r));
		////////cerr<<l<<' '<<r<<'\n';
	}
}
 
lit split(lit it, int mid) //split into [l, mid] and [mid+1, r]. returns the last position
{
	int l = it->l;
	int r = it->r;
	propogate(it);
	block a = init(l,mid);
	block b = init(mid+1,r);
	//////cerr<<"SUM : "<<b.sum[0]<<'\n';
	lit it2 = vec.insert(it,a);
	it2++;
	lit it3 = vec.erase(it2);
	return vec.insert(it3,b);
}

unsigned int query(int l, int r, int idx)
{
	unsigned int res = 0;
	for(lit it = vec.begin(); it != vec.end(); it++)
	{
		int L = it->l; int R = it->r;
		if(L>R) continue;
		if(R<l||L>r) continue;
		
		if(l<=L&&R<=r)
		{
			res+=queryblock(it,idx);
		}
		else if(L<=l&&r<=R) //L l r R
		{
			//////cerr<<"HERE IT : "<<it->l<<' '<<it->r<<' '<<it->sum[idx]<<' '<<B[0][0]<<' '<<it->mod[0][0].mult<<'\n';
			lit tmp = split(it,l-1);
			//////cerr<<"HERE 2 : "<<tmp->l<<' '<<tmp->r<<' '<<tmp->sum[idx]<<' '<<B[0][0]<<'\n';
			lit tmp2 = split(tmp,r);
			tmp2--;
			//////cerr<<"HERE : "<<tmp2->l<<' '<<tmp2->r<<' '<<tmp2->sum[idx]<<'\n';
			it=tmp2;
			res+=queryblock(it,idx);
		}
		else if(L<l) //L l R r
		{
			lit tmp = split(it,l-1);
			it=tmp;
			 //cerr<<"L R : "<<it->l<<' '<<it->r<<' '<<res<<' '<<queryblock(it,idx)<<'\n';
			res+=queryblock(it,idx);
		}
		else if(R>r) //l L r R
		{
			lit tmp = split(it,r);
			tmp--;
			it=tmp;
			//cerr<<"L R : "<<it->l<<' '<<it->r<<' '<<res<<' '<<queryblock(it,idx)<<'\n';
			res+=queryblock(it,idx);
		}
		else assert(0);
	}
	return res;
}

void copy(int l, int r, int t1, int t2)
{
	for(lit it = vec.begin(); it != vec.end(); it++)
	{
		int L = it->l; int R = it->r;
		if(L>R) continue;
		if(R<l||L>r) continue;
		if(l<=L&&R<=r)
		{
			for(int j=0;j<3;j++)
			{
				it->mod[t2][j]=it->mod[t1][j];
			}
			it->sum[t2]=it->sum[t1];
		}
		else if(L<=l&&r<=R) //L l r R
		{
			lit tmp = split(it,l-1);
			lit tmp2 = split(tmp,r);
			tmp2--;
			it=tmp2;
			for(int j=0;j<3;j++)
			{
				it->mod[t2][j]=it->mod[t1][j];
			}
			it->sum[t2]=it->sum[t1];
		}
		else if(L<l) //L l R r
		{
			lit tmp = split(it,l-1);
			it=tmp;
			for(int j=0;j<3;j++)
			{
				it->mod[t2][j]=it->mod[t1][j];
			}
			it->sum[t2]=it->sum[t1];
		}
		else if(R>r) //l L r R
		{
			lit tmp = split(it,r);
			tmp--;
			it=tmp;
			for(int j=0;j<3;j++)
			{
				it->mod[t2][j]=it->mod[t1][j];
			}
			it->sum[t2]=it->sum[t1];
		}
		else assert(0);
	}
}

void swap(int l, int r, int t1, int t2)
{
	for(lit it = vec.begin(); it != vec.end(); it++)
	{
		int L = it->l; int R = it->r;
		if(L>R) continue;
		if(R<l||L>r) continue;
		if(l<=L&&R<=r)
		{
			for(int j=0;j<3;j++)
			{
				swap(it->mod[t2][j],it->mod[t1][j]);
			}
			swap(it->sum[t2],it->sum[t1]);
		}
		else if(L<=l&&r<=R) //L l r R
		{
			lit tmp = split(it,l-1);
			lit tmp2 = split(tmp,r);
			tmp2--;
			it=tmp2;
			for(int j=0;j<3;j++)
			{
				swap(it->mod[t2][j],it->mod[t1][j]);
			}
			swap(it->sum[t2],it->sum[t1]);
		}
		else if(L<l) //L l R r
		{
			lit tmp = split(it,l-1);
			it=tmp;
			for(int j=0;j<3;j++)
			{
				swap(it->mod[t2][j],it->mod[t1][j]);
			}
			swap(it->sum[t2],it->sum[t1]);
		}
		else if(R>r) //l L r R
		{
			lit tmp = split(it,r);
			tmp--;
			it=tmp;
			for(int j=0;j<3;j++)
			{
				swap(it->mod[t2][j],it->mod[t1][j]);
			}
			swap(it->sum[t2],it->sum[t1]);
		}
		else assert(0);
	}
}

void modify(int l, int r, int t, unsigned int p1, unsigned int p2)
{
	for(lit it = vec.begin(); it != vec.end(); it++)
	{
		int L = it->l; int R = it->r;
		if(L>R) continue;
		if(R<l||L>r) continue;
		if(l<=L&&R<=r)
		{
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				unsigned int a = it->mod[t][j].mult;
				unsigned int b = it->mod[t][j].add;
				it->mod[t][j].mult=a*p1;
				it->mod[t][j].add=b*p1;
			}
			it->mod[t][0].add+=p2;
			it->sum[t]*=p1;
			it->sum[t]+=(R-L+1)*p2;
		}
		else if(L<=l&&r<=R) //L l r R
		{
			lit tmp = split(it,l-1);
			lit tmp2 = split(tmp,r);
			tmp2--;
			it=tmp2;
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				unsigned int a = it->mod[t][j].mult;
				unsigned int b = it->mod[t][j].add;
				it->mod[t][j].mult=a*p1;
				it->mod[t][j].add=b*p1;
			}
			it->mod[t][0].add+=p2;
			it->sum[t]*=p1;
			it->sum[t]+=(it->r-it->l+1)*p2;
		}
		else if(L<l) //L l R r
		{
			lit tmp = split(it,l-1);
			it=tmp;
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				unsigned int a = it->mod[t][j].mult;
				unsigned int b = it->mod[t][j].add;
				it->mod[t][j].mult=a*p1;
				it->mod[t][j].add=b*p1;
			}
			it->mod[t][0].add+=p2;
			it->sum[t]*=p1;
			it->sum[t]+=(it->r-it->l+1)*p2;
			 //cerr<<"SUM : "<<it->l<<' '<<it->r<<' '<<it->sum[t]<<'\n';
		}
		else if(R>r) //l L r R
		{
			lit tmp = split(it,r);
			tmp--;
			it=tmp;
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				unsigned int a = it->mod[t][j].mult;
				unsigned int b = it->mod[t][j].add;
				it->mod[t][j].mult=a*p1;
				it->mod[t][j].add=b*p1;
			}
			it->mod[t][0].add+=p2;
			it->sum[t]*=p1;
			it->sum[t]+=(it->r-it->l+1)*p2;
			 //cerr<<"SUM : "<<it->l<<' '<<it->r<<' '<<it->sum[t]<<'\n';
		}
		else assert(0);
		/*
		propogate(it);
		block tmp = init(it->l,it->r);
		(*it) = tmp;
		*/
	}
}

void advmodify(int l, int r, int t1, int t2, unsigned int p)
{
	for(lit it = vec.begin(); it != vec.end(); it++)
	{
		int L = it->l; int R = it->r;
		if(L>R) continue;
		if(R<l||L>r) continue;
		if(l<=L&&R<=r)
		{
			it->sum[t2]+=p*it->sum[t1];
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				it->mod[t2][j].mult += it->mod[t1][j].mult*p;
				it->mod[t2][j].add += it->mod[t1][j].add*p;
			}
		}
		else if(L<=l&&r<=R) //L l r R
		{
			lit tmp = split(it,l-1);
			lit tmp2 = split(tmp,r);
			tmp2--;
			it=tmp2;
			it->sum[t2]+=p*it->sum[t1];
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				it->mod[t2][j].mult += it->mod[t1][j].mult*p;
				it->mod[t2][j].add += it->mod[t1][j].add*p;
			}
		}
		else if(L<l) //L l R r
		{
			lit tmp = split(it,l-1);
			it=tmp;
			it->sum[t2]+=p*it->sum[t1];
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				it->mod[t2][j].mult += it->mod[t1][j].mult*p;
				it->mod[t2][j].add += it->mod[t1][j].add*p;
			}
		}
		else if(R>r) //l L r R
		{
			lit tmp = split(it,r);
			tmp--;
			it=tmp;
			it->sum[t2]+=p*it->sum[t1];
			for(int j=0;j<3;j++)
			{
				//it->mod[t2][j]=it->mod[t1][j];
				it->mod[t2][j].mult += it->mod[t1][j].mult*p;
				it->mod[t2][j].add += it->mod[t1][j].add*p;
			}
		}
		else assert(0);
		/*
		propogate(it);
		block tmp = init(it->l,it->r);
		(*it) = tmp;
		*/
	}
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	/*
	freopen("diskraid.txt","r",stdin);
	freopen("diskraidans.txt","w",stdout);
	*/
	int n, w, q;
	cin>>n>>w>>q;
	for(int i=0;i<w;i++)
	{
		for(int j=0;j<n;j++)
		{
			//read the i-th element of j-th register
			cin>>B[i][j];
		}
	}
	recalc(w);
	for(int i=0;i<q;i++)
	{
		char c; cin>>c;
		if(c=='Q')
		{
			int l,r,t;
			cin>>l>>r>>t;
			unsigned int ans = query(l,r,t);
			assert(ans>=0);
			//cout<<"Case #"<<i<<" : ";
			cout<<ans<<'\n';
		}
		else if(c=='C')
		{
			int l,r,t1,t2;
			cin>>l>>r>>t1>>t2; //copy t1 into t2
			copy(l,r,t1,t2);
		}
		else if(c=='M')
		{
			int l,r,t; unsigned int p1,p2;
			cin>>l>>r>>t>>p1>>p2; //*p1 + p2 for all [l, r] in t
			modify(l,r,t,p1,p2);
		}
		else if(c=='A')
		{
			int l,r,t1,t2;
			cin>>l>>r>>t1>>t2; //t1*p into t2
			unsigned int p;
			cin>>p;
			advmodify(l,r,t1,t2,p);
		}
		else
		{
			int l,r,t1,t2;
			cin>>l>>r>>t1>>t2; //swap t1 and t2
			swap(l,r,t1,t2);
		}
		if(int(vec.size())>=BL) recalc(w);
	}
}
