1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn = 1e6 + 10;
4 struct node{
5 int l, r, addv, setv, maxv, minv, sum;
6 }e[maxn * 4];
7 void bulid(int a, int b, int c){
8 e[c].l = a, e[c].r = b;
9 e[c].addv = e[c].setv = e[c].minv = e[c].maxv = e[c].sum = 0;
10 if(a==b) return;
11 int mid = (a+b)/2;
12 bulid(a, mid, c*2);
13 bulid(mid+1, b, c*2+1);
14 }
15 void pushdown(int c){
16 int l = 2*c, r = 2*c+1;
17 if(e[c].setv){
18 e[l].addv = e[r].addv = 0;
19 e[l].setv = e[r].setv = e[c].setv;
20 e[l].minv = e[r].minv = e[c].setv;
21 e[l].maxv = e[r].maxv = e[c].setv;
22 e[l].sum = (e[l].r - e[l].l + 1) * e[c].setv;
23 e[r].sum = (e[r].r - e[r].l + 1) * e[c].setv;
24 e[c].setv = 0;
25 }
26 if(e[c].addv){
27 e[l].addv += e[c].addv; e[r].addv += e[c].addv;
28 e[l].maxv += e[c].addv; e[r].maxv += e[c].addv;
29 e[l].minv += e[c].addv; e[r].minv += e[c].addv;
30 e[l].sum += (e[l].r - e[l].l + 1) * e[c].addv;
31 e[r].sum += (e[r].r - e[r].l + 1) * e[c].addv;
32 e[c].addv = 0;
33 }
34
35 }
36 void add(int a, int b, int c, int val){
37 if(e[c].l == a && e[c].r == b){
38 e[c].addv += val;
39 e[c].maxv += val;
40 e[c].minv += val;
41 e[c].sum += (b-a+1)*val;
42 return;
43 }
44 int mid = (e[c].l + e[c].r) / 2;
45 pushdown(c);
46 if(b <= mid) add(a, b, 2*c, val);
47 else if(a > mid) add(a, b, 2*c+1, val);
48 else{
49 add(a, mid, 2*c, val);
50 add(mid+1, b, 2*c+1, val);
51 }
52 e[c].maxv = max(e[c*2].maxv, e[c*2+1].maxv);
53 e[c].minv = min(e[c*2].minv, e[c*2+1].minv);
54 e[c].sum = e[2*c].sum + e[2*c+1].sum;
55
56 }
57 void update(int a, int b, int c, int val){
58 if(e[c].l == a && e[c].r == b){
59 e[c].addv = 0;
60 e[c].setv = val;
61 e[c].maxv = val;
62 e[c].minv = val;
63 e[c].sum = (b-a+1)*val;
64 return;
65 }
66 pushdown(c);
67 int mid = (e[c].l + e[c].r) / 2;
68 if(b <= mid) update(a, b, 2*c, val);
69 else if(a > mid) update(a, b, 2*c+1, val);
70 else{
71 update(a, mid, 2*c, val);
72 update(mid+1, b, 2*c+1, val);
73 }
74 e[c].maxv = max(e[c*2].maxv, e[c*2+1].maxv);
75 e[c].minv = min(e[c*2].minv, e[c*2+1].minv);
76 e[c].sum = e[2*c].sum + e[2*c+1].sum;
77 }
78 node query(int a, int b, int c){
79 if(e[c].l == a && e[c].r == b) return e[c];
80 pushdown(c);
81 int mid = (e[c].l + e[c].r) / 2;
82 if(b <= mid) return query(a, b, 2*c);
83 else if(a > mid) return query(a, b, 2*c+1);
84 else{
85 node o, p, q;
86 p = query(a, mid, 2*c);
87 q = query(mid + 1, b, 2*c+1);
88 o.sum = p.sum + q.sum;
89 o.maxv = max(p.maxv, q.maxv);
90 o.minv = min(p.minv, q.minv);
91 return o;
92 }
93
94 }
95 int main()
96 {
97 ios::sync_with_stdio(false);
98 int r, c, m;
99 while(cin >> r >> c >> m){
100 int i, j, k ,a, x1, y1, x2, y2, val;
101 bulid(1, r * c, 1);
102 for(i = 0; i < m; i++){
103 cin >> a;
104 if(a==1){
105 cin >> x1 >> y1 >> x2 >> y2 >> val;
106 for(j = x1; j <= x2; j++)
107 add((j-1)*c+y1, (j-1)*c+y2, 1, val);
108 } else if(a==2){
109 cin >> x1 >> y1 >> x2 >> y2 >> val;
110 for(j = x1; j <= x2; j++)
111 update((j-1)*c+y1, (j-1)*c+y2, 1, val);
112 }else{
113 node ans, p;
114 cin >> x1 >> y1 >> x2 >> y2;
115 for(j = x1; j <= x2; j++){
116 if(j==x1) ans = query((j-1)*c+y1, (j-1)*c+y2, 1);
117 else{
118 p = query((j-1)*c+y1, (j-1)*c+y2, 1);
119 ans.sum += p.sum;
120 ans.maxv = max(ans.maxv, p.maxv);
121 ans.minv = min(ans.minv, p.minv);
122 }
123
124 }
125 cout << ans.sum << " " << ans.minv << " " << ans.maxv << endl;
126
127 }
128
129
130 }
131 }
132 }