线段树区间修改模板
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1000005 << 2;
int sum[maxn], maxv[maxn], minv[maxn], setv[maxn], addv[maxn];
int ansmin, ansmax, row, col;
void PushUp(int u) {
int L = u * 2, R = u * 2 + 1;
sum[u] = sum[L] + sum[R];
minv[u] = min(minv[L] , minv[R]);
maxv[u] = max(maxv[L] , maxv[R]);
}
void PushDown(int u, int len) {
int L = u * 2, R = u * 2 + 1;
if(setv[u] >= 0) {
addv[L] = addv[R] = 0;
minv[L] = maxv[L] = maxv[R] = minv[R] = setv[u];
sum[L] = (len - len / 2) * setv[u];
sum[R] = (len / 2) * setv[u];
setv[L] = setv[R] = setv[u];
setv[u] = -1;
}
if(addv[u]) {
sum[L] += (len - len / 2) * addv[u];
sum[R] += (len / 2) * addv[u];
minv[L] += addv[u];
maxv[L] += addv[u];
minv[R] += addv[u];
maxv[R] += addv[u];
addv[L] += addv[u];
addv[R] += addv[u];
addv[u] = 0;
}
}
void build(int u, int L, int R) {
if(L == R) {
sum[u] = minv[u] = maxv[u] = 0;
return ;
}
int mid = (L + R) / 2;
build(u * 2,L,mid);
build(u * 2 + 1,mid+1,R);
PushUp(u);
}
void set_val(int L, int R, int v, int u, int l, int r) {
if(L <= l && R >= r) {
addv[u] = 0;
minv[u] = maxv[u] = v;
sum[u] = (r - l + 1) * v;
setv[u] = v;
return ;
}
int mid = (l + r) / 2;
PushDown(u,r-l+1);
if(L <= mid)
set_val(L,R,v,u*2,l,mid);
if(R > mid)
set_val(L,R,v,u*2+1,mid+1,r);
PushUp(u);
}
void update(int L, int R, int add, int u, int l, int r) {
if(L <= l && R >= r) {
addv[u] += add;
sum[u] += (r - l + 1) * add;
maxv[u] += add;
minv[u] += add;
return ;
}
PushDown(u,r-l+1);
int mid = (l + r) / 2;
if(L <= mid)
update(L,R,add,u * 2,l,mid);
if(R > mid)
update(L,R,add,u * 2 + 1, mid+1,r);
PushUp(u);
}
int query(int L, int R, int u, int l, int r) {
if(L <= l && R >= r) {
ansmin = min(ansmin,minv[u]);
ansmax = max(ansmax,maxv[u]);
return sum[u];
}
PushDown(u,r-l+1);
int mid = (l + r) / 2;
int ans = 0;
if(L <= mid)
ans += query(L,R,u*2,l,mid);
if(R > mid)
ans += query(L,R,u*2 + 1,mid+1,r);
// PushUp(u);
return ans;
}
int main() {
int m, x1, x2, y1, y2, v, n;
while(scanf("%d%d%d",&row, &col, &m) == 3) {
memset(setv,-1,sizeof(setv));
memset(addv,0,sizeof(addv));
build(1,1,row*col);
while(m--) {
scanf("%d", &n);
if(n == 1) {
scanf("%d%d%d%d%d",&x1, &y1, &x2, &y2, &v);
for(int i = x1; i <= x2; i++)
update((i-1)*col+y1,(i-1)*col+y2,v,1,1,row*col);
}
if(n == 2){
scanf("%d%d%d%d%d",&x1, &y1, &x2, &y2, &v);
for(int i = x1; i <= x2; i++)
set_val((i-1)*col+y1,(i-1)*col+y2,v,1,1,row*col);
}
if(n == 3) {
scanf("%d%d%d%d",&x1,&y1, &x2, &y2);
int ans = 0;
ansmax = -INF, ansmin = INF;
for(int i = x1; i <= x2; i++)
ans += query((i-1)*col+y1,(i-1)*col+y2,1,1,row*col);
printf("%d %d %d\n", ans, ansmin, ansmax);
}
}
}
return 0;
}