This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define eb emplace_back
#define mp make_pair
#define F first
#define S second
#define svec(x) sort(x.begin(), x.end())
using namespace std;
typedef long long LL;
typedef pair<int, LL> pil;
const LL llinf=2000000000000000000;
struct LAZY_SEGMENT_TREE{
struct NODE{
LL l1, l2, mx;
NODE(){l2=-llinf;}
}tree[4000010];
void propogate(int point, int s, int e){
tree[point].mx=max(tree[point].mx+tree[point].l1, tree[point].l2);
if(s!=e){
tree[point*2].l1+=tree[point].l1;
tree[point*2+1].l1+=tree[point].l1;
tree[point*2].l2+=tree[point].l1;
tree[point*2+1].l2+=tree[point].l1;
tree[point*2].l2=max(tree[point*2].l2, tree[point].l2);
tree[point*2+1].l2=max(tree[point*2+1].l2, tree[point].l2);
}
tree[point].l1=0;
tree[point].l2=-llinf;
}
LL query(int point, int s, int e, int a){
propogate(point, s, e);
if(s==e)return tree[point].mx;
if(a<=(s+e)/2)return query(point*2, s, (s+e)/2, a);
return query(point*2+1, (s+e)/2+1, e, a);
}
void alter(int point, int s, int e, int a, int b, LL val){
propogate(point, s, e);
if(e<a||s>b)return;
if(a<=s&&e<=b){
tree[point].l1+=val;
tree[point].l2+=val;
//propogate(point, s, e);
return;
}
alter(point*2, s, (s+e)/2, a, b, val);
alter(point*2+1, (s+e)/2+1, e, a, b, val);
}
void update(int point, int s, int e, int a, int b, LL val){
propogate(point, s, e);
if(e<a||s>b)return;
if(a<=s&&e<=b){
tree[point].l2=max(tree[point].l2, val);
//propogate(point, s, e);
return;
}
update(point*2, s, (s+e)/2, a, b, val);
update(point*2+1, (s+e)/2+1, e, a, b, val);
}
}seg;
int n, m;
LL suma[1000010], sumb[1000010];
LL lima[1000010], limb[1000010];
LL sca[1000010], scb[1000010], ans;
vector<pil> qu[1000010];
int main(){
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++){
scanf("%lld %lld %lld", &suma[i], &lima[i], &sca[i]);
suma[i]+=suma[i-1];
}
for(int i=1; i<=m; i++){
scanf("%lld %lld %lld", &sumb[i], &limb[i], &scb[i]);
sumb[i]+=sumb[i-1];
}
for(int i=1; i<=n; i++){
int tmp=upper_bound(sumb, sumb+m+1, lima[i]-suma[i])-sumb-1;
if(tmp>=0)qu[i].eb(tmp, sca[i]);
}
for(int i=1; i<=m; i++){
int tmp=upper_bound(suma, suma+n+1, limb[i]-sumb[i])-suma-1;
if(tmp>=0){
qu[tmp+1].eb(i-1, -scb[i]);
ans+=scb[i];
}
}
qu[n+1].eb(m-1, -llinf);
for(int i=1; i<=n+1; i++){
svec(qu[i]);
for(auto j:qu[i])seg.alter(1, 0, m, 0, j.F, j.S);
for(auto j:qu[i]){
LL tmp=seg.query(1, 0, m, j.F);
seg.update(1, 0, m, j.F+1, m, tmp);
}
}
printf("%lld", ans+seg.query(1, 0, m, m));
}
Compilation message (stderr)
dishes.cpp: In function 'int main()':
dishes.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &n, &m);
~~~~~^~~~~~~~~~~~~~~~~
dishes.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld %lld %lld", &suma[i], &lima[i], &sca[i]);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dishes.cpp:74:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld %lld %lld", &sumb[i], &limb[i], &scb[i]);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |