Submission #302382

#TimeUsernameProblemLanguageResultExecution timeMemory
302382errorgornProgression (NOI20_progression)C++14
100 / 100
1733 ms96632 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ii pair<int,int> #define fi first #define se second #define endl '\n' #define rep(x,s,e) for (auto x=s-(s>e);x!=e-(s>e);(s<e?x++:x--)) #define sz(x) (int) (x).size() #define all(x) (x).begin(),(x).end() const ll INF=1e18; int arr[300010]; struct dat{ ll ans; ll lval,llen; ll rval,rlen; ll l,r; dat(){ llen=-1,rlen=-1; } dat(ll i,ll j,ll _l,ll _r){ ans=j; lval=i; llen=j; rval=-1; rlen=-1; l=_l; r=_r; } }; dat merge(dat i,dat j){ dat res=dat(); res.l=i.l,res.r=j.r; res.ans=max(i.ans,j.ans); ll temp=j.l-i.r; if (i.llen==-1){ res.llen=1; res.lval=temp; } else if (i.rlen==-1){ if (i.lval==temp){ res.llen=i.llen+1; res.lval=temp; } else{ res.llen=i.llen; res.lval=i.lval; res.rlen=1; res.rval=temp; } } else{ if (i.rval==temp){ res.llen=i.llen; res.lval=i.lval; res.rlen=i.rlen+1; res.rval=temp; } else{ res.llen=i.llen; res.lval=i.lval; res.rlen=1; res.rval=temp; } } res.ans=max(res.ans,max(res.llen,res.rlen)); if (j.llen!=-1){ if (res.rlen==-1){ if (res.lval==j.lval) res.llen+=j.llen; else{ res.rlen=j.llen; res.rval=j.lval; } } else{ if (res.rval==j.lval) res.rlen+=j.llen; else{ res.rlen=j.llen; res.rval=j.lval; } } } res.ans=max(res.ans,max(res.llen,res.rlen)); if (j.rlen!=-1){ res.rlen=j.rlen; res.rval=j.rval; } res.ans=max(res.ans,max(res.llen,res.rlen)); return res; } struct node{ ll s,e,m,len; dat val; ll incs=0,incc=0; ll sets=INF,setc=INF; node *l,*r; node (ll _s,ll _e){ s=_s,e=_e,m=s+e>>1; len=e-s+1; if (s!=e){ l=new node(s,m); r=new node(m+1,e); val=merge(l->val,r->val); } else{ val=dat(-1,-1,arr[s],arr[s]); } } void propo(){ if (sets!=INF){ if (s==e) val=dat(-1,-1,sets,sets); else val=dat(setc,len-1,sets,sets+(len-1)*setc); if (s!=e){ l->incs=l->incc=0; l->sets=sets,l->setc=setc; r->incs=r->incc=0; r->sets=sets+setc*l->len,r->setc=setc; } sets=INF; setc=INF; } if (incs || incc){ val.l+=incs,val.r+=incs+(len-1)*incc; val.lval+=incc,val.rval+=incc; if (s!=e){ l->incs+=incs,l->incc+=incc; r->incs+=incs+incc*l->len,r->incc+=incc; } incs=0; incc=0; } } void patch(ll i,ll j,ll S,ll C){ propo(); if (s==i && e==j) incs=S,incc=C; else{ if (j<=m) l->patch(i,j,S,C); else if (m<i) r->patch(i,j,S,C); else l->patch(i,m,S,C),r->patch(m+1,j,S+(m-i+1)*C,C); l->propo(),r->propo(); val=merge(l->val,r->val); } } void rewrite(ll i,ll j,ll S,ll C){ propo(); if (s==i && e==j) sets=S,setc=C; else{ if (j<=m) l->rewrite(i,j,S,C); else if (m<i) r->rewrite(i,j,S,C); else l->rewrite(i,m,S,C),r->rewrite(m+1,j,S+(m-i+1)*C,C); l->propo(),r->propo(); val=merge(l->val,r->val); } } dat query(ll i,ll j){ propo(); if (s==i && e==j) return val; else if (j<=m) return l->query(i,j); else if (m<i) return r->query(i,j); else return merge(l->query(i,m),r->query(m+1,j)); } void print(){ cout<<s<<" "<<e<<endl; cout<<val.llen<<" "<<val.lval<<" "<<val.rlen<<" "<<val.rval<<" "<<val.ans<<endl; if (s!=e){ l->print(); r->print(); } } } *root; ll n,q; int main(){ cin.tie(0); cout.tie(0); ios::sync_with_stdio(false); cin>>n>>q; rep(x,1,n+1) cin>>arr[x]; root=new node(0,300005); ll a,b,c,d; while (q--){ cin>>a; if (a==1){ cin>>a>>b>>c>>d; root->patch(a,b,c,d); } else if (a==2){ cin>>a>>b>>c>>d; root->rewrite(a,b,c,d); } else{ cin>>a>>b; if (a==b) cout<<1<<endl; else cout<<root->query(a,b).ans+1<<endl; //root->print(); } } //rep(x,1,n+1) cout<<root->query(x,x).l<<" "; }

Compilation message (stderr)

Progression.cpp: In constructor 'node::node(long long int, long long int)':
Progression.cpp:233:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  233 |   s=_s,e=_e,m=s+e>>1;
      |               ~^~
#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...