11/* *
2- * Description: Segment Tree with custom merge function.
3- * Usage: construct O(N), query O(lg(N)), update O(lg(N))
4- * Source: https://github.com/dragonslayerx
2+ * Description: Segment Tree with custom merge function.
3+ * Usage: construct O(N), query O(lg(N)), update O(lg(N))
4+ * Source: https://github.com/dragonslayerx
55 */
66
77#include < iostream>
@@ -18,20 +18,23 @@ struct node {
1818 sum = prefix = suffix = 0 ;
1919 maxs = INF;
2020 }
21- node (int a, int b, int c, int d) {
22- assign (a, b, c, d);
21+
22+ node (int sum, int maxs, int prefix, int suffix) {
23+ setNode (sum, maxs, prefix, suffix);
2324 }
24- void assign (int a, int b, int c, int d)
25- {
26- sum = a, maxs = b, prefix = c, suffix = d;
25+
26+ void setNode (int sum, int maxs, int prefix, int suffix){
27+ this ->sum =sum;
28+ this ->maxs =maxs;
29+ this ->prefix =prefix;
30+ this ->suffix =suffix;
2731 }
2832};
2933
3034int a[MAX];
3135node st[4 *MAX];
3236
33- node merge (node left, node right)
34- {
37+ node merge (node left, node right){
3538 node t;
3639 t.prefix = max (left.prefix , left.sum +right.prefix );
3740 t.suffix = max (right.suffix , right.sum +left.suffix );
@@ -42,10 +45,9 @@ node merge(node left, node right)
4245 return t;
4346}
4447
45- node construct (int n, int ll, int rl)
46- {
48+ node construct (int n, int ll, int rl){
4749 if (ll == rl) {
48- st[n].assign (a[ll], a[ll], a[ll], a[ll]);
50+ st[n].setNode (a[ll], a[ll], a[ll], a[ll]);
4951 } else {
5052 node left = construct (2 *n+1 , ll, (ll+rl)/2 );
5153 node right = construct (2 *n+2 , (ll+rl)/2 +1 , rl);
@@ -54,10 +56,9 @@ node construct(int n, int ll, int rl)
5456 return st[n];
5557}
5658
57- node query (int n, int ll, int rl, int x, int y)
58- {
59+ node query (int n, int ll, int rl, int x, int y){
5960 int mid = (ll+rl)/2 ;
60- if (x == ll && y == rl) return st[n];
61+ if (x== ll && y== rl) return st[n];
6162 else if (y <= mid) return query (2 *n+1 , ll, mid, x, y);
6263 else if (x > mid) return query (2 *n+2 , mid+1 , rl, x, y);
6364 else {
@@ -67,16 +68,15 @@ node query(int n, int ll, int rl, int x, int y)
6768 }
6869}
6970
70- node update (int n, int ll, int rl, int x, int color)
71- {
72- if (x < ll || x > rl) return st[n];
73- if (x == ll && x == rl) {
74- st[n].assign (// --Do everything Here--//);
71+ node update (int n, int ll, int rl, int p, int val){
72+ if (p < ll || p > rl) return st[n];
73+ if (p == ll && p == rl) {
74+ st[n].setNode (val, val, val, val);
7575 return st[n];
7676 } else {
7777 int mid = (ll+rl)/2 ;
78- node left = update (2 *n+1 , ll, (ll+rl)/2 , x, color );
79- node right = update (2 *n+2 , (ll+rl)/2 +1 , rl, x, color );
78+ node left = update (2 *n+1 , ll, (ll+rl)/2 , p, val );
79+ node right = update (2 *n+2 , (ll+rl)/2 +1 , rl, p, val );
8080 st[n] = merge (left, right);
8181 }
8282 return st[n];
@@ -86,8 +86,7 @@ int main()
8686{
8787 int n;
8888 scanf (" %d" , &n);
89- for (int i = 0 ; i < n; i++)
90- scanf (" %d" , a+i);
89+ for (int i = 0 ; i < n; i++) scanf (" %d" , a+i);
9190 construct (0 , 0 , n-1 );
9291 int q;
9392 scanf (" %d" , &q);
0 commit comments