Submission #952420

#TimeUsernameProblemLanguageResultExecution timeMemory
952420Mohamed_Kachef06Fuel Station (NOI20_fuelstation)C++17
13 / 100
476 ms52144 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lc 2*p
#define rc 2*p+1
struct SegmentTree{
    vector<int> seg , lazy;
    int m;
    void init(int n){
        m = 1<<(__lg(n-1)+1);
        seg.resize(2*m); lazy.resize(2*m);
    }
    void propagate(int s,  int e , int p){
        if (s == e) return ;
        lazy[2*p]+=lazy[p];
        lazy[2*p+1] += lazy[p];
        seg[2*p] += lazy[p];
        seg[rc] += lazy[p]; 
        lazy[p] = 0;
    }
    void update(int l , int r , int val , int s , int e , int p){
        propagate(s , e , p);
        if (l > e || r < s) return ;
        else if (l <= s && r >= e){
            seg[p]+=val;
            lazy[p] += val; 
            return; 
        }
        update(l , r , val , s , (s+e)/2, 2*p); update(l, r , val , (s+e)/2+1 , e , 2*p+1);
        seg[p] = min(seg[lc] , seg[rc]);
    }
    int get(int l , int r , int s , int e , int p){
        propagate(s , e , p);
        if (l > e || r < s) return 1e18;
        else if (l <= s && r >= e) return seg[p]; 
        return min(get(l , r , s , (s+e)/2 , lc) , get(l , r , (s+e)/2 + 1 , e , 2*p+1));  
    }
    void update(int l , int r , int val){
        update(l , r , val ,1 , m ,1);
    }
    int get(int l , int r){
        return get(l , r ,1 , m , 1);
    }
};

SegmentTree st;

void doWork(){
    int N , D;
    cin >> N >> D;
    vector<array<int , 3>> v;
    vector<array<int , 3>> u;
    st.init(N+1); 
    for (int i = 0 ; i < N ; i++){
        int x , a , b;
        cin >> x >> a >> b;
        v.push_back({x , a , b});
       
    }
    v.push_back({D , 0 , 0});
    sort(v.begin() , v.end()); 
    for (int i = 0 ; i <= N ; i++) {
         u.push_back({v[i][2] , v[i][1] , i+1});
        st.update(i+1 , i+1 , -v[i][0]); 
    }
     u.push_back({(int)1e10 , 0 , N});
         sort(u.begin() , u.end()); 

    int ans = 1e18;
    int id = 0 ;
   // for (int j = 1 ; j <= N+1 ; j++) cout << st.get(j , j) << ' ';
    cout << '\n';
    for (int i = 0 ; i <= N ; i++){
        while(id <= N && u[id][0] <= u[i][0]) {
            st.update(u[id][2]+1 , N+1 , u[id][1]); 
            id++;
        }
      //  for (int j = 1 ; j <= N+1 ; j++) cout << st.get(j , j) << ' ';
        //cout << '\n';
        int x = st.get(1 , N+1); 
        if (-x <= u[i][0]) ans = min(ans , -x); 
    }     
    cout << ans;  
}


signed main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    doWork(); cout << '\n'; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...