Skip to content

Commit d89d1f5

Browse files
Add files via upload
1 parent 3e7d1e0 commit d89d1f5

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
2+
------------------------------------------------
3+
4+
The following information needs to be associated with every node -
5+
6+
Maximum,
7+
Maximum two-sum.
8+
9+
For convenience, Max two-sum(leaf) = leaf.
10+
11+
------------------------------------------------------
12+
13+
Here's how it's built.
14+
15+
max(n) = max{ max(2n), max(2n + 1) }
16+
max sum(n) = max{ max sum(2n), max sum(2n + 1), max(2n), max(2n + 1) }
17+
18+
void build(int node, int start, int end)
19+
{
20+
if(start == end)
21+
{
22+
max_tree[node] = max_sum_tree[node] = element[start];
23+
return;
24+
}
25+
26+
int mid = (start + end)/2;
27+
28+
build(2*node, start, mid);
29+
build(2*node + 1, mid + 1, end);
30+
31+
max_tree[node] = max(max_tree[2*node], max_tree[2*node + 1]);
32+
max_sum_tree[node] = max_3(max_sum_tree[2*node], max_sum_tree[2*node + 1], max_tree[2*node] + max_tree[2*node + 1]);
33+
}
34+
35+
---------------------------------------
36+
37+
Now to run an update, just find your way to that node, and then update each parent of that node according to the above given relationships.
38+
39+
void update(int node, int start, int end, int index, int value)
40+
{
41+
if(start == end)
42+
{
43+
max_sum_tree[node] = max_tree[node] = element[index] = value;
44+
return;
45+
}
46+
47+
int mid = (start + end)/2;
48+
49+
if(start <= index && index <= mid)
50+
{
51+
update(2*node, start, mid, index, value);
52+
}
53+
else if(mid <= index && index <= end)
54+
{
55+
update(2*node + 1, mid + 1, end, index, value);
56+
}
57+
58+
max_tree[node] = max(max_tree[2*node], max_tree[2*node + 1]);
59+
max_sum_tree[node] = max_3(max_sum_tree[2*node], max_sum_tree[2*node + 1], max_tree[2*node] + max_tree[2*node + 1]);
60+
}
61+
62+
---------------------------------------------------------------------------------
63+
64+
Now, for a query, we need two functions. One to query max sum, one to query max.
65+
66+
For each node that we visit, check if it lies completely inside the interval, or completely outside.
67+
68+
If a node is completely inside the interval return max sum (node), since that is already compute.
69+
70+
If a node is partially in the interval -
71+
72+
1. Divide into left and right.
73+
2. query max(left), max(right), max sum(left) max sum(right)
74+
3. return max_3{ max(left) + max(right), max sum(left), max sum(right)}
75+
76+
Now, for querying max, again check if the node is completely in the interval and return max (node), as it is already computed.
77+
Otherwise, go left and right and return max{ max left, max right}
78+
79+
----------------------------------------------------------------------------------
80+
81+
int query_max(int node, int start, int end, int query_start, int query_end)
82+
{
83+
if(query_start > end || query_end < start)
84+
return 0;
85+
86+
if(query_start <= start && end <= query_end)
87+
{
88+
return max_tree[node];
89+
}
90+
91+
int mid = (start + end)/2;
92+
93+
int left_max = query_max(2*node, start, mid, query_start, query_end);
94+
int right_max = query_max(2*node + 1, mid + 1, end, query_start, query_end);
95+
96+
return max(left_max, right_max);
97+
}
98+
99+
int query(int node, int start, int end, int query_start, int query_end)
100+
{
101+
if(query_start > end || query_end < start)
102+
return 0;
103+
104+
if(query_start <= start && end <= query_end)
105+
return max_sum_tree[node];
106+
107+
int mid = (start + end)/2;
108+
109+
int left_max = query_max(2*node, start, mid, query_start, query_end);
110+
int right_max = query_max(2*node + 1, mid + 1, end, query_start, query_end);
111+
112+
int left_answer = query(2*node, start, mid, query_start, query_end);
113+
int right_answer = query(2*node + 1, mid + 1, end, query_start, query_end);
114+
115+
return max_3(left_answer, right_answer, left_max + right_max);
116+
}

0 commit comments

Comments
 (0)