Submission #1299414

#TimeUsernameProblemLanguageResultExecution timeMemory
1299414Tai_xiuFood Court (JOI21_foodcourt)C++20
100 / 100
465 ms63480 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define ll long long #define Z int #define i128 int128 #define ii pair<int,int> #define ld long double #define vi vector<int> #define vvi vector<vi> #define vii vector<pair<int,int>> #define FOR(i,a,b) for (int i=a;i<=b;i++) #define FOR1(i,a,b,c) for (int i=a;i<=b;i+=c) #define REP(i,a,b) for (int i=a;i>=b;i--) #define REP1(i,a,b,c) for(int i=b;i>=a;i-=c) #define endh '\n'; #define len(a) ((Z)(a).size()) #define pb(c) push_back(c) #define elif else if #define ppb() pop_back() #define rong std::npos #define all(c) (c.begin(),c.end()) #define Z int #define lcm(a,b) ((int) (a/__gcd(a,b))*b) #define mk(a,b) make_pair(a,b) #define fi first #define se second Z dx4[]= {-1,1,0,0}; Z dy4[]= {0,0,1,-1}; string co="YES",khong="NO"; const int mod=1e9+7; const string NAME = "facttree"; const Z maxn = 250005; const Z oo = 1e9; struct stbeat { vi ma1, ma2, maxc, sum, lazy; stbeat(){} stbeat(Z _n) { ma1 = ma2 = maxc = sum = lazy = vi (4 * _n + 7, 0); } void merge(Z v) { if (ma1[v * 2] == ma1[v *2 +1]){ ma1[v] = ma1[v * 2]; ma2[v] = max(ma2[v *2], ma2[ v * 2 + 1]); maxc[v] = maxc[v * 2] + maxc[v * 2 + 1]; } else if (ma1[v * 2] > ma1[v *2 + 1]){ ma1[v] = ma1[v * 2]; ma2[v] = max(ma2[v * 2], ma1[v * 2 + 1]); maxc[v] = maxc[v * 2]; } else{ ma1[v] = ma1[v * 2 + 1]; ma2[v] = max(ma2[v * 2 + 1], ma1[v * 2]); maxc[v] = maxc[v *2 + 1]; } sum[v] = sum[v * 2] + sum[v * 2 + 1]; } void pushmin(Z v, Z val) { if (ma1[v] <= val) return; sum[v] -= maxc[v] * ma1[v]; ma1[v] = val; sum[v] += maxc[v] * ma1[v]; } void pushadd(Z v, Z tl, Z tr, Z val) { if (val == 0) return; sum[v] += (tr - tl + 1) * val; ma1[v] += val; if (ma2[v] != -oo) ma2[v] += val; lazy[v] += val; } void push(Z v, Z tl, Z tr) { Z tm = tl + tr >> 1; pushadd(v * 2, tl, tm, lazy[v]); pushadd(v * 2 + 1, tm + 1, tr, lazy[v]); pushmin(v * 2, ma1[v]); pushmin(v *2 + 1, ma1[v]); lazy[v] = 0; } void build(Z v, Z tl, Z tr) { if (tl == tr){ sum[v] = 0; maxc[v] = 1; ma1[v] = 0; ma2[v] = -oo; return; } Z tm = tl + tr >> 1; build(v * 2, tl, tm); build(v * 2 + 1, tm + 1, tr); merge(v); } void add(Z v, Z tl, Z tr, Z l, Z r, Z val) { if (tl > tr || l > r || tl > r || tr < l) return; if (tl >= l && tr <= r) { pushadd(v, tl, tr, val); return; } Z tm = tl + tr >> 1; push(v, tl, tr); add (v *2 ,tl, tm, l, r, val); add(v *2 + 1, tm + 1 ,tr, l, r, val); merge(v); } void chmin(Z v, Z tl, Z tr, Z l, Z r, Z val) { if (tl > tr || l > r || tl > r || tr < l || ma1[v] <= val) return; if (tl >= l && tr <= r && ma2[v] < val){ pushmin(v, val); return; } push(v, tl, tr); Z tm = tl + tr >> 1; chmin(v * 2, tl ,tm, l, r, val); chmin(v * 2 + 1, tm + 1, tr, l, r, val); merge(v); } Z query(Z v, Z tl, Z tr, Z l, Z r) { if (tl > tr || l > r || tl > r || tr < l ) return 0; if (tl >= l && tr <= r) return sum[v]; Z tm = tl + tr >> 1; push(v, tl, tr); return query(v * 2, tl, tm, l, r) + query(v * 2 + 1, tm + 1, tr, l, r); } }; struct bit { vi arr; Z n; bit(){} bit(Z _n) { n = _n; arr = vi ( _n + 7, 0); } void update(Z i, Z val) { for (;i <= n ; i += (i & - i)){ arr[i] += val; } } Z query(Z i){ Z ans = 0; for (;i ; i&= (i - 1)) ans += arr[i]; return ans; } }; Z n, m, q; array<Z, 4> add[maxn]; Z L[maxn], R[maxn], bound[maxn], vt[maxn], ans[maxn]; vi g[maxn]; Z id = 0, cc = 0; signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m >> q; stbeat st1(n); st1.build(1, 1, n); bit bit1(n); FOR(i, 1, q){ Z type, l, r, c, k; ans[i] = -1; cin >> type; if (type == 1){ cin >> l >> r >> c >> k; st1.add(1, 1, n, l, r, -k); bit1.update(l, k); bit1.update(r + 1, -k); add[++ id] = {l, r, c, k}; } else if (type == 2){ cin >> l >> r >> k; st1.add(1, 1, n, l, r, k); st1.chmin(1, 1, n, l, r, 0); } else{ Z idx, w; cin >> idx >> w; Z val = bit1.query(idx) + w + st1.query(1, 1, n, idx, idx); // cout << val << " "<< bit1.query(idx)<<" "<< st1.query(1, 1, n, idx, idx) << '\n'; ans[i] = 1; if (val > bit1.query(idx) ) { ans[i] = 0; } else{ L[i] = 1; R[i] = id; bound[i] = val; vt[i] = idx; } } } // FOR(i, 1, id){ // cout << add[i][0] <<" "<< add[i][1] <<" " << add[i][2] <<" "<<add[i][3] << '\n'; // } // FOR(i, 1, q) cout << bound[i] <<"\n"; // cout << id << '\n'; FOR(i, 0, 20){ FOR(j, 1, id) g[j].clear(); FOR(j, 1, n) bit1.arr[j] = 0; FOR(j, 1, q){ if (R[j] && L[j] <= R[j]) { g[(L[j] + R[j]) / 2].pb(j); } } FOR(j, 1, id){ bit1.update(add[j][0], add[j][3]); bit1.update(add[j][1] + 1, -add[j][3]); // FOR(k, 1, n) cout <<bit1.query(k) <<" "; // cout << '\n'; for (Z vitri : g[j]){ if (bit1.query(vt[vitri]) >= bound[vitri]) R[vitri] = j - 1; else L[vitri] = j + 1; } } } FOR(i, 1, q){ if (ans[i] == -1) continue; // if ( L[i] == 0){ // continue; // } if (ans[i] == 0) cout << 0 << '\n'; else { cout << add[ R[i] + 1][2] << '\n'; } } // freopen((NAME + ".inp").c_str(),"r", stdin); // freopen((NAME + ".out").c_str(),"w", stdout); }
#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...