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 | }; |