#include "wall.h"
#include<bits/stdc++.h>
using namespace std;
int BASE;
struct Node
{
int mn , mx;
};
vector<Node> tree , lazy;
void build(int n)
{
while(__builtin_popcount(BASE) != 1)
BASE++;
tree.assign(2*BASE , {(int)1e9 , (int)-1e9});
lazy.assign(2*BASE , {(int)1e9 , -1});
for(int i = 0 ; i < n ; i++)
{
tree[i + BASE].mx = tree[i + BASE].mn = 0;
}
for(int i = BASE - 1 ; i >= 1 ; i--)
{
tree[i].mn = min(tree[2*i].mn , tree[2*i + 1].mn);
tree[i].mx = max(tree[2*i].mx , tree[2*i + 1].mx);
}
}
void propagate(int node)
{
if(lazy[node].mn != 1e9)
{
for(int i = 2*node ; i <= 2*node + 1 ; i++)
{
lazy[i].mn = min(lazy[i].mn , lazy[node].mn);
lazy[i].mx = min(lazy[i].mx , lazy[node].mn);
tree[i].mn = min(tree[i].mn , lazy[node].mn);
tree[i].mx = min(tree[i].mx , lazy[node].mn);
}
lazy[node].mn = 1e9;
}
if(lazy[node].mx != -1)
{
for(int i = 2 * node ; i <= 2*node + 1 ; i++)
{
lazy[i].mx = max(lazy[i].mx , lazy[node].mx);
tree[i].mx = max(tree[i].mx , lazy[node].mx);
lazy[i].mn = max(lazy[i].mn , lazy[node].mx);
tree[i].mn = max(tree[i].mn , lazy[node].mx);
}
lazy[node].mx = -1;
}
}
void minimize(int node , int s , int e , int l , int r , int val)
{
int m = (s + e)/2;
if(l <= s && e <= r)
{
if(tree[node].mx <= val)
return ;
if(tree[node].mn >= val)
{
tree[node].mx = val;
lazy[node].mx = val;
tree[node].mn = val;
lazy[node].mn = val;
}
else
{
propagate(node);
minimize(2*node , s , m , l , r , val);
minimize(2*node + 1 , m + 1 , e , l , r , val);
tree[node].mx = max(tree[2*node].mx , tree[2*node + 1].mx);
tree[node].mn = min(tree[2*node].mn , tree[2*node+ 1].mn);
}
return ;
}
if(s > r || l > e)
return ;
propagate(node);
minimize(2*node , s , m , l , r , val);
minimize(2*node + 1 , m + 1 , e , l , r , val);
tree[node].mx = max(tree[2*node].mx , tree[2*node + 1].mx);
tree[node].mn = min(tree[2*node].mn , tree[2*node+ 1].mn);
}
void maximize(int node , int s , int e , int l , int r , int val)
{
int m = (s + e)/2;
if(l <= s && e <= r)
{
if(tree[node].mn >= val)
return ;
if(tree[node].mx <= val)
{
tree[node].mx = val;
lazy[node].mx = val;
tree[node].mn = val;
lazy[node].mn = val;
}
else
{
propagate(node);
maximize(2*node , s , m , l , r , val);
maximize(2*node + 1 , m + 1 , e , l , r , val);
tree[node].mx = max(tree[2*node].mx , tree[2*node + 1].mx);
tree[node].mn = min(tree[2*node].mn , tree[2*node+ 1].mn);
}
return ;
}
if(s > r || l > e)
return ;
propagate(node);
maximize(2*node , s , m , l , r , val);
maximize(2*node + 1 , m + 1 , e , l , r , val);
tree[node].mx = max(tree[2*node].mx , tree[2*node + 1].mx);
tree[node].mn = min(tree[2*node].mn , tree[2*node+ 1].mn);
}
void maximize(int l , int r , int val)
{
maximize(1 , 0 , BASE - 1 , l , r , val);
}
void minimize(int l , int r , int val)
{
minimize(1 , 0 , BASE - 1 , l , r ,val);
}
int query(int node , int s , int e , int i)
{
if(s == e)
{
return tree[node].mn;
}
int m = (s + e)/2;
propagate(node);
if(s <= i && i <= m)
{
return query(2*node , s , m , i);
}
else
return query(2*node + 1, m + 1 , e , i);
}
int query(int i)
{
return query(1 , 0 , BASE - 1 , i);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
BASE = n;
build(n);
for(int i = 0 ; i < k ; i++)
{
if(op[i] == 1)
{
maximize(left[i] , right[i] , height[i]);
}
else
{
minimize(left[i] , right[i] , height[i]);
}
}
for(int i = 0 ; i < n ; i++)
{
finalHeight[i] = query(i);
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
572 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
6 ms |
1216 KB |
Output is correct |
5 |
Correct |
5 ms |
1116 KB |
Output is correct |
6 |
Correct |
4 ms |
1116 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
85 ms |
13900 KB |
Output is correct |
3 |
Correct |
112 ms |
8524 KB |
Output is correct |
4 |
Correct |
363 ms |
22380 KB |
Output is correct |
5 |
Correct |
235 ms |
23376 KB |
Output is correct |
6 |
Correct |
206 ms |
21844 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
2 ms |
348 KB |
Output is correct |
4 |
Correct |
6 ms |
1116 KB |
Output is correct |
5 |
Correct |
4 ms |
1164 KB |
Output is correct |
6 |
Correct |
4 ms |
1144 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
91 ms |
13904 KB |
Output is correct |
9 |
Correct |
125 ms |
8532 KB |
Output is correct |
10 |
Correct |
345 ms |
22356 KB |
Output is correct |
11 |
Correct |
217 ms |
23376 KB |
Output is correct |
12 |
Correct |
208 ms |
21840 KB |
Output is correct |
13 |
Correct |
0 ms |
348 KB |
Output is correct |
14 |
Correct |
90 ms |
13908 KB |
Output is correct |
15 |
Correct |
30 ms |
2528 KB |
Output is correct |
16 |
Correct |
579 ms |
22748 KB |
Output is correct |
17 |
Correct |
221 ms |
22100 KB |
Output is correct |
18 |
Correct |
220 ms |
22148 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
2 ms |
348 KB |
Output is correct |
3 |
Correct |
2 ms |
348 KB |
Output is correct |
4 |
Correct |
6 ms |
1116 KB |
Output is correct |
5 |
Correct |
4 ms |
1200 KB |
Output is correct |
6 |
Correct |
4 ms |
1144 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
85 ms |
13880 KB |
Output is correct |
9 |
Correct |
127 ms |
8784 KB |
Output is correct |
10 |
Correct |
344 ms |
22356 KB |
Output is correct |
11 |
Correct |
206 ms |
23376 KB |
Output is correct |
12 |
Correct |
214 ms |
21920 KB |
Output is correct |
13 |
Correct |
0 ms |
344 KB |
Output is correct |
14 |
Correct |
91 ms |
13908 KB |
Output is correct |
15 |
Correct |
29 ms |
2644 KB |
Output is correct |
16 |
Correct |
584 ms |
22592 KB |
Output is correct |
17 |
Correct |
221 ms |
22124 KB |
Output is correct |
18 |
Correct |
222 ms |
22168 KB |
Output is correct |
19 |
Correct |
659 ms |
102240 KB |
Output is correct |
20 |
Correct |
719 ms |
99940 KB |
Output is correct |
21 |
Correct |
683 ms |
102248 KB |
Output is correct |
22 |
Correct |
670 ms |
99912 KB |
Output is correct |
23 |
Correct |
694 ms |
99844 KB |
Output is correct |
24 |
Correct |
713 ms |
99920 KB |
Output is correct |
25 |
Correct |
687 ms |
99728 KB |
Output is correct |
26 |
Correct |
681 ms |
102292 KB |
Output is correct |
27 |
Correct |
683 ms |
102484 KB |
Output is correct |
28 |
Correct |
655 ms |
99768 KB |
Output is correct |
29 |
Correct |
680 ms |
99920 KB |
Output is correct |
30 |
Correct |
696 ms |
99780 KB |
Output is correct |