Submission #546157

#TimeUsernameProblemLanguageResultExecution timeMemory
546157leakedFish 2 (JOI22_fish2)C++14
100 / 100
1510 ms60768 KiB
#include <bits/stdc++.h> #define f first #define s second #define vec vector #define pb push_back #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define pw(x) (1LL<<(x)) #define sz(x) (int)(x).size() #define m_p make_pair #define fast_prep ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef long double ld; template<class T> bool umin(T &a,const T &b){return (a>b?a=b,1:0);} template<class T> bool umax(T &a,const T &b){return (a<b?a=b,1:0);} const int N=1e5+1; const ll inf=1e18; struct node{ vec<array<ll,3>> pref,suf; ///their value, whom not exceed,cnt ll s; node(){ s=0; } }; int a[N]; node t[4*N]; node mg(node a,node b){ node c; c.s=a.s+b.s; c.suf=b.suf; c.suf.pop_back(); c.pref=a.pref; c.pref.pop_back(); /// deleted fulls int j=0,k=0; int ok=0; vec<int> cnt1(sz(b.pref),0); vec<int> cnt2(sz(a.suf),0); for(int i=0;i<sz(b.pref);i++){ umax(k,i); ok=1; while(ok){ ok=0; if(k<sz(b.pref) && (a.suf[j][0]+b.pref[k][0])>=b.pref[k][1]) ++k,ok=1; if(j<sz(a.suf) && (a.suf[j][0]+b.pref[k][0])>=a.suf[j][1]) ++j,ok=1; } // cout<<"WOW "<<j<<' '<<k<<' '<<sz(b.pref)<<' '<<sz(a.suf)<<endl; if(k==sz(b.pref)-1) cnt2[j]+=b.pref[i][2]; if(j==sz(a.suf)-1) cnt1[k]+=b.pref[i][2]; } j=0;k=0; for(int i=0;i<sz(a.suf);i++){ umax(j,i); ok=1; while(ok){ ok=0; if(k<sz(b.pref) && (a.suf[j][0]+b.pref[k][0])>=b.pref[k][1]) ++k,ok=1; if(j<sz(a.suf) && (a.suf[j][0]+b.pref[k][0])>=a.suf[j][1]) ++j,ok=1; } // cout<<"WOW "<<j<<' '<<k<<' '<<sz(b.pref)<<' '<<sz(a.suf)<<endl; if(k==sz(b.pref)-1) cnt2[j]+=a.suf[i][2]; if(j==sz(a.suf)-1) cnt1[k]+=a.suf[i][2]; } for(int i=0;i<sz(a.suf);i++){ if(cnt2[i]){ assert(a.suf[i][1]>=(a.suf[i][0]+b.s)); } if(a.suf[i][1]>(a.suf[i][0]+b.s)) c.suf.pb({a.suf[i][0]+b.s,a.suf[i][1],cnt2[i]}); } for(int i=0;i<sz(b.pref);i++){ if(cnt1[i]){ assert(b.pref[i][1]>=(b.pref[i][0]+a.s)); } if(b.pref[i][1]>(b.pref[i][0]+a.s)) c.pref.pb({b.pref[i][0]+a.s,b.pref[i][1],cnt1[i]}); } return c; } void build(int v,int tl,int tr){ if(tl==tr){ int x=a[tl]; t[v].pref.clear();t[v].suf.clear(); t[v].s=x; t[v].pref.pb({0,x,0}); t[v].suf.pb({0,x,0}); t[v].pref.pb({x,inf,1}); t[v].suf.pb({x,inf,1}); } else{ int tm=(tl+tr)>>1; build(2*v,tl,tm);build(2*v+1,tm+1,tr); // cout<<"ME "<<tl<<' '<<tr<<endl; t[v]=mg(t[2*v],t[2*v+1]); } } void upd(int i,int x,int v,int tl,int tr){ if(tl==tr){ t[v].pref.clear();t[v].suf.clear(); t[v].s=x; t[v].pref.pb({0,x,0}); t[v].suf.pb({0,x,0}); t[v].pref.pb({x,inf,1}); t[v].suf.pb({x,inf,1}); return; } int tm=(tl+tr)>>1; if(tm>=i) upd(i,x,2*v,tl,tm); else upd(i,x,2*v+1,tm+1,tr); t[v]=mg(t[2*v],t[2*v+1]); } node emp; node get(int l,int r,int v,int tl,int tr){ if(tl>=l&&tr<=r) return t[v]; if(tl>r||tr<l) return emp; int tm=(tl+tr)>>1; return mg(get(l,r,2*v,tl,tm),get(l,r,2*v+1,tm+1,tr)); } signed main(){ fast_prep; int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } build(1,0,n-1); emp.pref.pb({0,inf,0}); emp.suf.pb({0,inf,0}); // return 0; int q; cin>>q; while(q--){ int tp; cin>>tp; if(tp==1){ int i,x; cin>>i>>x; --i; upd(i,x,1,0,n-1); } else{ int l,r; cin>>l>>r;--l;--r; node ans=get(l,r,1,0,n-1); assert(ans.suf.back()[1]==inf); cout<<ans.suf.back()[2]<<'\n'; } } return 0; } /* */
#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...