Submission #892912

#TimeUsernameProblemLanguageResultExecution timeMemory
892912thunoproFood Court (JOI21_foodcourt)C++14
14 / 100
193 ms148308 KiB
#include<bits/stdc++.h> using namespace std ; #define maxn 200009 #define ll long long #define fi first #define se second #define pb push_back #define left id<<1 #define right id<<1|1 #define re exit(0); const int mod = 1e9+7 ; const int INF = 1e9 ; const int LOG = 18 ; typedef vector<int> vi ; typedef vector<ll> vl ; typedef pair<int,int> pii ; typedef vector<pii> vii ; typedef pair<ll,ll> pll ; void add ( int &a , int b ) { a += b ; if ( a < 0 ) a += mod ; if ( a >= mod ) a -= mod ; } template < typename T > void chkmin (T &a , T b) { if (a>b) a=b ;} template < typename T > void chkmax (T &a , T b) { if (a<b) a=b ;} void rf () { freopen ("bai1.inp","r",stdin) ; // freopen ("bai1.out","w",stdout) ; } int _pow ( int a , int n ) { if ( n == 0 ) return 1 ; int res = _pow(a,n/2) ; if ( n % 2 ) return (1ll*res*res%mod*a%mod) ; else return 1ll*res*res%mod ; } int n , m , nq ; struct shape { int op , l , r , c , k ; int pos ; ll b ; } q [maxn] ; deque <pll> deq [maxn] ; void sub1 () { for ( int run = 1 ; run <= nq ; run ++ ) { int op = q [run].op ; if ( op <= 2 ) { int l = q [run].l , r = q [run].r , c = q [run].c , k = q [run].k ; if ( op == 1 ) { for ( int i = l ; i <= r ; i ++ ) { if ( deq[i].empty() || deq[i].back().fi != c ) deq[i] . push_back ({c,k}) ; else deq[i].back().se += k ; } } else { for ( int i = l ; i <= r ; i ++ ) { int remain = k ; while ( deq[i].size () ) { if ( deq[i].front().se <= remain ) remain -= deq[i].front().se , deq[i].pop_front () ; else { deq[i].front().se -= remain ; break ; } } } } } else { int pos = q[run].pos ; ll b = q [run].b ; deque <pll> New = deq [pos] ; ll sum = 0 ; int res = 0 ; while ( !New.empty() ) { if ( sum + New.front().se >= b ) { res = New.front().fi ; break ; } sum += New.front().se ; New.pop_front() ; } cout << res << "\n" ; } } } bool check_sub2 () { if ( max (n,nq) > 65000 ) return false ; for ( int i = 1 ; i <= nq ; i ++ ) { if ( q[i].op == 1 ) { if ( q[i].r - q [i].l > 10 ) return false ; if ( q[i].k != 1 ) return false ; } } return true ; } const int N = 2.5 * 1e5 ; ll T[maxn*4] , lazy [maxn*4] ; void down_leave_sub2 ( int id ) { ll &t = T [id] ; T [left] += t , T [right] += t ; lazy [left] += t , lazy [right] += t ; t = 0 ; } void update_leave_sub2 ( int id , int l , int r , int u , int v , int k ) { if ( l > v || r < u ) return ; if ( u <= l && r <= v ) { T [id] += k ; lazy [id] += k ; if ( k == - 1 ) { T [id] = lazy [id] = 0 ; } return ; } int mid = (l+r)/2 ; down_leave_sub2 (id) ; update_leave_sub2 (left,l,mid,u,v,k) ; update_leave_sub2 (right,mid+1,r,u,v,k) ; } ll get_leave_sub2 ( int id , int l , int r , int pos ) { if ( l > pos || r < pos ) return 0 ; if ( l == r ) return T [id] ; down_leave_sub2 (id) ; int mid = (l+r)/2 ; return get_leave_sub2 (left,l,mid,pos) + get_leave_sub2 (right,mid+1,r,pos) ; } void leave_sub2 ( int pos ) { ll leave = get_leave_sub2 (1,1,N,pos) ; update_leave_sub2 (1,1,N,pos,pos,-1) ; while ( deq[pos].size () ) { if ( deq[pos].front().se <= leave ) leave -= deq[pos].front().se , deq[pos].pop_front() ; else { deq[pos].front().se -= leave ; break ; } } } void sub2 () { for ( int run = 1 ; run <= nq ; run ++ ) { if ( q [run].op <= 2 ) { int l = q [run].l , r = q [run].r , c = q [run].c , k = q [run].k ; if ( q[run].op == 1 ) { for ( int i = l ; i <= r ; i ++ ) { leave_sub2 (i) ; if ( deq[i].empty() || deq[i].back().fi != c ) deq[i] . push_back ({c,k}) ; else deq[i].back().se += k ; } } else { int l = q[run].l , r = q[run].r , k = q [run].k ; update_leave_sub2 (1,1,N,l,r,k) ; } } else { int pos = q[run].pos ; ll b = q [run].b ; leave_sub2 (pos) ; deque <pll> New = deq [pos] ; ll sum = 0 ; int res = 0 ; while ( !New.empty() ) { if ( sum + New.front().se >= b ) { res = New.front().fi ; break ; } sum += New.front().se ; New.pop_front() ; } cout << res << "\n" ; } } } int main () { ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0) ; // rf () ; cin >> n >> m >> nq ; for ( int i = 1 ; i <= nq ; i ++ ) { cin >> q[i].op ; if ( q[i].op == 1 ) { cin >> q[i].l >> q[i].r >> q[i].c >> q[i].k ; } else if ( q[i].op == 2 ) { cin >> q[i].l >> q[i].r >> q [i].k ; } else cin >> q[i].pos >> q[i].b ; } if ( n <= 2e3 && nq <= 2e3 ) sub1 () ; else if ( check_sub2 () ) sub2 () ; }

Compilation message (stderr)

foodcourt.cpp: In function 'void rf()':
foodcourt.cpp:34:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |  freopen ("bai1.inp","r",stdin) ;
      |  ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...