Submission #1248162

#TimeUsernameProblemLanguageResultExecution timeMemory
1248162damoonFood Court (JOI21_foodcourt)C++20
100 / 100
886 ms77044 KiB
#include <bits/stdc++.h> using namespace std; //#pragma GCC optimize("O3,unroll-loops") //main //#pragma GCC target("avx2") //cf... //#pragma GCC target("sse4") //Quera #define ll long long typedef pair<ll,ll> pii; #define f first #define s second #define lc 2*id #define rc 2*id+1 #define mid (l+r)/2 #define all(x) x.begin(),x.end() #define pb push_back #define pp pop_back #define unicorn(x) x.resize(unique(x.begin(),x.end())-x.begin()) #define dig(x,d) ((x&(1ll<<d)) > 0) string pr(int* vv,int l,int r){for(int i=l;i<r;i++)cout<<vv[i]<<" ";return "";} string pr( ll* vv,int l,int r){for(int i=l;i<r;i++)cout<<vv[i]<<" ";return "";} string pr(vector<int> vv){for(auto i:vv)cout<<i<<" ";return "";} string pr( vector<ll> vv){for(auto i:vv)cout<<i<<" ";return "";} string pr(pii* vv,int l,int r){for(int i=l;i<r;i++)cout<<"( "<<vv[i].f<<","<<vv[i].s<<" ) ";return "";} string pr(vector<pii> vv){for(auto i:vv)cout<<"( "<<i.f<<","<<i.s<<" ) ";return "";} string pr(bool* vv,int l,int r){for(int i=l;i<r;i++)cout<<vv[i];return"";} ostream& operator <<(ostream& out, pii x){out << "("<<x.f<<", "<<x.s<<") ";return out;} const int L=3e5+10,N = 3e5+1; const ll inf=1000ll*1000*1000*1000*1000*1000+10; int n,m,q; int P[L]; vector<int> A[L]; vector<int> en[L],st[L]; ll rem[L],ans[L]; struct que{ ll mode,C,l,r,k; }Q[L]; struct sagi{ struct node{ pii mn; ll lazy; node(){ mn = pii(inf,inf); lazy = 0; } }t[L<<2]; void build(int id,int l,int r){ t[id].lazy = 0; if(l+1 == r){ t[id].mn = pii(0,l); return; } build(lc,l,mid); build(rc,mid,r); t[id].mn = min(t[lc].mn,t[rc].mn); } void spread(int id){ if(rc < L*4){ t[lc].lazy += t[id].lazy; t[rc].lazy += t[id].lazy; } t[id].mn.f += t[id].lazy; t[id].lazy = 0; } void update(int id,int l,int r,int l2,int r2,ll x){ spread(id); if(l==l2 and r==r2){ t[id].lazy += x; return; } if(l2 < mid) update(lc,l,mid,l2,min(r2,mid),x); if(r2 > mid) update(rc,mid,r,max(l2,mid),r2,x); spread(lc); spread(rc); t[id].mn = min(t[lc].mn,t[rc].mn); } pii get(int id,int l,int r,int l2,int r2){ spread(id); if(l==l2 and r==r2) return t[id].mn; pii ans = pii(inf,inf); if(l2 < mid) ans = min(ans,get(lc,l,mid,l2,min(r2,mid))); if(r2 > mid) ans = min(ans,get(rc,mid,r,max(l2,mid),r2)); return ans; } void put(int ind, ll x){ update(1,1,N,ind,ind+1,x-get(1,1,N,ind,ind+1).f); } void Prr(int id,int l,int r){ spread(id); cout<<"node: "<<l<<","<<r<<" --> "<<t[id].mn<<endl; if(l+1 == r) return; Prr(lc,l,mid); Prr(rc,mid,r); return; } }seg; struct fen{ ll sum[L]; void reset(){ fill(sum+1,sum+L,0); } void update(int ind,ll x){ for(int i=ind ; i<L ; i+=i&-i){ sum[i] += x; } } ll get(int ind){ ll ans = 0; for(int i=ind ; i>0 ; i-=i&-i){ ans += sum[i]; } return ans; } }F; bool cmp(int x,int y){ return (Q[x].k < Q[y].k); } void update(int x){ if(P[x] == A[x].size()) return; seg.update(1,1,N,x,x+1,-Q[A[x][P[x]]].k); P[x]++; if(P[x] < A[x].size()) seg.update(1,1,N,x,x+1, Q[A[x][P[x]]].k); else seg.put(x,inf); } int main(){ //ofstream cout ("out.out"); //ifstream cin ("in.in"); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=1;i<=q;i++){ cin>>Q[i].mode; if(Q[i].mode == 1){ cin>>Q[i].l>>Q[i].r>>Q[i].C>>Q[i].k; en[Q[i].r].pb(i); st[Q[i].l].pb(i); } if(Q[i].mode == 2){ cin>>Q[i].l>>Q[i].r>>Q[i].k; Q[i].k = -Q[i].k; } if(Q[i].mode == 3){ cin>>Q[i].l>>Q[i].k; A[Q[i].l].pb(i); } } F.reset(); for(int i=1;i<=n;i++){ for(auto x:en[i-1]){ F.update(x,-Q[x].k); } for(auto x:st[i]){ F.update(x, Q[x].k); } for(auto x:A[i]){ rem[x] = F.get(x); } } for(int i=1;i<=q;i++){ if(Q[i].mode == 2){ en[Q[i].r].pb(i); st[Q[i].l].pb(i); } } F.reset(); seg.build(1,1,N); for(int i=1;i<=n;i++){ for(auto x:en[i-1]){ seg.update(1,1,N,x,N,-Q[x].k); F.update(x,-Q[x].k); } for(auto x:st[i]){ seg.update(1,1,N,x,N, Q[x].k); F.update(x, Q[x].k); } for(auto x:A[i]){ rem[x] -= F.get(x)-min(seg.get(1,1,N,1,x+1).f,0ll); } /* cout<<i<<" seg: "<<seg.prr()<<endl; cout<<"------------------"<<endl; */ } for(int i=1;i<=q;i++){ Q[i].k += rem[i]; } seg.build(1,1,N); for(int i=n+1;i<N;i++){ seg.put(i,inf); } for(int i=1;i<=n;i++){ sort(all(A[i]),cmp); P[i] = 0; if(A[i].size()) seg.put(i,Q[A[i][0]].k); else seg.put(i,inf); } fill(ans+1,ans+q+1,0); for(int i=1;i<=q;i++){ if(Q[i].mode != 1) continue; seg.update(1,1,N,Q[i].l, Q[i].r+1, -Q[i].k); while(true){ pii d = seg.get(1,1,N,1,N); if(d.f > 0) break; if(i < A[d.s][P[d.s]]) ans[A[d.s][P[d.s]]] = Q[i].C; update(d.s); } } for(int i=1;i<=q;i++){ if(Q[i].mode == 3){ cout<<ans[i]<<endl; } } }
#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...