#include<cstdio>
using namespace std;
const int MaxN=1002;
struct SegmentTree{
struct node{
int l,r,lch,rch;
int cover,val;
}t[MaxN<<1];
int tot;
void create(int L,int R)
{
int p=tot++;
lt[p].l=L;lt[p].r=R;
lt[p].covere=lt[p].val=0;
if (L+1==R){
lt[p].lch=lt[p].rch=-1;
return;
}
lt[p].lch=tot;create(L,(L+R)>>1);
lt[p].rch=tot;create((L+R)>>1,R);
}
inline void setit(int N){
tot=0;
create(0,N);
}
int get(int p,int L,int R){
if (L<=lt[p].l&<[p].r<=R)
return lt[p].val;
int ret=lt[p].cover,m=(lt[p].l+lt[p].r)>>1;
int tmp;
if (L<m)
{
tmp=get(lt[p].lch,L,R);
if (tmp>ret) ret=tmp;
}
if (R>m){
tmp=get(lt[p].rch,L,R);
if (tmp>ret) ret=tmp;
return ret;
}
int query(int L,int R){
return get(0,L,R);
}
void add(int p,int L,int R,int h){
if (h>lt[p].val) lt[p].val=h;
if (L<=lt[p].l&<[p].r<=R){
if (h>lt[p].cover)
lt[p].cover=h;
return;
}
int m=(lt[p].l+lt[p].r)>>1;
if (L<m) add(lt[p].lch,L,R,h);
if (R>m) add(lt[p].rch,L,R,h);
}
void cover(int L,int R,int H){
add(0,L,R);
}
};
struct SegmentTree2D
{
struct node{
int l,r,lch,rch;
SegmentTree cover,val;
}lt[MaxN<<1];
int tot;
void create(int L,int R,int M){
int p=tot++;
lt[p].l=L;lt[p].r=R;
lt[p].cover.setit(M);
lt[p].val.setit(M);
if (L+1==R)
{
lt[p].lch=lt[p].rch=-1;
return;
}
lt[p].lch=tot;create(L,(L+R)>>1,M);
lt[p].rch=tot;create((L+R)>>1,R,M);
}
inline void setit(int N,int M){
tot=0;
create(0,N,M);
}
int get(int p,int x1,int x2,int y1,int y2)
{
if (x1<=lt[p].l&<[p].r<=x2)
return lt[p].val,query(y1,y2);
int ret=lt[p].cover.query(y1,y2),mm=(lt[p].l,lt[p].r)>>1;
int tmp;
if (x1<m){
tmp=get(lt[p].lch,x1,x2,y1,y2);
if (tmp>ret) ret=tmp;
}
if (x2>mm){
tmp=get(lt[p].rch,x1,x2,y1,y2);
if (tmp>ret) ret=tmp;
}
return ret;
}
int query(int x1,int x2,int y1,int y2){
return get(0,x1,x2,y1,y2);
}
void add(int p,int x1,int x2,int y1,int y2,int h){
lt[p].val.cover(y1,y2,h);
if (x1<=lt[p].l&<[p].r<=x2){
lt[p].cover.cover(y1,y2,h);
return;
}
int m=(lt[p].l+lt[p].r)>>1;
if (x1<m)
add(lt[p].lch,x1,x2,y1,y2);
if (x2>m)
add(lt[p].rch,x1,x2,y1,y2);
}
void cover(int x1,int x2,int y1,int y2,int H){
add(0,x1,x2,y1,y2,H);
}
}T;
int N,M,Q;
int main(){
scanf("%d%d%d",&N,&M,&Q);
T.setit(N,M);
int x1,x2,y1,y2,d,s,w,h;
while (Q--)
{
scanf("%d %d %d %d",&d,&s,&w,&x1,&y1);
x2=d+x1;
y2=s+s1;
h=T.query(x1,x2,y1,y2);
T.cover(x1,x2,y1,y2,h+w);
}
printf("%d\n",T.query(0,N,0,M));
}
};
3D方块
最新推荐文章于 2021-02-03 06:41:49 发布