zjwz • 3个月前
#include <iostream>
#define N 2000005
#define ls rt<<1 //左子树
#define rs rt<<1|1 //右子树
#define INF 0x3f3f3f3f
using namespace std;
int n, m;
int Max[N << 2], Min[N << 2]; //懒标记
void solve1(int rt, int h) { //Max标记传递 ,rt节点编号,h传递值
if (Min[rt] < h)
Min[rt] = h; //Min比h小,更新Min
if (Max[rt] < h)
Max[rt] = h; //连Max都比h小,更新Max
}
void solve2(int rt, int h) {
if (Max[rt] > h)
Max[rt] = h;
if (Min[rt] > h)
Min[rt] = h;
}
void push_down(int rt) {
solve1(ls, Max[rt]);
solve1(rs, Max[rt]);
solve2(ls, Min[rt]);
solve2(rs, Min[rt]);
Max[rt] = 0;
Min[rt] = INF;
}
void update(int l, int r, int rt, int L, int R, int k, bool tag) {
if (L <= l && r <= R) {
if (tag == 0)
solve1(rt, k);
else
solve2(rt, k);
return ;
}
int mid = (l + r) >> 1;
push_down(rt);
if (L <= mid)
update(l, mid, ls, L, R, k, tag);
if (R > mid)
update(mid + 1, r, rs, L, R, k, tag);
}
void Query(int l, int r, int rt) {
if (l == r) {//依次输出 叶节点的Max和Min是一样的
printf("%d\n", Max[rt]);
return;
}
int mid = (l + r) >> 1;
push_down(rt);//释放懒标记,更新值
Query(l, mid, ls);
Query(mid + 1, r, rs);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n << 2; ++i)
Min[i] = INF;
for (int i = 1; i <= m; ++i) {
int L, R, h, t; //修改区间[L,R],修改值h,和操作t
scanf("%d%d%d%d", &t, &L, &R, &h);
update(1, n, 1, L + 1, R + 1, h, t - 1);
}
Query(1, n, 1);
return 0;
}
using namespace std; int n, m;
int Max[N << 2], Min[N << 2]; //懒标记 void solve1(int rt, int h) { //Max标记传递 ,rt节点编号,h传递值
if (Min[rt] < h)
Min[rt] = h; //Min比h小,更新Min
if (Max[rt] < h)
Max[rt] = h; //连Max都比h小,更新Max
}
void solve2(int rt, int h) {
if (Max[rt] > h)
Max[rt] = h;
if (Min[rt] > h)
Min[rt] = h;
}
void push_down(int rt) {
solve1(ls, Max[rt]);
solve1(rs, Max[rt]);
solve2(ls, Min[rt]);
solve2(rs, Min[rt]);
Max[rt] = 0;
Min[rt] = INF;
}
void update(int l, int r, int rt, int L, int R, int k, bool tag) {
if (L <= l && r <= R) {
if (tag == 0)
solve1(rt, k);
else
solve2(rt, k);
return ;
}
int mid = (l + r) >> 1;
push_down(rt);
if (L <= mid)
update(l, mid, ls, L, R, k, tag);
if (R > mid)
update(mid + 1, r, rs, L, R, k, tag);
}
void Query(int l, int r, int rt) {
if (l == r) {//依次输出 叶节点的Max和Min是一样的
printf("%d\n", Max[rt]);
return;
}
int mid = (l + r) >> 1;
push_down(rt);//释放懒标记,更新值
Query(l, mid, ls);
Query(mid + 1, r, rs);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n << 2; ++i)
Min[i] = INF;
for (int i = 1; i <= m; ++i) {
int L, R, h, t; //修改区间[L,R],修改值h,和操作t
scanf("%d%d%d%d", &t, &L, &R, &h);
update(1, n, 1, L + 1, R + 1, h, t - 1);
}
Query(1, n, 1);
return 0;
}
评论:
请先登录,才能进行评论