| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 586548 | LastRonin | Wall (IOI14_wall) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define f first
#define s second
#define ll long long
#define mp make_pair
const int N = 5e5 + 10;
ll K;
struct seg {
ll t[4 * N] = {0};
ll t2[4 * N] = {0};
void upd1(ll p, ll z, ll v = 1, ll tl = 1, ll tr = K) {
if(tl == tr) {
t[v] = z;
return;
}
ll m = (tl + tr) >> 1ll;
if(p <= m)upd1(p, z, v * 2, tl, m);
else upd1(p, z, v * 2 + 1, m + 1, tr);
t[v] = max(t[v * 2], t[v * 2 + 1]);
}
void upd2(ll p, ll z, ll v = 1, ll tl = 1, ll tr = K) {
if(tl == tr) {
t2[v] = z;
return;
}
ll m = (tl + tr) >> 1ll;
if(p <= m)upd2(p, z, v * 2, tl, m);
else upd2(p, z, v * 2 + 1, m + 1, tr);
t2[v] = min(t2[v * 2], t2[v * 2 + 1]);
}
ll get(ll x, ll y, ll v = 1, ll tl = 1, ll tr = K) {
if(tl == tr) {
if(y == t2[v])return x;
else return y;
}
ll m = (tl + tr) >> 1ll;
ll a = max(x, t[v * 2 + 1]);
ll b = min(y, t2[v * 2 + 1]);
if(a >= b)
return get(x, y, v * 2 + 1, m + 1, tr);
return get(a, b, v * 2, tl, m);
}
} rt;
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
vector<int> g[n + 1];
K = k;
for(int i = 0; i < k; i++) {
g[left[i]].pb(i);
g[right[i] + 1].pb(i);
rt.upd2(i + 1, 1e9);
rt.upd1(i + 1, 0);
}
for(int i = 0; i < n; i++) {
// cout << i << "\n";
for(auto u : g[i]) {
if(left[u] == i) {
if(op[u] == 1) rt.upd1(u + 1, height[u]);
if(op[u] == 2) rt.upd2(u + 1, height[u]);
// cout << "+ " << u << "\n";
} else {
// cout << "- " << u << "\n";
if(op[u] == 1) rt.upd1(u + 1, 0);
if(op[u] == 2) rt.upd2(u + 1, 1e9);
}
}
//if(i == 3)cout << "________________________";
finalHeight[i] = rt.get(0, 1e9);
//if(i == 3)cout << "________________________";
}
return;
}
int main()
{
int n;
int k;
int i, j;
int status = 0;
status = scanf("%d%d", &n, &k);
assert(status == 2);
int* op = (int*)calloc(sizeof(int), k);
int* left = (int*)calloc(sizeof(int), k);
int* right = (int*)calloc(sizeof(int), k);
int* height = (int*)calloc(sizeof(int), k);
int* finalHeight = (int*)calloc(sizeof(int), n);
for (i = 0; i < k; i++){
status = scanf("%d%d%d%d", &op[i], &left[i], &right[i], &height[i]);
assert(status == 4);
}
buildWall(n, k, op, left, right, height, finalHeight);
for (j = 0; j < n; j++)
printf("%d\n", finalHeight[j]);
return 0;
}
/*
10 3
1 3 4 91220
1 5 9 48623
2 3 5 39412
*/
