Submission #18408

#TimeUsernameProblemLanguageResultExecution timeMemory
18408chan492811Wall (IOI14_wall)C++98
100 / 100
1069 ms141724 KiB
#include <algorithm> #define INF 2100000000 using namespace std; int n,m,tn=1; struct data{ int maxh,minh,l,r; }; data tree[8000010]; void make_tree(int a){ if(a>=tn) return; make_tree(a*2); make_tree(a*2+1); if(tree[a*2].l==0) return; if(tree[a*2+1].l==0){ tree[a]=tree[a*2]; return; } tree[a].l=tree[a*2].l; tree[a].r=tree[a*2+1].r; } void update_node(int flag,int a,int h){ if(flag==1){ tree[a].maxh=max(tree[a].maxh,h); tree[a].minh=max(tree[a].minh,h); }else{ tree[a].maxh=min(tree[a].maxh,h); tree[a].minh=min(tree[a].minh,h); } } void update(int flag,int a,int l,int r,int h){ if(tree[a].l==0 || tree[a].r<l || tree[a].l>r) return; if(tree[a].l>=l && tree[a].r<=r){ update_node(flag,a,h); }else{ update_node(1,a*2,tree[a].minh); update_node(2,a*2,tree[a].maxh); update_node(1,a*2+1,tree[a].minh); update_node(2,a*2+1,tree[a].maxh); tree[a].maxh=INF; tree[a].minh=0; update(flag,a*2,l,r,h); update(flag,a*2+1,l,r,h); } } void finalupdate(int a){ if(tree[a].l==0 || a>=tn) return; update_node(1,a*2,tree[a].minh); update_node(2,a*2,tree[a].maxh); update_node(1,a*2+1,tree[a].minh); update_node(2,a*2+1,tree[a].maxh); tree[a].maxh=INF; tree[a].minh=0; finalupdate(a*2); finalupdate(a*2+1); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ int i; while(tn<n)tn*=2; for(i=tn;i<tn+n;i++) tree[i].l=i-tn+1,tree[i].r=i-tn+1; make_tree(1); for(i=0;i<k;i++){ update(op[i],1,left[i]+1,right[i]+1,height[i]); } finalupdate(1); for(i=tn;i<tn+n;i++) finalHeight[i-tn]=tree[i].maxh; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...