제출 #1179857

#제출 시각아이디문제언어결과실행 시간메모리
1179857mariaclara푸드 코트 (JOI21_foodcourt)C++20
68 / 100
349 ms37456 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 25e4+1; #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() #define pb push_back #define mk make_pair #define fr first #define sc second int n, m, q; ll segP[4*MAXN], seg[4*MAXN], lazyP[4*MAXN]; vector<int> ls[MAXN], Q[MAXN]; void prop(int node, int leaf) { segP[node] += lazyP[node]; if(!leaf) { lazyP[2*node] += lazyP[node]; lazyP[2*node+1] += lazyP[node]; } lazyP[node] = 0; } void updateP(int node, int l, int r, int p, int q, ll val) { prop(node, l == r); if(r < p or q < l) return; if(p <= l and r <= q) { lazyP[node] = val; prop(node, l == r); return; } int mid = (l+r)/2; updateP(2*node, l, mid, p, q, val); updateP(2*node+1, mid+1, r, p, q, val); segP[node] = min(segP[2*node], segP[2*node+1]); } void update(int node, int l, int r, int ind, ll val) { seg[node] += val; if(l == r) return; int mid = (l+r)/2; if(ind <= mid) update(2*node, l, mid, ind, val); else update(2*node+1, mid+1, r, ind, val); } ll queryP(int node, int l, int r, int p, int q) { // min segP prop(node, l == r); if(q < l or r < p) return 1e18; if(p <= l and r <= q) return segP[node]; int mid = (l+r)/2; return min(queryP(2*node, l, mid, p, q), queryP(2*node+1, mid+1, r, p, q)); } ll query(int node, int l, int r, int p, int q) { // sum seg if(q < l or r < p) return 0; if(p <= l and r <= q) return seg[node]; int mid = (l+r)/2; return query(2*node, l, mid, p, q) + query(2*node+1, mid+1, r, p, q); } int query_busca(int node, int l, int r, ll val) { if(l == r) return l; int mid = (l+r)/2; if(seg[2*node] >= val) return query_busca(2*node, l, mid, val); else return query_busca(2*node+1, mid+1, r, val - seg[2*node]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; vector<int> t(q), c(q), ans(q); vector<ll> k(q); for(int i = 0, l, r; i < q; i++) { cin >> t[i]; if(t[i] == 1) cin >> l >> r >> c[i] >> k[i]; else if(t[i] == 2) cin >> l >> r >> k[i]; else cin >> l >> k[i]; if(t[i] == 3) Q[l].pb(i); else ls[l].pb(i), ls[r+1].pb(-i-1); } for(int i = 1; i <= n; i++) { for(auto it : ls[i]) { int C = 1; if(it < 0) it = -it-1, C = -1; if(t[it] == 1) { updateP(1, 0, q-1, it, q-1, C * k[it]); update(1, 0, q-1, it, C * k[it]); } else updateP(1, 0, q-1, it, q-1, C * -k[it]); } for(auto t3 : Q[i]) { ll minP = min(queryP(1, 0, q-1, 0, t3), 0LL); ll tot1 = query(1, 0, q-1, 0, t3); ll pref3 = queryP(1, 0, q-1, t3, t3); int T = query_busca(1, 0, q-1, tot1 -pref3 + minP + k[t3]); if(T >= t3) ans[t3] = 0; else ans[t3] = c[T]; } } for(int i = 0; i < q; i++) if(t[i] == 3) cout << ans[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...