# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
411402 | jhwest2 | 벽 (IOI14_wall) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define va first
#define vb second
using namespace std;
typedef long long lint;
typedef pair<int, int> pint;
const int M = 2e6 + 10;
const int INF = 1e9 + 10;
int n, k, A[M];
struct SEG {
int T[M << 2][2], L[M << 2][2];
void init(int lo = 1, int hi = n, int idx = 1) {
L[idx][0] = L[idx][1] = INF;
if (lo == hi) return;
init(lo, lo + hi >> 1, idx << 1);
init(1 + (lo + hi >> 1), hi, idx << 1 | 1);
}
void push(int lo, int hi, int idx) {
for (int j = 0; j < 2; j++) {
int x = L[idx][j];
if (x == INF) continue;
if (x > 0) T[idx][j] = max(T[idx][j], x);
else T[idx][j] = min(T[idx][j], -x);
if (lo != hi) {
for (int i = idx << 1; i <= (idx << 1 | 1); i++) {
if (L[i][j] == INF) L[i][j] = x;
else if (x > 0 && L[i][j] <= 0 && -L[i][j] < x) {
if (T[i][j] >= x) L[i][j] = -x;
else L[i][j] = x;
}
else if (x <= 0 && L[i][j] > 0 && -x < L[i][j]) {
if (T[i][j] <= -x) L[i][j] = -x;
else L[i][j] = x;
}
else L[i][j] = max(L[i][j], x);
}
}
L[idx][j] = INF;
}
}
void update(int a, int b, int x, int lo = 1, int hi = n, int idx = 1) {
push(lo, hi, idx);
if (b < lo || a > hi) return;
if (a <= lo && hi <= b) {
L[idx][0] = L[idx][1] = x; push(lo, hi, idx); return;
}
update(a, b, x, lo, lo + hi >> 1, idx << 1);
update(a, b, x, 1 + (lo + hi >> 1), hi, idx << 1 | 1);
T[idx][0] = min(T[idx << 1][0], T[idx << 1 | 1][0]);
T[idx][1] = max(T[idx << 1][1], T[idx << 1 | 1][1]);
}
int query(int a, int lo = 1, int hi = n, int idx = 1) {
push(lo, hi, idx);
if (lo == hi) return T[idx][0];
if (a <= lo + hi >> 1) return query(a, lo, lo + hi >> 1, idx << 1);
else return query(a, 1 + (lo + hi >> 1), hi, idx << 1 | 1);
}
} S;
int main() {
cin.tie(0); ios_base::sync_with_stdio(0);
cin >> n >> k; S.init();
for (int i = 1; i <= k; i++) {
int op, l, r, h;
cin >> op >> l >> r >> h; ++l; ++r;
if (op == 1 && h != 0) S.update(l, r, h);
if (op == 2) S.update(l, r, -h);
}
for (int i = 1; i <= n; i++) {
cout << S.query(i) << '\n';
}
}