Submission #309244

#TimeUsernameProblemLanguageResultExecution timeMemory
309244jainbot27Wall (IOI14_wall)C++17
0 / 100
283 ms8184 KiB
#include <bits/stdc++.h> // #include "wall.h" using namespace std; #define f first #define s second #define pb push_back #define ar array #define all(x) x.begin(), x.end() #define siz(x) (int)x.size() #define FOR(x, y, z) for(int x = (y); x < (z); x++) #define ROF(x, z, y) for(int x = (y-1); x >= (z); x--) #define F0R(x, z) FOR(x, 0, z) #define R0F(x, z) ROF(x, 0, z) #define trav(x, y) for(auto&x:y) using ll = long long; using vi = vector<int>; using vl = vector<long long>; using pii = pair<int, int>; using vpii = vector<pair<int, int>>; template<class T> inline bool ckmin(T&a, T b) {return b < a ? a = b, 1 : 0;} template<class T> inline bool ckmax(T&a, T b) {return b > a ? a = b, 1 : 0;} mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const char nl = '\n'; const int mxN = 2e5 + 10; const int MOD = 1e9 + 7; const long long infLL = 1e18; using node = ll; using lzy = pair<ll, ll>; struct lazy{ int size; vector<lzy> operations; vector<node> vals; const lzy NEUTRAL_ELEMENT = {1, infLL}; const lzy NO_OPERATION = {-69, -69}; void propogate(int x, int lx, int rx){ if(operations[x] == NO_OPERATION) return; if(operations[x].f == 0) ckmax(vals[x], operations[x].s); else ckmin(vals[x], operations[x].s); if(rx - lx == 1) return; if(operations[2*x+1].f == 0) ckmax(vals[2*x+1], operations[2*x+1].s); else if(operations[2*x+1].f == 1)ckmin(vals[x*2+1], operations[2*x+1].s); if(operations[2*x+2].f == 0) ckmax(vals[2*x+2], operations[2*x+2].s); else if(operations[2*x+2].f == 1) ckmin(vals[x*2+2], operations[2*x+2].s); operations[2*x+1] = operations[x]; operations[2*x+2] = operations[x]; operations[x] = NO_OPERATION; } void init(int n){ size = 1; while(size < n) size *= 2; operations.assign(2 * size, NO_OPERATION); vals.assign(2 * size, 0); // build(0, 0, size); } void update(int l, int r, lzy v, int x, int lx, int rx){ propogate(x, lx, rx); if(lx >= r || l >= rx) return; if(lx >= l && rx <= r){ operations[x] = v; propogate(x, lx, rx); return; } int m = (lx + rx)/2; update(l, r, v, 2 * x + 1, lx , m); update(l, r, v, 2 * x + 2, m , rx); } void update(int l, int r, lzy v){ update(l, r, v, 0, 0, size); } node query(int l, int x, int lx, int rx){ propogate(x, lx, rx); if(lx + 1 == rx){ assert(lx == l); return vals[x]; } int m = (lx + rx)/2; if(l < m) return query(l, 2 * x + 1, lx, m); else return query(l, 2 * x + 2, m, rx); } node query(int r){ return query(r, 0, 0, size); } } st; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalheight[]){ st.init(n); F0R(i, k){ st.update(left[i], right[i]+1, {op[i]-1, height[i]}); // F0R(j, n){ // cout << st.query(j, j + 1) << nl; // } // cout << "NEW\n"; } F0R(i, n){ finalheight[i] = st.query(i); } return; } // int main(){ // int n, k; // cin >> n >> k; // vi op(k), left(k), right(k), height(k), finalheight(n, 0); // F0R(i, k) { // cin >> left[i] >> right[i] >> height[i] >> op[i]; // } // buildWall(n, k, op, left, right, height, finalheight); // F0R(i, n){ // cout << finalheight[i] << " "; // } // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...