-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathupdateQuery-SGR.cpp
More file actions
59 lines (59 loc) · 1.79 KB
/
updateQuery-SGR.cpp
File metadata and controls
59 lines (59 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
//#define INF 1e9
using namespace std;
void buildTree(vector<int> &a, vector<int> &segtree, int left, int right, int index)
{
if (left == right)
{
segtree[index] = a[left];
return;
}
int mid = (left + right) / 2;
buildTree(a, segtree, left, mid, 2 * index + 1);
buildTree(a, segtree, mid + 1, right, 2 * index + 2);
segtree[index] = segtree[2 * index + 1]+ segtree[2 * index + 2];
}
void updateQuery(vector<int> &segtree, vector<int> &a, int left, int right, int index, int pos, int value)
{
if (pos < left || right < pos)
return;
if (left == right)
{
a[pos] = value;
segtree[index] = value;
return;
}
int mid = (right + left) / 2;
if (pos <= mid)
updateQuery(segtree, a, left, mid, 2 * index + 1, pos, value);
else
updateQuery(segtree, a, mid + 1, right, 2 * index + 2, pos, value);
segtree[index] = segtree[2 * index + 1]+ segtree[2 * index + 2];
}
int sumRange(vector<int> &segtree, int left, int right, int from, int to, int index)
{
if (from <= left && to >= right)
{
return segtree[index];
}
if (from > right || to < left)
return 0;
int mid = (left + right) / 2;
return sumRange(segtree, left, mid, from, to, 2 * index + 1)+ sumRange(segtree, mid + 1, right, from, to, 2 * index + 2);
}
int main()
{
vector<int> a = {5, -7, 9, 1, -2, 8, 3, 6, 4, 1};
int n = a.size();
int h = (int)ceil(log2(n));
int sizetree = 2 * (int)pow(2, h) - 1;
vector<int> segtree(sizetree, 0);
buildTree(a, segtree, 0, n - 1, 0);
int fromRange = 2;
int toRange = 7;
updateQuery(segtree, a, 0, n - 1, 0, 4, 9);
cout << sumRange(segtree, 0, n - 1, fromRange, toRange, 0);
}