Submission #971476

#TimeUsernameProblemLanguageResultExecution timeMemory
971476huutuanFood Court (JOI21_foodcourt)C++14
100 / 100
313 ms66356 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int inf=1e18; struct Node{ int x, y; Node (){ x=-inf, y=0; } }; struct SegmentTree{ int n; vector<Node> t; void init(int _n){ n=_n; t.assign(4*n+1, Node()); } void apply(int k, int x, int y){ t[k].x=max(x, t[k].x+y); t[k].y+=y; } void push(int k){ if (t[k].x!=-inf || t[k].y!=0){ apply(k<<1, t[k].x, t[k].y); apply(k<<1|1, t[k].x, t[k].y); t[k]=Node(); } } void update(int k, int l, int r, int L, int R, int x, int y){ if (r<L || R<l) return; if (L<=l && r<=R){ apply(k, x, y); return; } push(k); int mid=(l+r)>>1; update(k<<1, l, mid, L, R, x, y); update(k<<1|1, mid+1, r, L, R, x, y); } int get(int k, int l, int r, int pos){ if (l==r) return max(t[k].x, t[k].y); push(k); int mid=(l+r)>>1; if (pos<=mid) return get(k<<1, l, mid, pos); return get(k<<1|1, mid+1, r, pos); } } st; struct FenwickTree{ int n; vector<int> t; void init(int _n){ n=_n; t.assign(n+1, 0); } void update(int pos, int val){ for (int i=pos; i<=n; i+=i&(-i)) t[i]+=val; } void update(int l, int r, int val){ update(l, val); if (r<n) update(r+1, -val); } int get(int pos){ int ans=0; for (int i=pos; i; i-=i&(-i)) ans+=t[i]; return ans; } int lower_bound(int val){ int ans=0; for (int i=17; i>=0; --i){ if (ans+(1<<i)<=n && val>t[ans+(1<<i)]){ ans+=1<<i; val-=t[ans]; } } return ans+1; } } bit1, bit2; struct Query{ int l, r, c, k, i; Query (int _l=0, int _r=0, int _c=0, int _k=0, int _i=0){ l=_l, r=_r, c=_c, k=_k, i=_i; } }; const int N=25e4+10; int n, m, q, ans[N]; Query a[N]; vector<pair<int, int>> v[N]; vector<Query> event[N]; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> q; st.init(n); bit1.init(n); int n1=0, n2=0; for (int i=1; i<=q; ++i){ int type; cin >> type; if (type==1){ int l, r, c, k; cin >> l >> r >> c >> k; ++n1; a[n1]=Query(l, r, c, k, n1); st.update(1, 1, n, l, r, -inf, k); bit1.update(l, r, k); }else if (type==2){ int l, r, k; cin >> l >> r >> k; st.update(1, 1, n, l, r, 0, -k); }else{ int x, y; cin >> x >> y; int sz=st.get(1, 1, n, x); int r=bit1.get(x); int l=r-sz; ++n2; if (y<=sz) v[x].emplace_back(l+y-1, n2); } } bit2.init(n1); for (int i=1; i<=n1; ++i) event[a[i].l].push_back(a[i]), event[a[i].r+1].push_back(a[i]); for (int i=1; i<=n; ++i){ for (auto &j:event[i]){ if (j.l==i){ bit2.update(j.i, j.k); }else{ bit2.update(j.i, -j.k); } } for (auto &j:v[i]){ ans[j.second]=a[bit2.lower_bound(j.first+1)].c; } } for (int i=1; i<=n2; ++i) cout << ans[i] << '\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...