1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include<bits/stdc++.h> #define maxn 1005 #define ll long long #define put() putchar('\n') using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } int n,m,k; struct sy{ int f[maxn<<2],lazy[maxn<<2]; inline void Pushup(int rt) {f[rt]=max(f[rt<<1],f[rt<<1|1]);} inline void Update(int l,int r,int rt,int head,int tail,int k) { f[rt]=max(f[rt],k); if (head<=l&&r<=tail) return lazy[rt]=max(lazy[rt],k),void(); int mid=l+r>>1; if (head<=mid) Update(l,mid,rt<<1,head,tail,k); if (tail>mid) Update(mid+1,r,rt<<1|1,head,tail,k); } inline int Query(int l,int r,int rt,int head,int tail) { if (head<=l&&r<=tail) return f[rt]; int mid=l+r>>1,tmp1=0,tmp2=0,tmp3=lazy[rt]; if (head<=mid) tmp1=Query(l,mid,rt<<1,head,tail); if (tail>mid) tmp2=Query(mid+1,r,rt<<1|1,head,tail); return max(tmp1,max(tmp2,tmp3)); } }; struct sx{ sy f[maxn<<2],lazy[maxn<<2]; inline void Update(int l,int r,int rt,int head,int tail,int heady,int taily,int k) { f[rt].Update(1,m,1,heady,taily,k); if (head<=l&&r<=tail) return lazy[rt].Update(1,m,1,heady,taily,k),void(); int mid=l+r>>1; if (head<=mid) Update(l,mid,rt<<1,head,tail,heady,taily,k); if (tail>mid) Update(mid+1,r,rt<<1|1,head,tail,heady,taily,k); } inline int Query(int l,int r,int rt,int head,int tail,int heady,int taily) { if (head<=l&&r<=tail) return f[rt].Query(1,m,1,heady,taily); int mid=l+r>>1,tmp1=0,tmp2=0,tmp3=lazy[rt].Query(1,m,1,heady,taily); if (head<=mid) tmp1=Query(l,mid,rt<<1,head,tail,heady,taily); if (tail>mid) tmp2=Query(mid+1,r,rt<<1|1,head,tail,heady,taily); return max(tmp1,max(tmp2,tmp3)); } }t; signed main(void){ int a,b,c,d,e,i,tmp; read(n);read(m);read(k);n++;m++; while (k--) { read(a);read(b);read(c);read(d);read(e);++d;++e; tmp=t.Query(1,n,1,d,a+d-1,e,b+e-1)+c; t.Update(1,n,1,d,a+d-1,e,b+e-1,tmp); } printf("%d\n",t.Query(1,n,1,1,n,1,m)); return 0; }
|