Submission #1062897

#TimeUsernameProblemLanguageResultExecution timeMemory
1062897YassirSalamaWall (IOI14_wall)C++17
32 / 100
3095 ms23632 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int maxn = 2e6 + 100; struct Node{ int min; int max; int smin; int smax; } tree[4*maxn]; void pull(int node){ //for min tree[node].min=min(tree[node*2].min,tree[node*2+1].min); if(tree[node*2].min==tree[node*2+1].min){ tree[node].smin=min(tree[node*2].smin,tree[node*2+1].smin); }else if(tree[node*2].min==tree[node].min){ tree[node].smin=min(tree[node*2].smin,tree[node*2+1].min); }else tree[node].smin=min(tree[node*2+1].smin,tree[node*2].min); //for max tree[node].max=max(tree[node*2].max,tree[node*2+1].max); if(tree[node*2].max==tree[node*2+1].max){ tree[node].smax=max(tree[node*2].smax,tree[node*2+1].max); }else if(tree[node*2].max==tree[node].max){ tree[node].smax=max(tree[node*2].smax,tree[node*2+1].max); }else tree[node].smax=max(tree[node*2+1].smax,tree[node*2].max); } void build(int node,int l,int r){ if(l==r){ tree[node].min=tree[node].max=0; tree[node].smin=1e9; tree[node].smax=-1e9; return; } int mid=(l+r)/2; build(node*2,l,mid); build(node*2+1,mid+1,r); pull(node); } void pmin(int node,int l,int r,int x){ if(tree[node].max<=x) return; tree[node].max=x; if(l==r){ tree[node].min=tree[node].max; }else{ if(x<=tree[node].min){ tree[node].min=x; }else if(x<tree[node].smin){ tree[node].smin=x; } } } void pmax(int node,int l,int r,int x){ if(tree[node].min>=x) return; tree[node].min=x; if(l==r){ tree[node].max=tree[node].min; }else{ if(x>=tree[node].max){ tree[node].max=x; }else if(x>tree[node].smax){ tree[node].smax=x; } } } void push(int node,int l,int r){ if(l==r) return; pmin(node*2,l,(l+r)/2,tree[node].max); pmin(node*2+1,(l+r)/2+1,r,tree[node].max); pmax(node*2,l,(l+r)/2,tree[node].min); pmax(node*2+1,(l+r)/2+1,r,tree[node].min); } void setmin(int node,int l,int r,int ql,int qr,int x){ push(node,l,r); if(l>qr||r<ql||tree[node].max<=x) return; if(ql<=l&&r<=qr&&tree[node].smax<x){ //put tag pmin(node,l,r,x); return; } push(node,l,r); int mid=(l+r)/2; setmin(node*2,l,mid,ql,qr,x); setmin(node*2+1,mid+1,r,ql,qr,x); pull(node); } void setmax(int node,int l,int r,int ql,int qr,int x){ push(node,l,r); if(l>qr||r<ql||tree[node].min>=x) return; if(ql<=l&&r<=qr&&x<tree[node].smin){ //put tag pmax(node,l,r,x); return; } push(node,l,r); int mid=(l+r)/2; setmax(node*2,l,mid,ql,qr,x); setmax(node*2+1,mid+1,r,ql,qr,x); pull(node); } int query(int node,int l,int r,int ql){ push(node,l,r); if(l==r) return tree[node].min; int mid = (l+r)/2; if(ql<=mid) return query(node*2,l,mid,ql); else return query(node*2+1,mid+1,r,ql); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int ans[]) { Node* root=new Node(); build(1,0,n-1); for(int i=0;i<k;i++){ int t=op[i]; int l=left[i]; int r=right[i]; int x=height[i]; if(t==1){ setmax(1,0,n-1,l,r,x); }else{ setmin(1,0,n-1,l,r,x); } } for(int i=0;i<n;i++){ ans[i]=query(1,0,n-1,i); } return; }

Compilation message (stderr)

wall.cpp: In function 'void buildWall(int, int, int*, int*, int*, int*, int*)':
wall.cpp:110:9: warning: unused variable 'root' [-Wunused-variable]
  110 |   Node* root=new Node();
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...