delete pics to save space
This commit is contained in:
147
2.11992.cpp
Normal file
147
2.11992.cpp
Normal file
@ -0,0 +1,147 @@
|
||||
#include<bits/stdc++.h>
|
||||
using namespace std;
|
||||
#define lrt rt<<1
|
||||
#define rrt rt<<1|1
|
||||
typedef struct Node
|
||||
{
|
||||
int lo, hi, sum;
|
||||
int add, put;
|
||||
}Node;
|
||||
const int maxn = 22;
|
||||
const int maxm = 200200;
|
||||
Node seg[maxn][maxm<<2];
|
||||
int n, m, q;
|
||||
|
||||
void pushup(Node* seg, int rt)
|
||||
{
|
||||
seg[rt].sum = seg[lrt].sum + seg[rrt].sum;
|
||||
seg[rt].lo = min(seg[lrt].lo, seg[rrt].lo);
|
||||
seg[rt].hi = max(seg[lrt].hi, seg[rrt].hi);
|
||||
}
|
||||
|
||||
void pushdown(Node* seg, int rt, int l, int r)
|
||||
{
|
||||
int mid = (l + r) >> 1;
|
||||
if(seg[rt].put != -1)
|
||||
{
|
||||
seg[lrt].sum = (mid - l + 1) * seg[rt].put;
|
||||
seg[rrt].sum = (r - mid) * seg[rt].put;
|
||||
seg[lrt].lo = seg[lrt].hi = seg[rt].put;
|
||||
seg[rrt].lo = seg[rrt].hi = seg[rt].put;
|
||||
seg[lrt].put = seg[rrt].put = seg[rt].put;
|
||||
seg[lrt].add = seg[rrt].add = 0;
|
||||
seg[rt].put = -1;
|
||||
}
|
||||
if(seg[rt].add)
|
||||
{
|
||||
seg[lrt].sum += (mid - l + 1) * seg[rt].add;
|
||||
seg[rrt].sum += (r - mid) * seg[rt].add;
|
||||
seg[lrt].lo += seg[rt].add;
|
||||
seg[lrt].hi += seg[rt].add;
|
||||
seg[rrt].lo += seg[rt].add;
|
||||
seg[rrt].hi += seg[rt].add;
|
||||
seg[lrt].add += seg[rt].add;
|
||||
seg[rrt].add += seg[rt].add;
|
||||
seg[rt].add = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void build(Node* seg, int l, int r, int rt)
|
||||
{
|
||||
seg[rt].lo = seg[rt].hi = seg[rt].sum = seg[rt].add = 0;
|
||||
seg[rt].put = -1;
|
||||
if(l == r) return;
|
||||
int mid = (l + r) >> 1;
|
||||
build(seg, l, mid, lrt);
|
||||
build(seg, mid+1, r, rrt);
|
||||
}
|
||||
|
||||
void update(Node* seg, int L, int R, int l, int r, int rt, int val, int type)
|
||||
{
|
||||
if(L <= l && r <= R)
|
||||
{
|
||||
if(type == 1)
|
||||
{
|
||||
seg[rt].lo += val;
|
||||
seg[rt].hi += val;
|
||||
seg[rt].add += val;
|
||||
seg[rt].sum += (r - l + 1) * val;
|
||||
}
|
||||
else if(type == 2)
|
||||
{
|
||||
seg[rt].lo = val;
|
||||
seg[rt].hi = val;
|
||||
seg[rt].put = val;
|
||||
seg[rt].sum = (r - l + 1) * val;
|
||||
seg[rt].add = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
pushdown(seg, rt, l, r);
|
||||
int mid = (l + r) >> 1;
|
||||
if(L <= mid) update(seg, L, R, l, mid, lrt, val, type);
|
||||
if(mid < R) update(seg, L, R, mid+1, r, rrt, val, type);
|
||||
pushup(seg, rt);
|
||||
}
|
||||
|
||||
Node query(Node* seg, int L, int R, int l, int r, int rt)
|
||||
{
|
||||
if(L <= l && r <= R) return seg[rt];
|
||||
pushdown(seg, rt, l, r);
|
||||
int mid = (l + r) >> 1;
|
||||
Node ret;
|
||||
ret.lo = 0x7f7f7f7f, ret.hi = 0, ret.sum = 0;
|
||||
if(L <= mid)
|
||||
{
|
||||
Node tmp = query(seg, L, R, l, mid, lrt);
|
||||
ret.lo = min(ret.lo, tmp.lo);
|
||||
ret.hi = max(ret.hi, tmp.hi);
|
||||
ret.sum += tmp.sum;
|
||||
}
|
||||
if(mid < R)
|
||||
{
|
||||
Node tmp = query(seg, L, R, mid+1, r, rrt);
|
||||
ret.lo = min(ret.lo, tmp.lo);
|
||||
ret.hi = max(ret.hi, tmp.hi);
|
||||
ret.sum += tmp.sum;
|
||||
}
|
||||
pushup(seg, rt);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifdef local
|
||||
freopen("pro.in","r",stdin);
|
||||
#endif
|
||||
int type, x1, y1, x2, y2, val;
|
||||
while(scanf("%d%d%d",&n,&m,&q)==3)
|
||||
{
|
||||
for(int i = 1; i <= n; i++)
|
||||
build(seg[i], 1, m, 1);
|
||||
while(q--)
|
||||
{
|
||||
scanf("%d%d%d%d%d",&type,&x1,&y1,&x2,&y2);
|
||||
if(type == 3)
|
||||
{
|
||||
Node ret, tmp;
|
||||
ret.lo = 0x7f7f7f7f, ret.hi = 0, ret.sum = 0;
|
||||
for(int i = x1; i <= x2; i++)
|
||||
{
|
||||
tmp = query(seg[i], y1, y2, 1, m, 1);
|
||||
ret.lo = min(ret.lo, tmp.lo);
|
||||
ret.hi = max(ret.hi, tmp.hi);
|
||||
ret.sum += tmp.sum;
|
||||
}
|
||||
printf("%d %d %d\n", ret.sum, ret.lo, ret.hi);
|
||||
}
|
||||
else
|
||||
{
|
||||
scanf("%d", &val);
|
||||
for(int i = x1; i <= x2; i++)
|
||||
update(seg[i], y1, y2, 1, m, 1, val, type);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user