#include "wall.h"
#include <bits/stdc++.h>
//#define respagold ios_base::sync_with_stdio(0), cin.tie(0);
//#define int long long
#define ll long long
#define int2 __int128_t
#define FOR( i, x, n, d ) for( int i = x; i <= n; i += d )
#define FORR( i, x, n, d ) for( int i = x; i >= n; i -= d )
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x.size())
#define pb push_back
#define pf push_front
#define ins insert
#define lb lower_bound
#define ub upper_bound
#define pii pair <int, int>
#define ppi pair <pair <int, int>, int>
#define pip pair <int, pair <int, int>>
#define mkp make_pair
using namespace std;
const int N = 2e6 + 12;
const int inf = 2e9;
const int mod = 1e9 + 7;
const double eps = 1e-20;
int n, m, x, y, a[N], ans[N];
struct node
{
int mx1, mx2, mxc, mn1, mn2, mnc;
};
node t[4 * N];
node merge( node a, node b )
{
node res; int x1 = a.mx1, x2 = a.mx2, x3 = b.mx1, x4 = b.mx2;
if( x1 > x3 ) res.mx1 = x1, res.mxc = a.mxc, res.mx2 = max( x2, x3 );
else if( x1 < x3 ) res.mx1 = x3, res.mxc = b.mxc, res.mx2 = max( x1, x4 );
else res.mx1 = x1, res.mx2 = max(x2, x4), res.mxc = a.mxc + b.mxc;
x1 = a.mn1, x2 = a.mn2, x3 = b.mn1, x4 = b.mn2;
if( x1 < x3 ) res.mn1 = x1, res.mnc = a.mnc, res.mn2 = min( x2, x3 );
else if( x1 > x3 ) res.mn1 = x3, res.mnc = b.mnc, res.mn2 = min( x1, x4 );
else res.mn1 = x1, res.mn2 = min(x2, x4), res.mnc = a.mnc + b.mnc;
return res;
}
void build( int v = 1, int tl = 1, int tr = n )
{
if( tl == tr )
{
t[v].mx2 = -inf, t[v].mn2 = inf;
t[v].mx1 = t[v].mn1 = a[tl];
t[v].mxc = t[v].mnc = 1;
return;
}
int tm = tl + tr >> 1;
build( v + v, tl, tm );
build( v + v + 1, tm + 1, tr );
t[v] = merge(t[v + v], t[v + v + 1]);
}
void pushmax( int v, int tl, int tr, int x )
{
if( x >= t[v].mx1 ) return;
if( t[v].mn1 == t[v].mx1 ) t[v].mn1 = x;
if( t[v].mn2 == t[v].mx1 ) t[v].mn2 = x;
t[v].mx1 = x;
}
void pushmin( int v, int tl, int tr, int x )
{
if( x <= t[v].mn1 ) return;
if( t[v].mx1 == t[v].mn1 ) t[v].mx1 = x;
if( t[v].mx2 == t[v].mn1 ) t[v].mx2 = x;
t[v].mn1 = x;
}
void pushdown( int v, int tl, int tr )
{
if( tl == tr ) return;
int tm = tl + tr >> 1;
pushmax(v + v, tl, tm, t[v].mx1);
pushmax(v + v + 1, tm + 1, tr, t[v].mx1);
pushmin(v + v, tl, tm, t[v].mn1);
pushmin(v + v + 1, tm + 1, tr, t[v].mn1);
}
void update_min( int l, int r, int x, int v = 1, int tl = 1, int tr = n )
{
if( tl > r || l > tr || x >= t[v].mx1 ) return;
if( l <= tl && tr <= r && x > t[v].mx2 ) {pushmax(v, tl, tr, x); return;}
int tm = tl + tr >> 1;
pushdown(v, tl, tr);
update_min(l, r, x, v + v, tl, tm);
update_min(l, r, x, v + v + 1, tm + 1, tr);
t[v] = merge(t[v + v], t[v + v + 1]);
}
void update_max( int l, int r, int x, int v = 1, int tl = 1, int tr = n )
{
if( tl > r || l > tr || x <= t[v].mn1 ) return;
if( l <= tl && tr <= r && x < t[v].mn2 ) {pushmin(v, tl, tr, x); return;}
int tm = tl + tr >> 1;
pushdown(v, tl, tr);
update_max(l, r, x, v + v, tl, tm);
update_max(l, r, x, v + v + 1, tm + 1, tr);
t[v] = merge(t[v + v], t[v + v + 1]);
}
void get( int v = 1, int tl = 1, int tr = n )
{
pushdown(v, tl, tr);
if( tl == tr )
{
ans[tl] = t[v].mx1;
return;
}
int tm = tl + tr >> 1;
get(v + v, tl, tm);
get(v + v + 1, tm + 1, tr);
}
void buildWall( int N, int M, int op[], int left[], int right[], int height[], int finalHeight[] )
{
n = N, m = M;
FOR( i, 1, n, 1 ) a[i] = 0;
build();
FOR( i, 0, m - 1, 1 )
{
int tp = op[i], l = left[i], r = right[i]; x = height[i];
if( tp == 1 ) update_max(l + 1, r + 1, x);
if( tp == 2 ) update_min(l + 1, r + 1, x);
}
get();
FOR( i, 0, n - 1, 1 ) finalHeight[i] = ans[i + 1];
}/*
signed main()
{
respagold
int test = 1;
if( !test ) cin >> test;
while( test -- ) solve();
}*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |