Submission #389829

#TimeUsernameProblemLanguageResultExecution timeMemory
389829ogibogi2004Food Court (JOI21_foodcourt)C++14
100 / 100
959 ms112452 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long const ll MAXN=250060; struct node { ll lazymax; ll lazyadd; ll maxhere; }; node tree[4*MAXN]; void build(ll l,ll r,ll idx) { tree[idx].maxhere=0; tree[idx].lazymax=0; tree[idx].lazyadd=0; if(l==r)return; ll mid=(l+r)/2; build(l,mid,idx*2); build(mid+1,r,idx*2+1); } node merge(node n1,node n2) { node ret; ret.maxhere=max(0ll,max(max(n1.maxhere,n1.lazymax)+n1.lazyadd,max(n2.lazymax,n2.maxhere)+n2.lazyadd)); ret.lazyadd=0; ret.lazymax=0; return ret; } void push_lazy(ll l,ll r,ll idx) { //cout<<"&& "<<l<<" "<<r<<" "<<tree[idx].maxhere<<" "<<tree[idx].lazymax<<" "<<tree[idx].lazyadd<<endl; tree[idx].maxhere=max(tree[idx].maxhere,tree[idx].lazymax); tree[idx].maxhere+=tree[idx].lazyadd; tree[idx].maxhere=max(tree[idx].maxhere,0ll); //cout<<"& "<<tree[idx].maxhere<<endl; if(l!=r) { ll b1=tree[idx*2].lazymax; ll c1=tree[idx*2].lazyadd; ll b2=tree[idx].lazymax; ll c2=tree[idx].lazyadd; //if(l==4&&r==6)cout<<b1<<" "<<c1<<" "<<b2<<" "<<c2<<endl; tree[idx*2].lazymax=max(b1,b2-c1); tree[idx*2].lazyadd=c1+c2; } if(l!=r) { ll b1=tree[idx*2+1].lazymax; ll c1=tree[idx*2+1].lazyadd; ll b2=tree[idx].lazymax; ll c2=tree[idx].lazyadd; tree[idx*2+1].lazymax=max(b1,b2-c1); tree[idx*2+1].lazyadd=c1+c2; } tree[idx].lazymax=0; tree[idx].lazyadd=0; } void update(ll l,ll r,ll idx,ll ql,ll qr,ll val) { push_lazy(l,r,idx); if(l>qr)return; if(r<ql)return; if(l>=ql&&r<=qr) { tree[idx].lazyadd+=val; push_lazy(l,r,idx); return; } ll mid=(l+r)/2; update(l,mid,idx*2,ql,qr,val); update(mid+1,r,idx*2+1,ql,qr,val); tree[idx]=merge(tree[idx*2],tree[idx*2+1]); } ll ask(ll l,ll r,ll idx,ll qi) { /*if(l==4&&r==6) { cout<<tree[idx].lazymax<<" "<<tree[idx].lazyadd<<endl; }*/ push_lazy(l,r,idx); if(l>qi||r<qi)return 0; if(l==r)return tree[idx].maxhere; ll mid=(l+r)/2; return max(ask(l,mid,idx*2,qi),ask(mid+1,r,idx*2+1,qi)); } ll n,m,q; void prll(ll l,ll r,ll idx) { cout<<l<<" "<<r<<" "<<tree[idx].maxhere<<" "<<tree[idx].lazymax<<" "<<tree[idx].lazyadd<<endl; if(l==r)return; ll mid=(l+r)/2; prll(l,mid,idx*2); prll(mid+1,r,idx*2+1); } void updateMax(ll l,ll r,ll idx,ll ql,ll qr) { push_lazy(l,r,idx); if(l>qr||r<ql)return; if(l>=ql&&r<=qr) { push_lazy(l,r,idx); return; } ll mid=(l+r)/2; updateMax(l,mid,idx*2,ql,qr); updateMax(mid+1,r,idx*2+1,ql,qr); tree[idx]=merge(tree[idx*2],tree[idx*2+1]); } struct BIT { ll fen[MAXN]; void init() { memset(fen,0,sizeof(fen)); } void update(ll idx,ll val) { idx++; for(;idx<MAXN;idx+=idx&(-idx)) { fen[idx]+=val; } } ll ask(ll idx) { idx++; ll ret=0; for(;idx>0;idx-=idx&(-idx)) { ret+=fen[idx]; } return ret; } }ogi; ll ans[MAXN]; vector<pair<ll,ll> >bs[MAXN]; struct upd { ll type,l,r,c,k; }; vector<upd>v; struct query { ll ind,b,pos; }; vector<query>z; ll low[MAXN],high[MAXN],ans1[MAXN]; vector<pair<query,ll> >toCheck[MAXN]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>m>>q; build(1,n,1); for(ll i=0;i<q;++i) { ll type; cin>>type; if(type==1) { ll l,r,c,k; cin>>l>>r>>c>>k; update(1,n,1,l,r,k); ogi.update(l,+k); ogi.update(r+1,-k); v.push_back({type,l,r,c,k}); } else if(type==2) { ll l,r,k; cin>>l>>r>>k; update(1,n,1,l,r,-k); v.push_back({type,l,r,0,k}); //updateMax(1,n,1,l,r); } else { ll a,b; cin>>a>>b; ll t=ask(1,n,1,a); if(t>=b) { bs[a].push_back({ogi.ask(a)-(t-b),i}); } v.push_back({type,0,0,0,0}); //cout<<t<<endl; } //cout<<"------\n"; //prll(1,n,1); //cout<<"-----\n"; } /*cin>>n>>q; build(1,n,1); for(ll i=0;i<q;i++) { ll l,r,val; cin>>l>>r>>val; update(1,n,1,l,r,val); ll j; cin>>j; cout<<ask(1,n,1,j)<<endl; for(j=1;j<=n;j++) { cout<<ask(1,n,1,j)<<" "; } cout<<endl; prll(1,n,1); }*/ for(ll i=1;i<=n;i++) { for(ll j=0;j<bs[i].size();j++) { z.push_back({i,bs[i][j].first,bs[i][j].second}); } } for(ll i=0;i<z.size();i++) { low[i]=0; high[i]=q-1; //cout<<z[i].ind<<" "<<z[i].b<<" "<<z[i].pos<<endl; } ogi.init(); for(ll step=0;step<19;++step) { for(ll i=0;i<z.size();++i) { if(low[i]<=high[i]) { ll mid=(low[i]+high[i])/2; toCheck[mid].push_back({z[i],i}); } } for(ll j=0;j<v.size();++j) { if(v[j].type==1) { ogi.update(v[j].l,+v[j].k); ogi.update(v[j].r+1,-v[j].k); } for(auto xd:toCheck[j]) { if(ogi.ask(xd.first.ind)>=xd.first.b) { ans1[xd.second]=j; high[xd.second]=j-1; } else low[xd.second]=j+1; } toCheck[j].clear(); } ogi.init(); } for(ll i=0;i<z.size();++i) { //cout<<ans1[i]<<" "<<z[i].pos<<endl; ans[z[i].pos+1]=v[ans1[i]].c; } for(ll i=1;i<=q;++i) { if(v[i-1].type==3) { cout<<ans[i]<<'\n'; } } return 0; } /* 3 5 7 1 2 3 5 2 1 1 2 2 4 3 2 3 2 1 3 3 3 1 2 1 2 3 4 2 3 3 2 */

Compilation message (stderr)

foodcourt.cpp: In function 'int main()':
foodcourt.cpp:215:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  215 |   for(ll j=0;j<bs[i].size();j++)
      |              ~^~~~~~~~~~~~~
foodcourt.cpp:220:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  220 |  for(ll i=0;i<z.size();i++)
      |             ~^~~~~~~~~
foodcourt.cpp:229:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  229 |   for(ll i=0;i<z.size();++i)
      |              ~^~~~~~~~~
foodcourt.cpp:237:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<upd>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  237 |   for(ll j=0;j<v.size();++j)
      |              ~^~~~~~~~~
foodcourt.cpp:257:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  257 |  for(ll i=0;i<z.size();++i)
      |             ~^~~~~~~~~
#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...