Submission #891625

#TimeUsernameProblemLanguageResultExecution timeMemory
891625LucaIlieFood Court (JOI21_foodcourt)C++17
100 / 100
393 ms51444 KiB
#include <bits/stdc++.h> using namespace std; struct update { int c, k; }; const int MAX_N = 3e5; const int MAX_Q = 3e5; int ans[MAX_Q + 1]; update updates[MAX_Q + 2]; long long queries[MAX_Q + 1]; vector<int> updatesByPos[MAX_N + 1], queriesByPos[MAX_N + 1]; struct SegTree { struct info { long long tot, sum, minn; info operator+( info &x ) { info ans; ans.tot = tot + x.tot; ans.minn = min( minn, sum + x.minn ); ans.sum = sum + x.sum; return ans; } }; info lazy[4 * MAX_N]; void propag( int v, int l, int r ) { if ( l != r ) { lazy[v * 2 + 1] = lazy[v * 2 + 1] + lazy[v]; lazy[v * 2 + 2] = lazy[v * 2 + 2] + lazy[v]; lazy[v] = { 0, 0 }; } } void update( int v, int l, int r, int lu, int ru, int k ) { propag( v, l, r ); if ( l > ru || r < lu ) return; if ( lu <= l && r <= ru ) { info add = { max( k, 0 ), k, min( k, 0 ) }; lazy[v] = lazy[v] + add; propag( v, l, r ); return; } int mid = (l + r) / 2; update( v * 2 + 1, l, mid, lu, ru, k ); update( v * 2 + 2, mid + 1, r, lu, ru, k ); } long long query( int v, int l, int r, int p ) { propag( v, l, r ); if ( l == r ) return lazy[v].tot - (lazy[v].sum - lazy[v].minn); int mid = (l + r) / 2; if ( p <= mid ) return query( v * 2 + 1, l, mid, p ); return query( v * 2 + 2, mid + 1, r, p ); } } qs; struct AIB { long long aib[MAX_Q + 1]; void update( int i, int x ) { while ( i <= MAX_Q ) { aib[i] += x; i += (i & -i); } } int firstHigherOrEqual( long long x ) { int pos = 0; for ( int p = log2( MAX_Q ); p >= 0; p-- ) { if ( pos + (1 << p) <= MAX_Q && x - aib[pos + (1 << p)] > 0 ) { pos += (1 << p); x -= aib[pos]; } } return pos + 1; } } us; signed main() { ios_base::sync_with_stdio( false ); cin.tie( NULL ); cout.tie( NULL ); int n, m, q; cin >> n >> m >> q; for ( int t = 1; t <= q; t++ ) { int type; cin >> type; if ( type == 1 ) { int l, r, c, k; cin >> l >> r >> c >> k; qs.update( 0, 1, n, l, r, k ); updates[t] = { c, k }; updatesByPos[l].push_back( t ); updatesByPos[r + 1].push_back( -t ); } else if ( type == 2 ) { int l, r, k; cin >> l >> r >> k; qs.update( 0, 1, n, l, r, -k ); } else { int p; long long x; cin >> p >> x; x += qs.query( 0, 1, n, p ); queries[t] = x; queriesByPos[p].push_back( t ); } } for ( int t = 1; t <= q; t++ ) ans[t] = -1; for ( int i = 1; i <= n; i++ ) { for ( int t: updatesByPos[i] ) { if ( t > 0 ) us.update( t, updates[t].k ); else us.update( -t, -updates[-t].k ); } for ( int t: queriesByPos[i] ) { int j = us.firstHigherOrEqual( queries[t] ); ans[t] = (j > t ? 0 :updates[j].c ); } } for ( int t = 1; t <= q; t++ ) { if ( ans[t] != -1 ) cout << ans[t] << "\n"; } return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...