Submission #553634

#TimeUsernameProblemLanguageResultExecution timeMemory
553634keta_tsimakuridzeWall (IOI14_wall)C++14
100 / 100
993 ms99392 KiB
#include <bits/stdc++.h> #include "wall.h" using namespace std; const int N = 2e6 + 5, inf = 1e9; struct node{ int l, r; } lazy[4 * N]; void down(node &a, node b) { if(a.l >= b.r) { a = {b.r, b.r}; return; } if(a.r <= b.l) { a = {b.l, b.l}; return; } a.l = max(a.l, b.l); a.r = min(a.r, b.r); assert(a.l <= a.r); } void push(int u, int l,int r) { if(lazy[u].l == 0 && lazy[u].r == inf) return; if(l == r) return; down(lazy[2 * u], lazy[u]); down(lazy[2 * u + 1], lazy[u]); lazy[u] = {0, inf}; } void upd(int u, int st, int en, int l,int r, int v, int t) { push(u, l, r); if(l > en || r < st) return; if(st <= l && r <= en) { if(l == r) { if(!t) { lazy[u].l = max(lazy[u].l, v); lazy[u].r = max(lazy[u].r, v); } else { lazy[u].l = min(lazy[u].l, v); lazy[u].r = min(lazy[u].r, v); } return; } if(!t) lazy[u].l = v; else lazy[u].r = v; push(u, l, r); return; } int mid = (l + r) >> 1; upd(2 * u, st, en, l, mid, v, t); upd(2 * u + 1,st, en, mid + 1, r, v,t); } int get(int u,int ind, int l,int r){ push(u, l, r); if(l == r) return lazy[u].l; int mid = (l + r) / 2; if(ind <= mid) return get(2 * u, ind, l, mid); else return get(2 * u + 1, ind, mid + 1, r); } void buildWall(int n, int k, int op[], int l[], int r[], int h[], int ih[]){ for(int i = 1; i <= 4 * n; i++) lazy[i] = {0, inf}; --n; for(int i = 0; i < k; i++) { upd(1, l[i], r[i], 0, n, h[i], --op[i]); } for(int i = 0; i <= n; i++) { ih[i] = get(1, i, 0, n); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...