#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,(rt<<1|1)
#define INF 1000000100
const int maxn = 1000010;
int sum[21][maxn<<2],MIN[21][maxn<<2],MAX[21][maxn<<2],add[21][maxn<<2],val[21][maxn<<2];
void pushUP(int rt,int i){
sum[i][rt]=sum[i][rt<<1]+sum[i][rt<<1|1];
MAX[i][rt]=max(MAX[i][rt<<1],MAX[i][rt<<1|1]);
MIN[i][rt]=min(MIN[i][rt<<1],MIN[i][rt<<1|1]);
}
void pushDOWN(int l,int r,int rt,int m,int i){
if(l==r) {
add[i][rt]=0; val[i][rt]=-1;
return ;
}
if(val[i][rt]>=0){
add[i][rt<<1]=add[i][rt<<1|1]=0;
val[i][rt<<1]=val[i][rt<<1|1]=val[i][rt];
sum[i][rt<<1]=(m-(m>>1))*val[i][rt];
sum[i][rt<<1|1]=(m>>1)*val[i][rt];
MAX[i][rt<<1]=val[i][rt];
MIN[i][rt<<1]=val[i][rt];
MAX[i][rt<<1|1]=val[i][rt];
MIN[i][rt<<1|1]=val[i][rt];
val[i][rt]=-1;
}
if(add[i][rt]){
add[i][rt<<1]+=add[i][rt];
add[i][rt<<1|1]+=add[i][rt];
sum[i][rt<<1]+=(m-(m>>1))*add[i][rt];
sum[i][rt<<1|1]+=(m>>1)*add[i][rt];
MAX[i][rt<<1]+=add[i][rt];
MIN[i][rt<<1]+=add[i][rt];
MAX[i][rt<<1|1]+=add[i][rt];
MIN[i][rt<<1|1]+=add[i][rt];
add[i][rt]=0;
}
}
void build(int l,int r,int rt,int i){
add[i][rt]=0;
val[i][rt]=-1;
if(l==r){
MAX[i][rt]=MIN[i][rt]=sum[i][rt]=0;
return ;
}
int m=(l+r)>>1;
build(lson,i);
build(rson,i);
pushUP(rt,i);
}
bool flag;
int ql,qr,addv,value;
void update(int l,int r,int rt,int i ){
if(ql<=l&&r<=qr){
if(flag){ add[i][rt]+=addv;
sum[i][rt]+=addv*(r-l+1);
MIN[i][rt]+=addv;
MAX[i][rt]+=addv;
}
else {
add[i][rt]=0; val[i][rt]=value;
sum[i][rt]=value*(r-l+1);
MIN[i][rt]=value;
MAX[i][rt]=value;
}
return ;
}
pushDOWN(l,r,rt,r-l+1,i);
int m=(l+r)>>1;
if(ql<=m) update(lson,i);
if(qr >m) update(rson,i);
pushUP(rt,i);
}
int sum_,min_,max_;
void query(int l,int r,int rt,int i ){
if(ql<=l&&r<=qr){
sum_+=sum[i][rt];
min_=min(min_,MIN[i][rt]);
max_=max(max_,MAX[i][rt]);
return ;
}
pushDOWN(l,r,rt,r-l+1,i);
int m=(l+r)>>1;
if(ql<=m) query(lson,i);
if(qr >m) query(rson,i);
}
int r,c,Q;
int read(){
for(int i=1;i<=r;i++) build(1,c,1,i);
}
int main()
{
while(scanf("%d %d %d",&r,&c,&Q)!=EOF){
read();
while(Q--){
int cmd;
int x1,x2,y1,y2;
scanf("%d %d %d %d %d",&cmd,&x1,&y1,&x2,&y2);
if(cmd==1){
scanf("%d",&addv); flag=true;
ql=y1; qr=y2;
for(int i=x1;i<=x2;i++)
update(1,c,1,i);
}
else if(cmd==2){
scanf("%d",&value);
ql=y1; qr=y2; flag=false;
for(int i=x1;i<=x2;i++)
update(1,c,1,i);
}
else {
sum_=0; min_=INF; max_=-INF;
ql=y1; qr=y2;
for(int i=x1;i<=x2;i++)
query(1,c,1,i);
printf("%d %d %d\n",sum_,min_,max_);
}
}
}
return 0;
}
uva - 11992 (下推法改进版: 1.246 秒)
最新推荐文章于 2020-09-08 23:41:09 发布