Submission #1256443

#TimeUsernameProblemLanguageResultExecution timeMemory
1256443PieArmyFood Court (JOI21_foodcourt)C++20
100 / 100
610 ms116996 KiB
#include<bits/stdc++.h> typedef long long ll; #define pb push_back #define fr first #define sc second using namespace std; struct Seg{ #define mid ((left+right)>>1) #define sol node*2,left,mid #define sag node*2+1,mid+1,right int n; vector<ll>tree; vector<pair<ll,int>>pref; void build(int node=1,int left=0,int right=-1){ if(right==-1)right=n-1; if(left==right){ tree[node]=0; pref[node]={0,-left}; return; } build(sol); build(sag); tree[node]=tree[node*2]+tree[node*2+1]; pref[node]=min(pref[node*2],{tree[node*2]+pref[node*2+1].fr,pref[node*2+1].sc}); } void init(int N){ n=N; tree.resize(n<<2); pref.resize(n<<2); build(); } int l,r; void up(int node=1,int left=0,int right=-1){ if(right==-1)right=n-1; if(left==right){ pref[node]={tree[node]=r,-left}; return; } if(l>mid)up(sag); else up(sol); tree[node]=tree[node*2]+tree[node*2+1]; pref[node]=min(pref[node*2],{tree[node*2]+pref[node*2+1].fr,pref[node*2+1].sc}); } void update(int tar,int val){ l=tar;r=val; up(); } pair<ll,pair<ll,int>> qu(int node=1,int left=0,int right=-1){ if(right==-1)right=n-1; if(left>=l&&right<=r)return {tree[node],pref[node]}; if(left>r||right<l)return {0,{1e9+1,1}}; pair<ll,pair<ll,int>>res,a=qu(sol),b=qu(sag); res.fr=a.fr+b.fr; res.sc=min(a.sc,{a.fr+b.sc.fr,b.sc.sc}); return res; } pair<ll,pair<ll,int>> query(int left,int right){ l=left; r=right; if(l==-1||r==-1||l>r)return {0,{1e9+1,1}}; return qu(); } int walk(ll k,int node=1,int left=0,int right=-1){ if(k==0)return n; if(right==-1)right=n-1; if(tree[node]<k)return n; if(left==right)return left; if(tree[node*2]>=k)return walk(k,sol); k-=tree[node*2]; return walk(k,sag); } #undef mid }; int n,m,q; vector<ll>query[250023]; vector<int>ekle[250023],cikar[250023],sor[250023]; ll ans[250023]; Seg pos,neg,both; int main(){ ios_base::sync_with_stdio(23-23);cin.tie(0); cin>>n>>m>>q; for(int i=0;i<q;i++){ int t;cin>>t; vector<ll>&v=query[i]; if(t==1){ v.resize(4); cin>>v[0]>>v[1]>>v[2]>>v[3]; ekle[v[0]].pb(i); cikar[v[1]+1].pb(i); } else if(t==2){ v.resize(3); cin>>v[0]>>v[1]>>v[2]; v[2]*=-1; ekle[v[0]].pb(i); cikar[v[1]+1].pb(i); } else{ v.resize(2); cin>>v[0]>>v[1]; sor[v[0]].pb(i); } } query[q].resize(3,0); pos.init(q); neg.init(q); both.init(q); for(int i=1;i<=n;i++){ for(int x:ekle[i]){ both.update(x,query[x].back()); if(query[x].back()>0){ pos.update(x,query[x].back()); } else neg.update(x,query[x].back()); } for(int x:cikar[i]){ both.update(x,0); if(query[x].back()>0){ pos.update(x,0); } else neg.update(x,0); } for(int x:sor[i]){ pair<ll,int>mn=both.query(0,x).sc; mn.sc*=-1; if(mn.fr>0)mn.sc=-1; ll w=neg.query(mn.sc+1,x).fr; ll ek=pos.query(0,mn.sc).fr; int tar=pos.walk(query[x].back()-w+ek); if(tar<x)ans[x]=query[tar][2]; } } for(int i=0;i<q;i++){ if(query[i].size()==2)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...