Submission #1166339

#TimeUsernameProblemLanguageResultExecution timeMemory
1166339m5588ohammedDivide and conquer (IZhO14_divide)C++20
100 / 100
128 ms29556 KiB
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define mod 1000000007
#define int long long
const int N=(1<<18);
int Tree[N*2+1];
int pre[200001];
int x[200001],g[200001],e[200001],n;
map <int,int> key;
set <int> st;
void update(int i,int idx){
    i+=N;
    Tree[i]=min(Tree[i],idx);
    i/=2;
    while(i!=0){
        Tree[i]=min(Tree[i*2],Tree[i*2+1]);
        i/=2;
    }
    return;
}
int solve(int l1,int r1,int i,int l,int r){
    if(l1>r||l>r1) return 1e15;
    if(l<=l1&&r1<=r) return Tree[i];
    return min(solve(l1,(l1+r1)/2,i*2,l,r),solve((l1+r1)/2+1,r1,i*2+1,l,r));
}
void comp(){
    int k=0;
    for(int j:st){
        key[j]=k++;
    }
    return;
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    for(int i=0;i<N*2+1;i++) Tree[i]=1e15;
    cin>>n;
    int sum=0,ans=0;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>g[i]>>e[i];
        st.insert(sum-x[i]);
        sum+=e[i];
        st.insert(sum-x[i]);
    }
    comp();
    sum=0;
    for(int i=1;i<=n;i++){
        pre[i]=pre[i-1]+g[i];
        update(key[sum-x[i]],i);
        int idx=solve(0,N-1,1,0,key[sum+e[i]-x[i]]);
        //cout<<sum-x[i]<<endl;
        ans=max(ans,pre[i]-pre[idx-1]);
        sum+=e[i];
    }
    cout<<ans<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...