#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
#define mid ((left+right)>>1)
const ll inf=ll(2e18)+5;
struct Seg{
int n;
vector<ll>tree,lazy;
void init(int N){
n=N;
tree.resize(n<<2,-inf);
lazy.resize(n<<2,0);
}
void push(int node,int left,int right){
if(lazy[node]==0)return;
tree[node]+=lazy[node];
if(left!=right){
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
}
lazy[node]=0;
}
int l,r;
ll x;
void up(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(left>=l&&right<=r){
lazy[node]+=x;
push(node,left,right);
return;
}
push(node,left,right);
if(left>r||right<l)return;
up(node*2,left,mid);
up(node*2+1,mid+1,right);
tree[node]=max(tree[node*2],tree[node*2+1]);
}
void update(int lef,int rig,ll val){
l=lef;r=rig;x=val;
up();
}
ll qu(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(left>r||right<l)return -inf;
push(node,left,right);
if(left>=l&&right<=r)return tree[node];
return max(qu(node*2,left,mid),qu(node*2+1,mid+1,right));
}
ll query(int lef,int rig){
l=lef;r=rig;
return qu();
}
};
int n,m;
ll ans=0;
Seg seg;
vector<ll>v;
map<ll,int>mp;
array<ll,3>arr[100023];
ll shift=0;
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL);
cin>>n;
for(int i=0;i<n;i++){
ll x,g,d;cin>>x>>g>>d;
arr[i]={x,g,d};
if(!mp[x-shift]++){
v.push_back(x-shift);
}
if(!mp[x-d-shift]++){
v.push_back(x-d-shift);
}
shift+=d;
}
m=v.size();
sort(v.begin(),v.end());
for(int i=0;i<m;i++){
mp[v[i]]=i;
}
seg.init(m);
shift=0;
for(int i=0;i<n;i++){
ll x=arr[i][0],g=arr[i][1],d=arr[i][2];
ans=max(ans,max(0ll,seg.query(mp[x-d-shift],m-1))+g);
seg.update(mp[x-shift],mp[x-shift],max(0ll,-seg.query(mp[x-shift],mp[x-shift])));
seg.update(0,m-1,g);
shift+=d;
}
cout<<ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |