# include<bits/stdc++.h>
# define int long long
using namespace std;
const int MAXN=3005;
int a[MAXN][MAXN],d[MAXN][MAXN];
int n,m;
inline int read()
{
int X=0,w=0;char c=0;
while (!(c>='0'&&c<='9')) w|=c=='-',c=getchar();
while ((c>='0'&&c<='9')) X=(X<<1)+(X<<3)+(c^48),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<0) { putchar('-'); x=-x;}
if (x>9) write(x/10);
putchar('0'+x%10);
}
inline void writeln(int x){write(x);putchar('\n');}
struct Tree{
int c[MAXN][MAXN];
Tree(){ memset(c,0,sizeof(c));}
inline void update(int x,int y,int z){
for (int i=x;i<=n;i+=i&(-i))
for (int j=y;j<=m;j+=j&(-j)){
c[i][j]+=z;
}
}
}T1,T2,T3,T4;
# define A (x+1)
# define B (y+1)
inline int ask(int x,int y){
int ret=0;
for (int i=x;i;i-=i&(-i))
for (int j=y;j;j-=j&(-j))
ret+=A*B*T1.c[i][j]-B*T2.c[i][j]-A*T3.c[i][j]+T4.c[i][j];
return ret;
}
inline void add(int x,int y,int val){
T1.update(x,y,val); T2.update(x,y,val*x);
T3.update(x,y,val*y); T4.update(x,y,val*x*y);
}
inline void work1()
{
int x1=read(),y1=read(),x2=read(),y2=read();
int ans=ask(x2,y2)-ask(x2,y1-1)-ask(x1-1,y2)+ask(x1-1,y1-1);
writeln(ans);
}
inline void work2()
{
int x1=read(),y1=read(),x2=read(),y2=read(),d=read();
add(x1,y1,d); add(x1,y2+1,-d);
add(x2+1,y1,-d); add(x2+1,y2+1,d);
}
inline void work3()
{
int x1=read(),y1=read(),x2=read(),y2=read(),d=read(); d=-d;
add(x1,y1,d); add(x1,y2+1,-d);
add(x2+1,y1,-d); add(x2+1,y2+1,d);
}
inline void work4()
{
int x1=read(),y1=read();
int x2=x1,y2=y1;
int ans=ask(x2,y2)-ask(x2,y1-1)-ask(x1-1,y2)+ask(x1-1,y1-1);
writeln(ans);
}
signed main()
{
// #ifdef LOCAL
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
// #endif
n=read();m=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
a[i][j]=read();
d[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
add(i,j,d[i][j]);
char opt;
while (true) {
cin>>opt;
switch (opt) {
case 'Q':work1();break;
case 'A':work2();break;
case 'D':work3();break;
case 'F':work4();break;
case 'E':goto exit;break;
}
}
exit:;
return 0;
}