Submission #297637

#TimeUsernameProblemLanguageResultExecution timeMemory
297637juckterWall (IOI14_wall)C++14
100 / 100
990 ms224740 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int INF = 1e9; struct node { int l, r, mx, mn; node *left, *right; void compose(int _mx, int _mn) { if(_mx > mn) mn = _mx; if(_mn < mx) mx = _mn; mx = max(mx, _mx); mn = min(mn, _mn); } void push() { left->compose(mx, mn); right->compose(mx, mn); mx = 0; mn = INF; } node(int l, int r) : l(l), r(r), mx(0), mn(INF) { if(l < r) { int m = (l + r) / 2; left = new node(l, m); right = new node(m + 1, r); } } void upd(int rl, int rr, int mn, int mx) { if(rr < l || r < rl) return; if(rl <= l && r <= rr) { compose(mx, mn); return; } push(); left->upd(rl, rr, mn, mx); right->upd(rl, rr, mn, mx); } void trav(int* fi) { if(l == r) fi[l] = mx; else { push(); left->trav(fi); right->trav(fi); } } }; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ node tree(0, n - 1); for(int i = 0; i < k; i++) { if(op[i] == 1) tree.upd(left[i], right[i], INF, height[i]); else tree.upd(left[i], right[i], height[i], 0); } tree.trav(finalHeight); 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...