1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| #include <bits/stdc++.h>
#include <cstdio>
using namespace std;
class SegmentTree {
private:
struct TreeNode {
int l,r,lc,rc,mx;
priority_queue<int> tg;
};
vector<TreeNode> arr;
int siz = 0;
void __del(int u,int l,int r,int k) {
if(arr[u].mx < k) return;
if(!arr[u].tg.empty() && arr[u].tg.top() == k) {
arr[u].tg.pop();
if(arr[u].l < l)
insert(1,arr[u].l,l - 1,k);
if(r < arr[u].r)
insert(1,r + 1,arr[u].r,k);
arr[u].mx = max(arr[arr[u].lc].mx,arr[arr[u].rc].mx);
if(!arr[u].tg.empty()) arr[u].mx = max(arr[u].mx,arr[u].tg.top());
} else {
int mid = (arr[u].l + arr[u].r) / 2;
if(l <= mid) __del(arr[u].lc,l,r,k);
if(mid < r) __del(arr[u].rc,l,r,k);
arr[u].mx = max(arr[arr[u].lc].mx,arr[arr[u].rc].mx);
if(!arr[u].tg.empty()) arr[u].mx = max(arr[u].mx,arr[u].tg.top());
}
}
int init(int l,int r) {
int u = ++siz;
arr[u].l = l;
arr[u].r = r;
arr[u].mx = -1;
arr[u].tg.push(-1);
if(l == r) {
return u;
}
int mid = (l + r) / 2;
arr[u].lc = init(l,mid);
arr[u].rc = init(mid + 1,r);
return u;
}
public:
void build(int n) {
arr.resize(2 * n + 5);
init(1,n);
arr[0] = {0,0,0,0,-1,{}};
}
void insert(int u,int l,int r,int k) {
if(l <= arr[u].l && arr[u].r <= r) {
arr[u].tg.push(k);
arr[u].mx = max(arr[u].mx,arr[u].tg.top());
return;
}
int mid = (arr[u].l + arr[u].r) / 2;
if(l <= mid) insert(arr[u].lc,l,r,k);
if(mid < r) insert(arr[u].rc,l,r,k);
arr[u].mx = max(arr[arr[u].lc].mx,arr[arr[u].rc].mx);
if(!arr[u].tg.empty())
arr[u].mx = max(arr[u].mx,arr[u].tg.top());
}
int query(int u,int l,int r) {
if(l <= arr[u].l && arr[u].r <= r) {
return arr[u].mx;
}
int mid = (arr[u].l + arr[u].r) / 2;
int ans = (arr[u].tg.empty() ? -1 : arr[u].tg.top());
if(l <= mid) ans = max(ans,query(arr[u].lc,l,r));
if(mid < r) ans = max(ans,query(arr[u].rc,l,r));
return ans;
}
void del(int u,int l,int r) {
int qq = query(u,l,r);
if(qq != -1) __del(u,l,r,qq);
}
} sg;
int main() {
ios::sync_with_stdio(0);cin.tie(0);
int n,m;
cin >> n >> m;
sg.build(200000);
int op,l,r,k;
while(m--) {
cin >> op;
if(op == 1) {
cin >> l >> r >> k;
sg.insert(1, l, r, k);
} else if(op == 2) {
cin >> l >> r;
sg.del(1, l, r);
} else {
cin >> l >> r;
int qq = sg.query(1, l, r);
cout << qq << '\n';
}
}
return 0;
}
|