#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i, l, r) for(int i = l; i <= r; i++)
#define FORD(i, l, r) for(int i = l; i >= r; i--)
#define db double
#define ldb long double
#define all_1(x) (x).begin() + 1, (x).end()
#define all(x) (x).begin(), (x).end()
#define ins insert
#define pb push_back
template<typename T>void debug_var(const T& var, const string& name){
cerr << name << ": " << var << "\n";
}
template<typename T>void debug_1d(const T& vt, const string& name){
if(vt.empty()){
cerr << name << " is empty!\n";
return;
}
FOR(i, 0, (int)vt.size() - 1){
cerr << name << "[" << i << "]: " << vt[i] << "\n";
}
}
struct node{
int maxi, mini;
node(){
maxi = 0;
mini = 2e9;
}
};
struct segment_tree{
int _n;
vector<node> _st;
segment_tree(int n = 0){
init(n);
}
void init(int n){
_n = n;
_st.assign(4 * _n + 5, node());
}
void apply(int i, int low, int high) {
_st[i].mini = max(_st[i].mini, low);
_st[i].maxi = max(_st[i].maxi, low);
_st[i].maxi = min(_st[i].maxi, high);
_st[i].mini = min(_st[i].mini, high);
}
void down(int i) {
int cl = (i << 1), cr = (cl | 1);
apply(cl, _st[i].mini, _st[i].maxi);
apply(cr, _st[i].mini, _st[i].maxi);
_st[i].mini = 0;
_st[i].maxi = 2e9;
}
void update_chmax(int i, int l, int r, int u, int v, int val){
if(l > v || r < u) return;
//add bricks
if(l >= u && r <= v){
_st[i].maxi = max(_st[i].maxi, val);
_st[i].mini = max(_st[i].mini, val);
return;
}
down(i);
int m = (l + r) >> 1, cl = (i << 1), cr = (cl | 1);
update_chmax(cl, l, m, u, v, val);
update_chmax(cr, m + 1, r, u, v, val);
}
void update_chmin(int i, int l, int r, int u, int v, int val){
if(l > v || r < u) return;
//add bricks
if(l >= u && r <= v){
_st[i].maxi = min(_st[i].maxi, val);
_st[i].mini = min(_st[i].mini, val);
return;
}
down(i);
int m = (l + r) >> 1, cl = (i << 1), cr = (cl | 1);
update_chmin(cl, l, m, u, v, val);
update_chmin(cr, m + 1, r, u, v, val);
}
void build_ans(int i, int l, int r, vector<int>& res){
if(l == r){
res[l - 1] = min(_st[i].maxi, _st[i].mini);
return;
}
int m = (l + r) >> 1, cl = (i << 1), cr = (cl | 1);
down(i);
build_ans(cl, l, m, res);
build_ans(cr, m + 1, r, res);
}
};
void buildWall(int n, int k, vector<int> op, vector<int> left, vector<int> right, vector<int> height, vector<int>& finalHeight){
segment_tree st(n + 5);
finalHeight.assign(n, 0);
FOR(i, 0, k - 1){
if(op[i] == 1) st.update_chmax(1, 1, n, left[i] + 1, right[i] + 1, height[i]);
else st.update_chmin(1, 1, n, left[i] + 1, right[i] + 1, height[i]);
}
st.build_ans(1, 1, n, finalHeight);
}
/*
void solve(){
int n = 10, k = 6;
vector<int> op = {1, 2, 2, 1, 1, 2};
vector<int> left = {1, 4, 3, 0, 2, 6};
vector<int> right = {8, 9, 6, 5, 2, 7};
vector<int> height = {4, 1, 5, 3, 5, 0};
vector<int> res;
buildWall(n, k, op, left, right, height, res);
for(int i : res) cout << i << " ";
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
while(t--){
solve();
}
return 0;
}
*/