Submission #378100

#TimeUsernameProblemLanguageResultExecution timeMemory
378100ntabc05101Wall (IOI14_wall)C++14
100 / 100
976 ms92396 KiB
#ifndef LOCAL #define NDEBUG 1 #endif // LOCAL #include<bits/stdc++.h> const int max_n=2000000; int nodes[max_n<<2][2]; int L[max_n<<2], H[max_n<<2]; template<class U, class V> void maximize(U& a, V b) { if (a<b) a=b; } template<class U, class V> void minimize(U& a, V b) { if (a>b) a=b; } const int inf=1e9+9; void buildRange(int node, int low, int high) { L[node]=low, H[node]=high; if (low==high) { nodes[node][0]=0, nodes[node][1]=inf; return ; } int mid=low+high>>1; buildRange(node<<1, low, mid); buildRange(node<<1|1, mid+1, high); } void lazyPush(int node) { for (int j=2*node; j<2*node+2; ++j) { maximize(nodes[j][0], nodes[node][0]); maximize(nodes[j][1], nodes[j][0]); minimize(nodes[j][1], nodes[node][1]); minimize(nodes[j][0], nodes[j][1]); } nodes[node][0]=0; nodes[node][1]=inf; } void update(int node, int leftq, int rightq, int op, int height) { if (leftq<=L[node] and rightq>=H[node]) { if (op==1) { maximize(nodes[node][0], height); maximize(nodes[node][1], height); } else { minimize(nodes[node][0], height); minimize(nodes[node][1], height); } return ; } lazyPush(node); if (H[node<<1]>=leftq) update(node<<1, leftq, rightq, op, height); if (L[node<<1|1]<=rightq) update(node<<1|1, leftq, rightq, op, height); } void modify(int node, int finalHeight[]) { if (L[node]==H[node]) { finalHeight[H[node]-1]=nodes[node][0]; return ; } lazyPush(node); modify(node<<1, finalHeight); modify(node<<1|1, finalHeight); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { buildRange(1, 1, n); for (int i=0; i<k; ++i) { update(1, 1+left[i], 1+right[i], op[i], height[i]); } modify(1, finalHeight); } /* int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int n, k; std::cin>>n>>k; int op[k], left[k], right[k], height[k]; for (int i=0; i<k; ++i) { std::cin>>op[i]>>left[i]>>right[i]>>height[i]; } int finalHeight[n]; buildWall(n, k, op, left, right, height, finalHeight); for (int i=0; i<n; ++i) { std::cout<<finalHeight[i]<<" "; } std::cout<<std::endl; return 0; } */ /* 10 6 1 1 8 4 2 4 9 1 2 3 6 5 1 0 5 3 1 2 2 5 2 6 7 0 */

Compilation message (stderr)

wall.cpp: In function 'void buildRange(int, int, int)':
wall.cpp:23:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   23 |         int mid=low+high>>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...