Submission #554674

#TimeUsernameProblemLanguageResultExecution timeMemory
554674Soumya1Wall (IOI14_wall)C++17
100 / 100
773 ms98168 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int mxN = 2e6 + 5; struct Node { int mx = -1e9, mn = 1e9; Node() { } Node(int a, int b) { mn = a, mx = b; } } t[4 * mxN]; void push(int x, Node v) { if (t[x].mn >= v.mn && v.mn >= t[x].mx) { t[x].mn = v.mn; } else if (v.mn < t[x].mx) { t[x] = Node(v.mn, v.mn); } if (t[x].mn >= v.mx && v.mx >= t[x].mx) { t[x].mx = v.mx; } else if (v.mx > t[x].mn) { t[x] = Node(v.mx, v.mx); } } void propagate(int x, int lx, int rx) { if (lx == rx) return; push(x << 1, t[x]); push(x << 1 | 1, t[x]); t[x] = Node(1e9, -1e9); } void update(int x, int lx, int rx, int l, int r, Node v) { if (t[x].mx != -1e9 || t[x].mn != 1e9) propagate(x, lx, rx); if (l > rx || lx > r) return; if (l <= lx && r >= rx) { push(x, v); return; } int mx = (lx + rx) >> 1; update(x << 1, lx, mx, l, r, v); update(x << 1 | 1, mx + 1, rx, l, r, v); } int query(int x, int lx, int rx, int i) { if (t[x].mx != -1e9 || t[x].mn != 1e9) propagate(x, lx, rx); if (lx == rx) { return max(t[x].mx, min(t[x].mn, 0)); } int mx = (lx + rx) >> 1; if (i <= mx) return query(x << 1, lx, mx, i); return query(x << 1 | 1, mx + 1, rx, i); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ for (int i = 0; i < k; i++) { Node v = Node(1e9, height[i]); if (op[i] == 2) v = Node(height[i], -1e9); update(1, 1, n, left[i] + 1, right[i] + 1, v); } for (int i = 0; i < n; i++) { finalHeight[i] = query(1, 1, n, i + 1); } 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...