Submission #1032009

#TimeUsernameProblemLanguageResultExecution timeMemory
1032009AdamGSFood Court (JOI21_foodcourt)C++17
100 / 100
284 ms61008 KiB
#include<bits/stdc++.h> using namespace std; typedef long double ld; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const ll INF=1e18+7; const int LIM=25e4+7; struct pyt { ll t=0, l=0, r=0, a=0, b=0; }; pyt T[LIM]; vector<int>dodaj[LIM], usun[LIM], odp[LIM]; ll tr1[4*LIM], tr2[4*LIM], lazya[4*LIM], lazyb[4*LIM], wynik[LIM], N=1; void upd1(int l, int r, ll x) { if(l>r) return; l+=N; r+=N; tr1[l]+=x; if(l!=r) tr1[r]+=x; while(l/2!=r/2) { if(l%2==0) tr1[l+1]+=x; if(r%2==1) tr1[r-1]+=x; l/=2; r/=2; } } ll cnt1(int v) { v+=N; ll ans=0; while(v) { ans+=tr1[v]; v/=2; } return ans; } void spl(int v) { lazya[2*v]+=lazya[v]; lazyb[2*v]=max(lazyb[2*v]+lazya[v], lazyb[v]); lazya[2*v+1]+=lazya[v]; lazyb[2*v+1]=max(lazyb[2*v+1]+lazya[v], lazyb[v]); lazya[v]=0; lazyb[v]=-INF; } void upd2(int v, int l, int r, int a, int b, ll x, ll y) { if(r<a || b<l) return; if(a<=l && r<=b) { lazya[v]+=x; lazyb[v]=max(lazyb[v]+x, y); return; } spl(v); int mid=(l+r)/2; upd2(2*v, l, mid, a, b, x, y); upd2(2*v+1, mid+1, r, a, b, x, y); } ll cnt2(int v, int l, int r, int x) { if(r<x || x<l) return 0; if(l==r) return max(lazya[v], lazyb[v]); spl(v); int mid=(l+r)/2; return cnt2(2*v, l, mid, x)+cnt2(2*v+1, mid+1, r, x); } void upd3(int v, ll x) { v+=N; while(v) { tr2[v]+=x; v/=2; } } ll zejdz(ll k) { int v=1; while(v<N) { v*=2; if(tr2[v]<k) { k-=tr2[v]; ++v; } } return v-N; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; while(N<max(n, q)) N*=2; rep(i, q) { cin >> T[i].t; if(T[i].t==1) { cin >> T[i].l >> T[i].r >> T[i].a >> T[i].b; --T[i].l; --T[i].r; dodaj[T[i].l].pb(i); usun[T[i].r].pb(i); upd1(T[i].l, T[i].r, T[i].b); upd2(1, 0, N-1, T[i].l, T[i].r, T[i].b, 0); } else if(T[i].t==2) { cin >> T[i].l >> T[i].r >> T[i].a; --T[i].l; --T[i].r; upd2(1, 0, N-1, T[i].l, T[i].r, -T[i].a, 0); } else { cin >> T[i].a >> T[i].b; --T[i].a; ll x=cnt1(T[i].a), y=cnt2(1, 0, N-1, T[i].a); if(y<T[i].b) continue; T[i].l=x-y+T[i].b; odp[T[i].a].pb(i); } } rep(i, n) { for(auto j : dodaj[i]) upd3(j, T[j].b); for(auto j : odp[i]) { ll x=zejdz(T[j].l); wynik[j]=T[x].a; } for(auto j : usun[i]) upd3(j, -T[j].b); } rep(i, q) if(T[i].t==3) cout << wynik[i] << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...