Submission #605153

#TimeUsernameProblemLanguageResultExecution timeMemory
605153MohamedAhmed04Team Contest (JOI22_team)C++14
0 / 100
1 ms340 KiB
#include <bits/stdc++.h> using namespace std ; const int MAX = 2e5 + 10 ; int arr[MAX][3] ; int n ; int tree[4 * MAX] , lazy[4 * MAX] ; void prop(int node , int l , int r) { tree[node] += lazy[node] ; if(l != r) { lazy[node << 1] += lazy[node] ; lazy[node << 1 | 1] += lazy[node] ; } lazy[node] = 0 ; } void Add(int node , int l , int r , int from , int to , int val) { prop(node , l , r) ; if(from > r || to < l) return ; if(l >= from && r <= to) { lazy[node] += val ; prop(node , l , r) ; return ; } int mid = (l + r) >> 1 ; Add(node << 1 , l , mid , from , to , val) ; Add(node << 1 | 1 , mid+1 , r , from , to , val) ; tree[node] = max(tree[node << 1] , tree[node << 1 | 1]) ; } int query(int node , int l , int r , int from , int to) { prop(node , l , r) ; if(from > r || to < l) return (-1e9) ; if(l >= from && r <= to) return tree[node] ; int mid = (l + r) >> 1 ; int x = query(node << 1 , l , mid , from , to) ; int y = query(node << 1 | 1 , mid+1 , r , from , to) ; return max(x , y) ; } int tree2[4 * MAX] ; void update(int node , int l , int r , int idx , int val) { if(idx > r || idx < l) return ; if(l == r) { tree2[node] = val ; return ; } int mid = (l + r) >> 1 ; update(node << 1 , l , mid , idx , val) ; update(node << 1 | 1 , mid+1 , r , idx , val) ; tree2[node] = max(tree2[node << 1] , tree2[node << 1 | 1]) ; } int FindFirst(int node , int l , int r , int val) { if(val > tree2[node]) return (n+1) ; if(l == r) return l ; int mid = (l + r) >> 1 ; if(tree2[mid] > val) return FindFirst(node << 1 , l , mid , val) ; else return FindFirst(node << 1 | 1 , mid+1 , r , val) ; } int pos[MAX] , nxt[MAX] ; set<int>s ; vector< array<int , 3> >v ; vector< pair<int , int> >vp ; void Insert(int idx) { update(1 , 1 , n , idx , -1e9) ; s.insert(idx) ; int nxtmx = FindFirst(1 , 1 , n , v[idx][1]) ; int l = nxt[idx] , r = nxtmx-1 ; if(l <= r) Add(1 , 1 , n , l , r , v[idx][1]) ; } void Erase(int idx) { s.erase(idx) ; int nxtmx = FindFirst(1 , 1 , n , v[idx][1]) ; int l = nxt[idx] , r = nxtmx-1 ; if(l <= r) Add(1 , 1 , n , l , r , -1 * v[idx][1]) ; } void Del(int idx) { int prv = -1 ; if((*s.begin()) != idx) { prv = *prev(s.lower_bound(idx)) ; Erase(prv) ; } Erase(idx) ; update(1 , 1 , n , idx , -1e9) ; int cur = prv ; if(cur == -1) cur = FindFirst(1 , 1 , n , 0) ; while(s.find(cur) != s.end()) { Insert(cur) ; cur = FindFirst(1 , 1 , n , v[cur][1]) ; } } int main() { ios_base::sync_with_stdio(0) ; cin.tie(0) ; cin>>n ; for(int i = 1 ; i <= n ; ++i) cin>>arr[i][0]>>arr[i][1]>>arr[i][2] ; for(int i = 1 ; i <= n ; ++i) v.push_back({arr[i][1] , arr[i][2] , i}) , vp.emplace_back(arr[i][0] , i) ; v.push_back({0 , 0 , 0}) , vp.emplace_back(0 , 0) ; sort(v.begin() , v.end()) ; sort(vp.begin() , vp.end()) ; nxt[n] = n+1 ; for(int i = n-1 ; i >= 1 ; --i) { nxt[i] = nxt[i+1] ; if(v[i][0] != v[i+1][0]) nxt[i] = i+1 ; } for(int i = 1 ; i <= n ; ++i) { Add(1 , 1 , n , i , i , v[i][0]) ; update(1 , 1 , n , i , v[i][1]) ; } int Max = 0 ; for(int i = 1 ; i <= n ; ++i) { // if(query(1 , 1 , n , i , i) == v[i][0]) // Add(1 , 1 , n , i , i , -1e9) ; if(v[i][1] <= Max) continue ; Max = v[i][1] ; Insert(i) ; } int j = n , ans = -1 ; for(int i = n ; i >= 1 ; --i) { int idx = vp[i].second ; while(j >= 0 && vp[i].first == vp[j].first) Erase(j) , --j ; int l = FindFirst(1 , 1 , n , arr[idx][2]) ; l = max(l , nxt[pos[idx]]) ; if(l <= n) ans = max(ans , vp[i].first + query(1 , 1 , n , l , n)) ; } return cout<<ans<<"\n" , 0 ; }
#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...