Submission #349281

#TimeUsernameProblemLanguageResultExecution timeMemory
349281parsabahramiWall (IOI14_wall)C++17
100 / 100
1040 ms100976 KiB
// Call my Name and Save me from The Dark
#include <bits/stdc++.h>
#include "wall.h"

using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
 
#define SZ(x)                       (int) x.size()
#define F                           first
#define S                           second
#define lc                          id << 1
#define rc                          lc | 1

const int N = 2e6 + 10;
int mx[N << 2], mn[N << 2], lz[N << 2], _n, k;

void shift(int id, int l, int r) {
    if (lz[id] < 0) return;
    mx[id] = mn[id] = lz[id];
    if (r - l > 1) {
        lz[lc] = lz[rc] = lz[id];
    }
    lz[id] = -1;
}

void setmin(int ql, int qr, int x, int id = 1, int l = 0, int r = _n) {
    shift(id, l, r);
    if (qr <= l || r <= ql || mx[id] <= x) return;
    if (ql <= l && r <= qr && mn[id] >= x) {
        lz[id] = x; 
        return shift(id, l, r);
    }  
    int mid = (l + r) >> 1;
    setmin(ql, qr, x, lc, l, mid);
    setmin(ql, qr, x, rc, mid, r);
    mn[id] = min(mn[lc], mn[rc]);
    mx[id] = max(mx[lc], mx[rc]);
}

void setmax(int ql, int qr, int x, int id = 1, int l = 0, int r = _n) {
    shift(id, l, r);
    if (qr <= l || r <= ql || mn[id] >= x) return;
    if (ql <= l && r <= qr && mx[id] <= x) {
        lz[id] = x; 
        return shift(id, l, r);
    }  
    int mid = (l + r) >> 1;
    setmax(ql, qr, x, lc, l, mid);
    setmax(ql, qr, x, rc, mid, r);
    mn[id] = min(mn[lc], mn[rc]);
    mx[id] = max(mx[lc], mx[rc]);
}

int print(int pos, int id = 1, int l = 0, int r = _n) {
    shift(id, l, r);
    if (r - l < 2) {
        return mx[id];
    }
    int mid = (l + r) >> 1;
    if (pos < mid) return print(pos, lc, l, mid);
    else return print(pos, rc, mid, r);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
	memset(lz, -1, sizeof lz);
    _n = n;
    for (int i = 0; i < k; i++) {
        int t = op[i], l = left[i], r = right[i], h = height[i];
        if (t == 1) setmax(l, r + 1, h);
        else setmin(l, r + 1, h);
    }
    for (int i = 0; i < n; i++) finalHeight[i] = print(i);
    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...