Submission #538554

#TimeUsernameProblemLanguageResultExecution timeMemory
538554alvingogoFood Court (JOI21_foodcourt)C++14
13 / 100
310 ms79328 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") #define AquA cin.tie(0);ios_base::sync_with_stdio(0); #define fs first #define sc second #define cd complex<double> #define p_q priority_queue #define int long long using namespace std; typedef pair<int,int> pii; struct BIT{ int n; vector<int> bt; void init(int nn){ n=nn; bt.resize(n); } void update(int x,int y){ x++; for(;x<=n;x+=(x&-x)){ bt[x]+=y; } } int query(int x){ x++; int ans=0; for(;x>0;x-=(x&-x)){ ans+=bt[x]; } return ans; } }; struct qu{ int t; int l,r,c,k; int ans=-1; }; vector<qu> vq; struct Q13{ struct upd{ int t,u,k; }; vector<vector<int> > qq; BIT bt; vector<vector<upd> > st; map<int,int> s; void init(int n,int q){ bt.init(q+10); st.resize(4*n); qq.resize(n); } void update(int v,int L,int R,int l,int r,upd a){ if(l==L && r==R){ st[v].push_back(a); return; } int m=(L+R)/2; if(r<=m){ update(2*v+1,L,m,l,r,a); } else if(l>m){ update(2*v+2,m+1,R,l,r,a); } else{ update(2*v+1,L,m,l,m,a); update(2*v+2,m+1,R,m+1,r,a); } } void trav(int v,int L,int R){ for(auto h:st[v]){ bt.update(h.t,h.k); s[h.t]=h.u; } if(L==R){ for(auto h:qq[L]){ int l=0,r=vq[h].l-1; while(r>l){ int m=(l+r+1)/2; if(bt.query(m)<vq[h].k){ l=m; } else{ r=m-1; } } if(bt.query(l+1)<vq[h].k){ vq[h].ans=0; } else{ vq[h].ans=(*s.upper_bound(l)).sc; } } } else{ int m=(L+R)/2; trav(2*v+1,L,m); trav(2*v+2,m+1,R); } for(auto h:st[v]){ bt.update(h.t,-h.k); s.erase(h.t); } } }; signed main(){ AquA; Q13 ss; int n,m,q; cin >> n >> m >> q; vq.resize(q); ss.init(n+1,q); for(int i=0;i<q;i++){ cin >> vq[i].t; if(vq[i].t==1){ cin >> vq[i].l >> vq[i].r >> vq[i].c >> vq[i].k; vq[i].l--; vq[i].r--; ss.update(0,0,n-1,vq[i].l,vq[i].r,{i+1,vq[i].c,vq[i].k}); } else if(vq[i].t==2){ assert(0); cin >> vq[i].l >> vq[i].r >> vq[i].c >> vq[i].k; vq[i].l--; vq[i].r--; } else{ cin >> vq[i].c >> vq[i].k; vq[i].c--; vq[i].l=i; ss.qq[vq[i].c].push_back(i); } } ss.trav(0,0,n-1); for(int i=0;i<q;i++){ if(vq[i].t==3){ cout << vq[i].ans << "\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...