Skip to content

Commit 4078961

Browse files
committed
Segment Trees
1 parent 97ea982 commit 4078961

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed

15.Segment Tree/RangeMinQuery.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/* Amit Bansal - @amitbansal7 */
2+
#include <bits/stdc++.h>
3+
#include <string>
4+
#define lli long long int
5+
#define llu unsigned long long int
6+
#define S(x) scanf("%d",&x)
7+
#define Sl(x) scanf("%lld",&x)
8+
#define Mset(p,i) memset(p,i,sizeof(p))
9+
#define mlc(t,n) (t *)malloc(sizeof(t)*n)
10+
#define NIL -1
11+
#define INF INT_MAX
12+
#define TC int testcase; S(testcase); while(testcase--)
13+
#define Pi 3.14159
14+
using namespace std;
15+
16+
void UpdateQuery(int STree[],int low,int high,int pos,int newv,int v)
17+
{
18+
if(low == high)
19+
{
20+
STree[pos] = newv;
21+
return;
22+
}
23+
24+
int mid = (low+high) >> 1;
25+
if(v <= mid)
26+
UpdateQuery(STree,low,mid,2*pos+1,newv,v);
27+
28+
else
29+
UpdateQuery(STree,mid+1,high,2*pos+2,newv,v);
30+
31+
STree[pos] = min(STree[pos*2+1],STree[pos*2+2]);
32+
}
33+
34+
int RangeMinQuery(int STree[],int qlow,int qhigh,int low,int high,int pos)
35+
{
36+
if(qlow <= low && qhigh >= high)
37+
return STree[pos];
38+
39+
if(qlow > high || qhigh < low)
40+
return INT_MAX;
41+
42+
int mid = (low+high)>>1;
43+
44+
return min(RangeMinQuery(STree,qlow,qhigh,low,mid,2*pos+1),
45+
RangeMinQuery(STree,qlow,qhigh,mid+1,high,2*pos+2));
46+
}
47+
48+
void BulidTree(int A[],int STree[],int low,int high,int pos)
49+
{
50+
if(low == high)
51+
{
52+
STree[pos] = A[low];
53+
return;
54+
}
55+
int mid = (low+high) >> 1;
56+
BulidTree(A,STree,low,mid,2*pos+1);
57+
BulidTree(A,STree,mid+1,high,2*pos+2);
58+
STree[pos] = min(STree[2*pos+1],STree[2*pos+2]);
59+
}
60+
61+
int main()
62+
{
63+
64+
int A[] = {-1,2,4,0};
65+
66+
int n = sizeof(A)/sizeof(A[0]);
67+
int h = (int)(ceil(log2(n)));
68+
int size = 2*(int)pow(2,h)-1;
69+
70+
int *STree = mlc(int,size);
71+
72+
BulidTree(A,STree,0,n-1,0);
73+
74+
printf("%d\n",RangeMinQuery(STree,1,3,0,n-1,0));
75+
76+
UpdateQuery(STree,0,n-1,0,-3,1);
77+
// new array -1,-3,4,0
78+
79+
printf("%d\n",RangeMinQuery(STree,1,3,0,n-1,0));
80+
81+
82+
83+
84+
return 0;
85+
}

15.Segment Tree/RangeSumQuery.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/* Amit Bansal - @amitbansal7 */
2+
#include <bits/stdc++.h>
3+
#include <string>
4+
#define lli long long int
5+
#define llu unsigned long long int
6+
#define S(x) scanf("%d",&x)
7+
#define Sl(x) scanf("%lld",&x)
8+
#define Mset(p,i) memset(p,i,sizeof(p))
9+
#define mlc(t,n) (t *)malloc(sizeof(t)*n)
10+
#define NIL -1
11+
#define INF INT_MAX
12+
#define TC int testcase; S(testcase); while(testcase--)
13+
#define Pi 3.14159
14+
using namespace std;
15+
16+
void updateQuery(int STree[],int low,int high,int pos,int val,int v)
17+
{
18+
if(low == high)
19+
{
20+
STree[pos] = val;
21+
return;
22+
}
23+
int mid = (low+high) >> 1;
24+
25+
if(v <= mid)
26+
updateQuery(STree,low,mid,pos*2+1,val,v);
27+
else
28+
updateQuery(STree,mid+1,high,pos*2+2,val,v);
29+
30+
STree[pos] = STree[2*pos+1] + STree[2*pos+2];
31+
}
32+
33+
int RangeSumQuery(int STree[],int qlow,int qhigh,int low,int high,int pos)
34+
{
35+
if(low >= qlow && high <= qhigh)
36+
return STree[pos];
37+
38+
if(low > qhigh || high < qlow)
39+
return 0;
40+
41+
int mid = (low+high) >> 1;
42+
return RangeSumQuery(STree,qlow,qhigh,low,mid,pos*2+1) +
43+
RangeSumQuery(STree,qlow,qhigh,mid+1,high,pos*2+2);
44+
45+
}
46+
void BulidTree(int A[],int STree[],int low,int high,int pos)
47+
{
48+
if(low == high)
49+
{
50+
STree[pos] = A[low];
51+
return;
52+
}
53+
54+
int mid = (low+high) >> 1;
55+
BulidTree(A,STree,low,mid,pos*2+1);
56+
BulidTree(A,STree,mid+1,high,pos*2+2);
57+
STree[pos] = STree[pos*2+1] + STree[pos*2+2];
58+
59+
}
60+
61+
int main()
62+
{
63+
int A[] = {1,4,3,5};
64+
65+
int n = sizeof(A)/sizeof(A[0]);
66+
int h = (int)(ceil(log2(n)));
67+
int size = 2*(int)pow(2,h)-1;
68+
69+
int *STree = mlc(int,size);
70+
71+
BulidTree(A,STree,0,n-1,0);
72+
73+
printf("%d\n",RangeSumQuery(STree,1,2,0,n-1,0));
74+
75+
updateQuery(STree,0,n-1,0,8,2);
76+
// new array 1,4,8,5
77+
78+
printf("%d\n",RangeSumQuery(STree,1,2,0,n-1,0));
79+
80+
return 0;
81+
}

0 commit comments

Comments
 (0)