Submission #646283

#TimeUsernameProblemLanguageResultExecution timeMemory
646283KriptonWeirdtree (RMI21_weirdtree)C++14
100 / 100
286 ms37196 KiB
#include <bits/stdc++.h> #include "weirdtree.h" using namespace std; int h[300001]; struct Beats { int max1,max2,cntmax; long long sum; } aint[1200001]; void combina(int nod) { //suma aint[nod].sum=aint[2*nod].sum+aint[2*nod+1].sum; //maxim if(aint[2*nod].max1==aint[2*nod+1].max1) { aint[nod].max1=aint[2*nod].max1; aint[nod].cntmax=aint[2*nod].cntmax+aint[2*nod+1].cntmax; aint[nod].max2=max(aint[2*nod].max2,aint[2*nod+1].max2); } else { if(aint[2*nod].max1>aint[2*nod+1].max1) { aint[nod].max1=aint[2*nod].max1; aint[nod].cntmax=aint[2*nod].cntmax; aint[nod].max2=max(aint[2*nod].max2,aint[2*nod+1].max1); } else { aint[nod].max1=aint[2*nod+1].max1; aint[nod].cntmax=aint[2*nod+1].cntmax; aint[nod].max2=max(aint[2*nod].max1,aint[2*nod+1].max2); } } } void pushmin(int nod,int val) { if(val>=aint[nod].max1) return; aint[nod].sum-=1LL*aint[nod].cntmax*aint[nod].max1; aint[nod].max1=val; aint[nod].sum+=1LL*aint[nod].cntmax*aint[nod].max1; } void pushdown(int nod) { pushmin(2*nod,aint[nod].max1); pushmin(2*nod+1,aint[nod].max1); } void build(int nod,int st,int dr) { if(st==dr) { aint[nod].max1=aint[nod].sum=h[st]; aint[nod].max2=-1e9; aint[nod].cntmax=1; return; } int mid=(st+dr)/2; build(2*nod,st,mid); build(2*nod+1,mid+1,dr); combina(nod); } long long suma(int nod,int st,int dr,int a,int b) { if(b<st||dr<a) return 0; if(a<=st&&dr<=b) return aint[nod].sum; pushdown(nod); int mid=(st+dr)/2; return suma(2*nod,st,mid,a,b)+suma(2*nod+1,mid+1,dr,a,b); } void WaverlyPlace(int nod,int st,int dr,int poz,int val) { if(poz<st||dr<poz) return; if(st==poz&&poz==dr) { aint[nod].max1=aint[nod].sum=val; return; } pushdown(nod); int mid=(st+dr)/2; WaverlyPlace(2*nod,st,mid,poz,val); WaverlyPlace(2*nod+1,mid+1,dr,poz,val); combina(nod); } int x,vf,y; void gimmeMax(int nod,int st,int dr,int a,int b) { if(b<st||dr<a) return; if(a<=st&&dr<=b) { if(aint[nod].max1>x) { y=x; x=aint[nod].max1; vf=aint[nod].cntmax; } else if(aint[nod].max1==x) vf+=aint[nod].cntmax; else if(aint[nod].max1>y) y=aint[nod].max1; if(aint[nod].max2>y) y=aint[nod].max2; return; } pushdown(nod); int mid=(st+dr)/2; gimmeMax(2*nod,st,mid,a,b); gimmeMax(2*nod+1,mid+1,dr,a,b); } void updmin(int nod,int st,int dr,int a,int b,int val) { if(b<st||dr<a||aint[nod].max1<val) return; if(a<=st&&dr<=b&&aint[nod].max2<val) { pushmin(nod,val); return; } pushdown(nod); int mid=(st+dr)/2; updmin(2*nod,st,mid,a,b,val); updmin(2*nod+1,mid+1,dr,a,b,val); combina(nod); } int updminpart(int nod,int st,int dr,int a,int b,int val,int cate) { if(b<st||dr<a||aint[nod].max1<=val||cate<=0) return 0; if(a<=st&&dr<=b&&aint[nod].max2<val&&aint[nod].cntmax<=cate) { pushmin(nod,val); return aint[nod].cntmax; } pushdown(nod); int mid=(st+dr)/2; int x=updminpart(2*nod,st,mid,a,b,val,cate); int y=updminpart(2*nod+1,mid+1,dr,a,b,val,cate-x); combina(nod); return x+y; } int n,q; void initialise ( int N, int Q, int H []) { n=N; q=Q; for(int i=1; i<=n; i++) h[i]=H[i]; build(1,1,n); } void cut ( int l, int r, int k ) { while(k) { vf=-1; x=y=-1e9; gimmeMax(1,1,n,l,r); y=max(y,0); if(x==0&&y==0) break; //cout<<x<<" "<<y<<" "<<vf<<'\n'; if(k>=1LL*(x-y)*vf) { k-=1LL*(x-y)*vf; updmin(1,1,n,l,r,y); } else { int y=x-k/vf; if(y!=x) updmin(1,1,n,l,r,y); assert(updminpart(1,1,n,l,r,y-1,k%vf)==k%vf); k=0; } } } void magic ( int i, int x ) { WaverlyPlace(1,1,n,i,x); } long long int inspect ( int l, int r ) { //for(int i=1;i<=n;i++) //cout<<suma(1,1,n,i,i)<<" "; //cout<<'\n'; return suma(1,1,n,l,r); }
#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...