SHOW:
|
|
- or go back to the newest paste.
1 | const int N = 1 << 20; | |
2 | ||
3 | struct seg_tree { | |
4 | int t[N * 2 + 228]; | |
5 | int mod[N * 2 + 228]; | |
6 | ||
7 | seg_tree() { | |
8 | ||
9 | } | |
10 | ||
11 | void build(vector<int> a) { | |
12 | fill(t, t + N * 2, INF); | |
13 | for (int i = 0; i < a.size(); ++i) { | |
14 | t[i + N] = a[i]; | |
15 | } | |
16 | for (int i = N - 1; i >= 0; --i) { | |
17 | t[i] = min(t[i * 2], t[i * 2 + 1]); | |
18 | } | |
19 | } | |
20 | ||
21 | void chg(int i, int v) { | |
22 | i += N; | |
23 | t[i] = v; | |
24 | while (i != 1) { | |
25 | // t[i >> 1] = t[i] + t[i ^ 1]; | |
26 | i >>= 1; | |
27 | t[i] = min(t[i * 2], t[i * 2 + 1]); | |
28 | } | |
29 | } | |
30 | ||
31 | void push(int i, int len) { | |
32 | if (mod[i] != -1) { | |
33 | if (i < N) { | |
34 | mod[i * 2] = mod[i]; | |
35 | mod[i * 2 + 1] = mod[i]; | |
36 | } | |
37 | t[i] = mod[i]; | |
38 | mod[i] = -1; | |
39 | } | |
40 | } | |
41 | ||
42 | int get(int i, int L, int R, int Ln, int Rn) { | |
43 | push(i, R - L); | |
44 | if (Ln <= L && R <= Rn) { | |
45 | return t[i]; | |
46 | } | |
47 | if (Rn <= L || R <= Ln) { | |
48 | return INF; | |
49 | } | |
50 | int M = (L + R) >> 1; | |
51 | return min(get(i * 2, L, M, Ln, Rn), | |
52 | get(i * 2 + 1, M, R, Ln, Rn)); | |
53 | } | |
54 | ||
55 | int find(int i, int L, int R, int Ln, int Rn, int val) { | |
56 | push(i, R - L); | |
57 | if (Rn <= L || R <= Ln || t[i] >= val) return -1; | |
58 | if (R - L == 1) return L; | |
59 | int M = (L + R) >> 1; | |
60 | int ans = find(i * 2, L, M, Ln, Rn, val); | |
61 | if (ans == -1) { | |
62 | ans = find(i * 2 + 1, M, R, Ln, Rn, val); | |
63 | } | |
64 | return ans; | |
65 | } | |
66 | ||
67 | void chg(int i, int L, int R, int Ln, int Rn, int d) { | |
68 | if (Ln <= L && R <= Rn) { | |
69 | mod[i] = d; | |
70 | push(i, R - L); | |
71 | return; | |
72 | } | |
73 | push(i, R - L); | |
74 | if (Rn <= L || R <= Ln) { | |
75 | return; | |
76 | } | |
77 | int M = (L + R) >> 1; | |
78 | chg(i * 2 , L, M, Ln, Rn, d); | |
79 | chg(i * 2 + 1, M, R, Ln, Rn, d); | |
80 | t[i] = min(t[i * 2], t[i * 2 + 1]); | |
81 | } | |
82 | }; |