Skip to content

Commit 2f24e10

Browse files
committed
Solution as on 05-08-2022 10:00 pm
1 parent c26400f commit 2f24e10

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
class NumArray
2+
{
3+
public:
4+
int arr[100005], seg[100005 * 4]; // for segment Tree
5+
vector<int> ans;
6+
7+
void build(int ind, int low, int high)
8+
{
9+
if (high == low)
10+
{
11+
seg[ind] = arr[low];
12+
return;
13+
}
14+
int mid = (low + high) / 2;
15+
build(2 * ind + 1, low, mid);
16+
build(2 * ind + 2, mid + 1, high);
17+
18+
// find max in range
19+
// seg[ind] = max(seg[2 * ind + 1],seg[2 * ind + 2]);
20+
21+
// find sum in range
22+
seg[ind] = seg[2 * ind + 1] + seg[2 * ind + 2];
23+
}
24+
25+
int query(int ind, int low, int high, int l, int r)
26+
{
27+
if (low >= l && high <= r) // [ 1 - 1 ]
28+
return seg[ind];
29+
30+
if (high < l || low > r)
31+
// return INT_MIN; ( when we doing for max)
32+
return 0;
33+
34+
int mid = (low + high) / 2;
35+
int left = query(2 * ind + 1, low, mid, l, r);
36+
int right = query(2 * ind + 2, mid + 1, high, l, r);
37+
// return max(left, right);
38+
return left + right;
39+
}
40+
41+
void updateSeg(int idx, int low, int high, int index, int val)
42+
{
43+
// no overlap
44+
if (index < low || index > high)
45+
return;
46+
47+
// total overlap
48+
if (low == high)
49+
{
50+
if (low == index)
51+
seg[idx] = val;
52+
return;
53+
}
54+
55+
// partial overlap
56+
int mid = (low + high) / 2;
57+
updateSeg(2 * idx + 1, low, mid, index, val); // low child
58+
updateSeg(2 * idx + 2, mid + 1, high, index, val); // high child
59+
seg[idx] = seg[2 * idx + 1] + seg[2 * idx + 2];
60+
}
61+
62+
NumArray(vector<int> &nums)
63+
{
64+
ans = nums;
65+
for (int i = 0; i < nums.size(); ++i)
66+
arr[i] = nums[i];
67+
build(0, 0, nums.size() - 1);
68+
}
69+
70+
void update(int index, int val)
71+
{
72+
updateSeg(0, 0, ans.size() - 1, index, val);
73+
}
74+
75+
int sumRange(int left, int right)
76+
{
77+
return query(0, 0, ans.size() - 1, left, right);
78+
}
79+
};
80+
81+
/**
82+
* Your NumArray object will be instantiated and called as such:
83+
* NumArray* obj = new NumArray(nums);
84+
* obj->update(index,val);
85+
* int param_2 = obj->sumRange(left,right);
86+
*/
87+
88+
// Another Approach
89+
90+
class NumArray
91+
{
92+
public:
93+
vector<int> ans;
94+
int sum = 0;
95+
NumArray(vector<int> &nums)
96+
{
97+
sum = 0;
98+
ans = nums;
99+
for (int i = 0; i < nums.size(); ++i)
100+
{
101+
sum += nums[i];
102+
}
103+
}
104+
105+
void update(int index, int val)
106+
{
107+
sum -= ans[index];
108+
ans[index] = val;
109+
sum += val;
110+
}
111+
112+
int sumRange(int left, int right)
113+
{
114+
int res = sum;
115+
116+
for (int i = 0; i < left; ++i)
117+
{
118+
res -= ans[i];
119+
}
120+
for (int i = right + 1; i < ans.size(); ++i)
121+
{
122+
res -= ans[i];
123+
}
124+
125+
return res;
126+
}
127+
};

0 commit comments

Comments
 (0)