1+ /* *
2+ * @file 6183.cpp
3+ * @author Macesuted (i@macesuted.moe)
4+ * @date 2025-07-28
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #ifndef LOCAL
14+ #define endl ' \n '
15+ #endif
16+
17+ bool mem1;
18+
19+ #define maxn 1000005
20+ #define maxc 55
21+
22+ struct Node {
23+ int l, r, minv;
24+ Node (void ) { l = r = 0 , minv = 1e9 ; }
25+ } a[10000005 ];
26+ int pcnt = 1 ;
27+ int newNode (void ) { return a[pcnt] = Node (), pcnt++; }
28+
29+ class SegmentTree {
30+ private:
31+ int root;
32+
33+ void pushUp (int p) {
34+ a[p].minv = 1e9 ;
35+ if (a[p].l ) a[p].minv = min (a[p].minv , a[a[p].l ].minv );
36+ if (a[p].r ) a[p].minv = min (a[p].minv , a[a[p].r ].minv );
37+ return ;
38+ }
39+
40+ void update (int &p, int l, int r, int x, int y) {
41+ if (!p) p = newNode ();
42+ if (l == r) return a[p].minv = min (a[p].minv , y), void ();
43+ int mid = (l + r) >> 1 ;
44+ x <= mid ? update (a[p].l , l, mid, x, y) : update (a[p].r , mid + 1 , r, x, y);
45+ return pushUp (p);
46+ }
47+ int query (int p, int l, int r, int ql, int qr) {
48+ if (!p) return 1e9 ;
49+ if (ql <= l && r <= qr) return a[p].minv ;
50+ int mid = (l + r) >> 1 ;
51+ if (qr <= mid) return query (a[p].l , l, mid, ql, qr);
52+ if (ql > mid) return query (a[p].r , mid + 1 , r, ql, qr);
53+ return min (query (a[p].l , l, mid, ql, qr), query (a[p].r , mid + 1 , r, ql, qr));
54+ }
55+
56+ public:
57+ void reset (void ) { root = newNode (); }
58+ void update (int x, int y) { return update (root, 1 , 1e6 , y, x); }
59+ bool query (int x, int yl, int yr) { return query (root, 1 , 1e6 , yl, yr) <= x; }
60+ } SGT[maxc];
61+
62+ void solve (void ) {
63+ int op;
64+ while (cin >> op) {
65+ if (op == 0 ) {
66+ pcnt = 1 ;
67+ for (int c = 0 ; c <= 50 ; c++) SGT[c].reset ();
68+ } else if (op == 1 ) {
69+ int x, y, c;
70+ cin >> x >> y >> c;
71+ SGT[c].update (x, y);
72+ } else if (op == 2 ) {
73+ int x, yl, yr;
74+ cin >> x >> yl >> yr;
75+ int ans = 0 ;
76+ for (int c = 0 ; c <= 50 ; c++) ans += SGT[c].query (x, yl, yr);
77+ cout << ans << endl;
78+ } else
79+ return ;
80+ }
81+ return ;
82+ }
83+
84+ bool mem2;
85+
86+ int main () {
87+ ios::sync_with_stdio (false ), cin.tie (nullptr );
88+ #ifdef LOCAL
89+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
90+ #endif
91+
92+ int _ = 1 ;
93+ while (_--) solve ();
94+
95+ #ifdef LOCAL
96+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
97+ #endif
98+ return 0 ;
99+ }
0 commit comments