@@ -19,107 +19,107 @@ public int maximumSumSubsequence(int[] nums, int[][] queries) {
19
19
}
20
20
return ans ;
21
21
}
22
- }
23
22
24
- class SegTree {
25
- private static class Record {
26
- int takeFirstTakeLast ;
27
- int takeFirstSkipLast ;
28
- int skipFirstSkipLast ;
29
- int skipFirstTakeLast ;
30
-
31
- public Integer getMax () {
32
- return Stream .of (
33
- this .takeFirstSkipLast ,
34
- this .takeFirstTakeLast ,
35
- this .skipFirstSkipLast ,
36
- this .skipFirstTakeLast )
37
- .max (Integer ::compare )
38
- .orElse (null );
23
+ static class SegTree {
24
+ private static class Record {
25
+ int takeFirstTakeLast ;
26
+ int takeFirstSkipLast ;
27
+ int skipFirstSkipLast ;
28
+ int skipFirstTakeLast ;
29
+
30
+ public Integer getMax () {
31
+ return Stream .of (
32
+ this .takeFirstSkipLast ,
33
+ this .takeFirstTakeLast ,
34
+ this .skipFirstSkipLast ,
35
+ this .skipFirstTakeLast )
36
+ .max (Integer ::compare )
37
+ .orElse (null );
38
+ }
39
+
40
+ public Integer skipLast () {
41
+ return Stream .of (this .takeFirstSkipLast , this .skipFirstSkipLast )
42
+ .max (Integer ::compare )
43
+ .orElse (null );
44
+ }
45
+
46
+ public Integer takeLast () {
47
+ return Stream .of (this .skipFirstTakeLast , this .takeFirstTakeLast )
48
+ .max (Integer ::compare )
49
+ .orElse (null );
50
+ }
39
51
}
40
52
41
- public Integer skipLast () {
42
- return Stream .of (this .takeFirstSkipLast , this .skipFirstSkipLast )
43
- .max (Integer ::compare )
44
- .orElse (null );
45
- }
53
+ private static Record [] seg ;
54
+ private final int [] nums ;
46
55
47
- public Integer takeLast () {
48
- return Stream .of (this .skipFirstTakeLast , this .takeFirstTakeLast )
49
- .max (Integer ::compare )
50
- .orElse (null );
56
+ public SegTree (int [] nums ) {
57
+ this .nums = nums ;
58
+ seg = new Record [4 * nums .length ];
59
+ for (int i = 0 ; i < 4 * nums .length ; ++i ) {
60
+ seg [i ] = new Record ();
61
+ }
62
+ build (0 , nums .length - 1 , 0 );
51
63
}
52
- }
53
-
54
- private static Record [] seg ;
55
- private final int [] nums ;
56
64
57
- public SegTree (int [] nums ) {
58
- this .nums = nums ;
59
- seg = new Record [4 * nums .length ];
60
- for (int i = 0 ; i < 4 * nums .length ; ++i ) {
61
- seg [i ] = new Record ();
65
+ private void build (int i , int j , int k ) {
66
+ if (i == j ) {
67
+ seg [k ].takeFirstTakeLast = nums [i ];
68
+ return ;
69
+ }
70
+ int mid = (i + j ) >> 1 ;
71
+ build (i , mid , 2 * k + 1 );
72
+ build (mid + 1 , j , 2 * k + 2 );
73
+ merge (k );
62
74
}
63
- build (0 , nums .length - 1 , 0 );
64
- }
65
75
66
- private void build (int i , int j , int k ) {
67
- if (i == j ) {
68
- seg [k ].takeFirstTakeLast = nums [i ];
69
- return ;
76
+ // merge [2*k+1, 2*k+2] into k
77
+ private static void merge (int k ) {
78
+ seg [k ].takeFirstSkipLast =
79
+ Math .max (
80
+ seg [2 * k + 1 ].takeFirstSkipLast + seg [2 * k + 2 ].skipLast (),
81
+ seg [2 * k + 1 ].takeFirstTakeLast + seg [2 * k + 2 ].skipFirstSkipLast );
82
+
83
+ seg [k ].takeFirstTakeLast =
84
+ Math .max (
85
+ seg [2 * k + 1 ].takeFirstSkipLast + seg [2 * k + 2 ].takeLast (),
86
+ seg [2 * k + 1 ].takeFirstTakeLast + seg [2 * k + 2 ].skipFirstTakeLast );
87
+
88
+ seg [k ].skipFirstTakeLast =
89
+ Math .max (
90
+ seg [2 * k + 1 ].skipFirstSkipLast + seg [2 * k + 2 ].takeLast (),
91
+ seg [2 * k + 1 ].skipFirstTakeLast + seg [2 * k + 2 ].skipFirstTakeLast );
92
+
93
+ seg [k ].skipFirstSkipLast =
94
+ Math .max (
95
+ seg [2 * k + 1 ].skipFirstSkipLast + seg [2 * k + 2 ].skipLast (),
96
+ seg [2 * k + 1 ].skipFirstTakeLast + seg [2 * k + 2 ].skipFirstSkipLast );
70
97
}
71
- int mid = (i + j ) >> 1 ;
72
- build (i , mid , 2 * k + 1 );
73
- build (mid + 1 , j , 2 * k + 2 );
74
- merge (k );
75
- }
76
98
77
- // merge [2*k+1, 2*k+2] into k
78
- private static void merge (int k ) {
79
- seg [k ].takeFirstSkipLast =
80
- Math .max (
81
- seg [2 * k + 1 ].takeFirstSkipLast + seg [2 * k + 2 ].skipLast (),
82
- seg [2 * k + 1 ].takeFirstTakeLast + seg [2 * k + 2 ].skipFirstSkipLast );
83
-
84
- seg [k ].takeFirstTakeLast =
85
- Math .max (
86
- seg [2 * k + 1 ].takeFirstSkipLast + seg [2 * k + 2 ].takeLast (),
87
- seg [2 * k + 1 ].takeFirstTakeLast + seg [2 * k + 2 ].skipFirstTakeLast );
88
-
89
- seg [k ].skipFirstTakeLast =
90
- Math .max (
91
- seg [2 * k + 1 ].skipFirstSkipLast + seg [2 * k + 2 ].takeLast (),
92
- seg [2 * k + 1 ].skipFirstTakeLast + seg [2 * k + 2 ].skipFirstTakeLast );
93
-
94
- seg [k ].skipFirstSkipLast =
95
- Math .max (
96
- seg [2 * k + 1 ].skipFirstSkipLast + seg [2 * k + 2 ].skipLast (),
97
- seg [2 * k + 1 ].skipFirstTakeLast + seg [2 * k + 2 ].skipFirstSkipLast );
98
- }
99
-
100
- // child -> parent
101
- public void update (int idx , int val ) {
102
- int i = 0 ;
103
- int j = nums .length - 1 ;
104
- int k = 0 ;
105
- update (idx , val , k , i , j );
106
- }
107
-
108
- private static void update (int idx , int val , int k , int i , int j ) {
109
- if (i == j ) {
110
- seg [k ].takeFirstTakeLast = val ;
111
- return ;
99
+ // child -> parent
100
+ public void update (int idx , int val ) {
101
+ int i = 0 ;
102
+ int j = nums .length - 1 ;
103
+ int k = 0 ;
104
+ update (idx , val , k , i , j );
112
105
}
113
- int mid = (i + j ) >> 1 ;
114
- if (idx <= mid ) {
115
- update (idx , val , 2 * k + 1 , i , mid );
116
- } else {
117
- update (idx , val , 2 * k + 2 , mid + 1 , j );
106
+
107
+ private static void update (int idx , int val , int k , int i , int j ) {
108
+ if (i == j ) {
109
+ seg [k ].takeFirstTakeLast = val ;
110
+ return ;
111
+ }
112
+ int mid = (i + j ) >> 1 ;
113
+ if (idx <= mid ) {
114
+ update (idx , val , 2 * k + 1 , i , mid );
115
+ } else {
116
+ update (idx , val , 2 * k + 2 , mid + 1 , j );
117
+ }
118
+ merge (k );
118
119
}
119
- merge (k );
120
- }
121
120
122
- public int getMax () {
123
- return seg [0 ].getMax ();
121
+ public int getMax () {
122
+ return seg [0 ].getMax ();
123
+ }
124
124
}
125
125
}
0 commit comments