View difference between Paste ID: 534GY5a3 and 9kA0DTUX
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
};