不知道哪里错了,样例没过
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
const ll inf = 2147483647;
struct stree
{
ll left, right;
ll maxv, minv;
ll uval, umax = inf, umin = -inf;
}tree[2000002];
ll n, k;
void change(ll k, ll uval, ll umax, ll umin)
{
if(uval != 0)
{
tree[k].uval = uval;
tree[k].umax = inf;
tree[k].umin = -inf;
tree[k].maxv = tree[k].minv = uval;
}
else if(tree[k].uval != 0)
{
if(tree[k].uval < umin && umin != 0)
{
tree[k].uval = umin;
}
else if(tree[k].uval > umax && umax != 0)
{
tree[k].uval = umax;
}
}
else
{
if(umax < tree[k].umin)
{
tree[k].umax = inf;
tree[k].umin = -inf;
tree[k].uval = umax;
}
else if(umin > tree[k].umax)
{
tree[k].umax = inf;
tree[k].umin = -inf;
tree[k].uval = umin;
}
else
{
tree[k].umax = min(tree[k].umax, umax);
tree[k].umin = max(tree[k].umin, umin);
}
tree[k].umax = min(tree[k].umax, umax);
tree[k].umin = max(tree[k].umin, umin);
}
}
void pushdown(ll k)
{
change(2 * k, tree[k].uval, tree[k].umax, tree[k].umin);
change(2 * k + 1, tree[k].uval, tree[k].umax, tree[k].umin);
tree[k].uval = 0;
tree[k].umax = inf;
tree[k].umin = -inf;
}
void build(ll l, ll r, ll k)
{
tree[k].left = l;
tree[k].right = r;
if(l == r)
return ;
ll mid = l + r >> 1;
build(l, mid, 2 * k);
build(mid + 1, r, 2 * k + 1);
return ;
}
void updatemax(ll l, ll r, ll k, ll v)
{
if(tree[k].left >= l && tree[k].right <= r)
{
tree[k].umax = min(tree[k].umax, v);
if(tree[k].umax <= tree[k].umin)
{
tree[k].uval = tree[k].umax;
tree[k].umax = inf;
tree[k].umin = -inf;
}
return ;
}
pushdown(k);
ll mid = tree[k].left + tree[k].right >> 1;
if(l <= mid)
updatemax(l, r, 2 * k, v);
if(r > mid)
updatemax(l, r, 2 * k + 1, v);
return ;
}
void updatemin(ll l, ll r, ll k, ll v)
{
if(tree[k].left >= l && tree[k].right <= r)
{
tree[k].umin = max(tree[k].umin, v);
if(tree[k].umin >= tree[k].umax)
{
tree[k].uval = tree[k].umin;
tree[k].umax = inf;
tree[k].umin = -inf;
}
return ;
}
pushdown(k);
ll mid = tree[k].left + tree[k].right >> 1;
if(l <= mid)
updatemin(l, r, 2 * k, v);
if(r > mid)
updatemin(l, r, 2 * k + 1, v);
return ;
}
void query()
{
ll cnt = 0;
for(int i = 1; cnt <= n && i <= 4 * n; i++)
{
if(tree[i].left == tree[i].right)
cout << tree[i].maxv << "\n", cnt++;
else
pushdown(i);
}
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
build(1, n, 1);
while(k--)
{
ll op, l, r, h;
cin >> op >> l >> r >> h;
l++;
r++;
if(op == 1)
updatemin(l, r, 1, h);
if(op == 2)
updatemax(l, r, 1, h);
}
query();
return 0;
}