#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
#include <cctype>
#include <utility>
#include <map>
#include <string>
#include <climits>
#include <set>
#include <string>
#include <sstream>
#include <utility>
#include <ctime>
using std::priority_queue;
using std::vector;
using std::swap;
using std::stack;
using std::sort;
using std::max;
using std::min;
using std::pair;
using std::map;
using std::string;
using std::cin;
using std::cout;
using std::set;
using std::queue;
using std::string;
using std::istringstream;
using std::make_pair;
using std::getline;
using std::greater;
using std::endl;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PAIR;
const int MAXN(111111);
const int SIGMA_SIZE(130);
const int MAXM(110);
const int MAXE(200010);
const int MAXH(18);
const int INFI((INT_MAX-1) >> 2);
const int BASE(131);
const ULL LIM(1000000000000000ull);
struct ELE
{
int sum, mi, ma, size, flag1, flag2;
};
struct SEGMENT_TREE
{
ELE table[MAXN << 2];
inline int l_son(int sour)
{
return sour << 1;
}
inline int r_son(int sour)
{
return (sour << 1)|1;
}
static void push_up(ELE &sour, const ELE &op1, const ELE &op2)
{
sour.sum = op1.sum+op2.sum;
sour.mi = op1.mi < op2.mi? op1.mi: op2.mi;
sour.ma = op1.ma > op2.ma? op1.ma: op2.ma;
}
static void push_down(ELE &sour, ELE &op1, ELE &op2)
{
if(sour.flag2)
{
op1.mi = op1.ma = op2.mi = op2.ma = sour.flag2;
op1.sum = sour.flag2*op1.size;
op2.sum = sour.flag2*op2.size;
op1.flag1 = op2.flag1 = 0;
op1.flag2 = op2.flag2 = sour.flag2;
sour.flag2 = 0;
}
if(sour.flag1)
{
op1.mi += sour.flag1;
op2.mi += sour.flag1;
op1.ma += sour.flag1;
op2.ma += sour.flag1;
op1.sum += sour.flag1*op1.size;
op2.sum += sour.flag1*op2.size;
op1.flag1 += sour.flag1;
op2.flag1 += sour.flag1;
sour.flag1 = 0;
}
}
void build_tree(int l, int r, int root)
{
table[root].mi = table[root].ma = table[root].sum = 0;
table[root].flag1 = table[root].flag2 = 0;
table[root].size = r-l+1;
if(l == r)
return;
int m = (l+r) >> 1;
build_tree(l, m, l_son(root));
build_tree(m+1, r, r_son(root));
}
void add(int ql, int qr, int value, int l, int r, int root)
{
if(ql <= l && qr >= r)
{
table[root].mi += value;
table[root].ma += value;
table[root].sum += value*table[root].size;
table[root].flag1 += value;
return;
}
push_down(table[root], table[l_son(root)], table[r_son(root)]);
int m = (l+r) >> 1;
if(ql <= m)
add(ql, qr, value, l, m, l_son(root));
if(qr > m)
add(ql, qr, value, m+1, r, r_son(root));
push_up(table[root], table[l_son(root)], table[r_son(root)]);
}
void set_v(int ql, int qr, int value, int l, int r, int root)
{
if(ql <= l && qr >= r)
{
table[root].mi = table[root].ma = value;
table[root].sum = value*table[root].size;
table[root].flag1 = 0;
table[root].flag2 = value;
return;
}
push_down(table[root], table[l_son(root)], table[r_son(root)]);
int m = (l+r) >> 1;
if(ql <= m)
set_v(ql, qr, value, l, m, l_son(root));
if(qr > m)
set_v(ql, qr, value, m+1, r, r_son(root));
push_up(table[root], table[l_son(root)], table[r_son(root)]);
}
void query(int ql, int qr, int l, int r, int root, ELE &ans)
{
if(ql <= l && qr >= r)
{
ans = table[root];
return;
}
push_down(table[root], table[l_son(root)], table[r_son(root)]);
ELE ans1, ans2;
int m = (l+r) >> 1;
if(ql <= m)
{
query(ql, qr, l, m, l_son(root), ans1);
ans = ans1;
}
if(qr > m)
{
query(ql, qr, m+1, r, r_son(root), ans2);
if(ql <= m)
push_up(ans, ans1, ans2);
else
ans = ans2;
}
push_up(table[root], table[l_son(root)], table[r_son(root)]);
}
};
SEGMENT_TREE st[21];
int main()
{
int r, c, m;
while(~scanf("%d%d%d", &r, &c, &m))
{
for(int i = 1; i <= r; ++i)
st[i].build_tree(1, c, 1);
int flag, x1, y1, x2, y2, op;
for(int i = 0; i < m; ++i)
{
scanf("%d", &flag);
if(flag == 1)
{
scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &op);
for(int j = x1; j <= x2; ++j)
st[j].add(y1, y2, op, 1, c, 1);
}
if(flag == 2)
{
scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &op);
for(int j = x1; j <= x2; ++j)
st[j].set_v(y1, y2, op, 1, c, 1);
}
if(flag == 3)
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
ELE ans, ans1, ans2;
st[x1].query(y1, y2, 1, c, 1, ans);
for(int j = x1+1; j <= x2; ++j)
{
st[j].query(y1, y2, 1, c, 1, ans1);
ans2 = ans;
SEGMENT_TREE::push_up(ans, ans1, ans2);
}
printf("%d %d %d\n", ans.sum, ans.mi, ans.ma);
}
}
}
return 0;
}