1
+ /*
2
+ ROJS 2017 Remove Update
3
+ - Apply all updates using a lazy segtree, and then try undo each one
4
+ and querying the range max
5
+ - Complexity: O(Q log N)
6
+ */
7
+
8
+ #include < bits/stdc++.h>
9
+ typedef long long ll;
10
+ using namespace std ;
11
+
12
+ struct Query { int a, b, v; } queries[100001 ];
13
+
14
+ int n, q, segtree[400001 ], lazy[400001 ];
15
+
16
+ void push_lazy (int node, int l, int r) {
17
+ segtree[node] += lazy[node];
18
+ if (l != r) {
19
+ lazy[node * 2 ] += lazy[node];
20
+ lazy[node * 2 + 1 ] += lazy[node];
21
+ }
22
+ lazy[node] = 0 ;
23
+ }
24
+
25
+ void update (int a, int b, int v, int node = 1 , int l = 1 , int r = n) {
26
+ push_lazy (node, l, r);
27
+ if (l > b || r < a) return ;
28
+ if (l >= a && r <= b) {
29
+ lazy[node] = v;
30
+ push_lazy (node, l, r);
31
+ } else {
32
+ int mid = (l + r) / 2 ;
33
+ update (a, b, v, node * 2 , l, mid);
34
+ update (a, b, v, node * 2 + 1 , mid + 1 , r);
35
+ segtree[node] = max (segtree[node * 2 ], segtree[node * 2 + 1 ]);
36
+ }
37
+ }
38
+
39
+ int main () {
40
+ ios_base::sync_with_stdio (0 );
41
+ cin.tie (0 );
42
+ cin >> n >> q;
43
+ for (int i = 0 ; i < q; i++) {
44
+ cin >> queries[i].a >> queries[i].b >> queries[i].v ;
45
+ update (queries[i].a , queries[i].b , queries[i].v );
46
+ }
47
+ int ans = INT_MAX;
48
+ for (int i = 0 ; i < q; i++) {
49
+ update (queries[i].a , queries[i].b , -queries[i].v );
50
+ ans = min (ans, segtree[1 ]);
51
+ update (queries[i].a , queries[i].b , queries[i].v );
52
+ }
53
+ cout << ans;
54
+ return 0 ;
55
+ }
0 commit comments