Submission #933693

#TimeUsernameProblemLanguageResultExecution timeMemory
9336933maraWall (IOI14_wall)C++17
24 / 100
269 ms53840 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int N=2e6; int a[N*4]; int add[N*4],rem[N*4]; void upd(int t, int l, int r, int ll, int rr, int op, int val){ if(ll>rr) return; if(l==ll&&r==rr){ if(op==0) add[t]=max(add[t],val); else{ if(~rem[t]){ rem[t]=min(rem[t],val); } else{ rem[t]=val; } } } else{ int m=(l+r)/2; upd(t*2,l,m,ll,min(m,rr),op,val); upd(t*2+1,m+1,r,max(ll,m+1),rr,op,val); } } int get(int t, int l, int r, int idx){ if(~add[t]){ a[t]=max(add[t],a[t]); add[t*2]=max(add[t*2],add[t]); add[t*2+1]=max(add[t*2+1],add[t]); } if(~rem[t]){ a[t]=min(rem[t],a[t]); if(~rem[t*2])rem[t*2]=min(rem[t*2],rem[t]); else rem[t*2]=rem[t]; if(~rem[t*2+1])rem[t*2+1]=min(rem[t*2+1],rem[t]); else rem[t*2+1]=rem[t]; } if(l==r){ return a[t]; } else{ int m=(l+r)/2; if(idx<=m) return get(t*2,l,m,idx); else return get(t*2+1,m+1,r,idx); } } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ memset(rem,-1,sizeof rem); for(int i=0;i<k;i++){ upd(1,0,n-1,left[i],right[i],op[i]-1,height[i]); } for(int i=0;i<n;i++){ finalHeight[i]=get(1,0,n-1,i); } return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...