Miscellaneous
Segment & Binary Index Tree & Disjointed
SetsSegment Tree ( simple )
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int getSum(int arr[], int qs, int qe) {
int sum = 0;
for (int i = qs; i <= qe; i++)
sum = sum + arr[i];
return sum;
}
static void update(int arr[], int i, int newVal) {
arr[i] = newVal;
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40, 50 }, n = 5;
System.out.print(getSum(arr, 0, 2) + " ");
System.out.print(getSum(arr, 1, 3) + " ");
update(arr, 1, 60);
System.out.print(getSum(arr, 0, 2) + " ");
System.out.print(getSum(arr, 1, 3) + " ");
}
}
Segment Tree Prefix Sum
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int getSum(int pre_sum[], int qs, int qe) {
if (qs == 0)
return pre_sum[qe];
else
return pre_sum[qe] - pre_sum[qs - 1];
}
static void update(int pre_sum[], int arr[], int i, int newVal, int n) {
int diff = newVal - arr[i];
for (int j = i; j < n; j++)
pre_sum[j] += diff;
}
static void initialize(int pre_sum[], int arr[], int n) {
pre_sum[0] = arr[0];
for (int i = 1; i < n; i++) {
pre_sum[i] = pre_sum[i - 1] + arr[i];
}
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40, 50 }, n = 5;
int pre_sum[] = new int[n];
initialize(pre_sum, arr, n);
System.out.print(getSum(pre_sum, 0, 2) + " ");
System.out.print(getSum(pre_sum, 1, 3) + " ");
update(pre_sum, arr, 1, 60, n);
System.out.print(getSum(pre_sum, 0, 2) + " ");
System.out.print(getSum(pre_sum, 1, 3) + " ");
}
}
Constructing Segment Tree
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int CST(int ss, int se, int si, int arr[], int tree[]) {
if (ss == se) {
tree[si] = arr[ss];
return arr[ss];
}
int mid = (ss + se) / 2;
tree[si] = CST(ss, mid, 2 * si + 1, arr, tree) + CST(mid + 1, se, 2 * si + 2, arr, tree);
return tree[si];
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40 }, n = 4;
int tree[] = new int[4 * n];
System.out.println(CST(0, n - 1, 0, arr, tree));
}
}
Range Query on Segment Tree
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int CST(int ss, int se, int si, int arr[], int tree[]) {
if (ss == se) {
tree[si] = arr[ss];
return arr[ss];
}
int mid = (ss + se) / 2;
tree[si] = CST(ss, mid, 2 * si + 1, arr, tree) + CST(mid + 1, se, 2 * si + 2, arr, tree);
return tree[si];
}
static int getSumRec(int qs, int qe, int ss, int se, int si, int tree[]) {
if (se < qs || ss > qe)
return 0;
if (qs <= ss && qe >= se)
return tree[si];
int mid = (ss + se) / 2;
return getSumRec(qs, qe, ss, mid, 2 * si + 1, tree) + getSumRec(qs, qe, mid + 1, se, 2 * si + 2, tree);
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40 }, n = 4;
int tree[] = new int[4 * n];
CST(0, n - 1, 0, arr, tree);
System.out.println(getSumRec(0, 2, 0, 3, 0, tree));
}
}
Update Query on Segment Tree
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int CST(int ss, int se, int si, int arr[], int tree[]) {
if (ss == se) {
tree[si] = arr[ss];
return arr[ss];
}
int mid = (ss + se) / 2;
tree[si] = CST(ss, mid, 2 * si + 1, arr, tree) + CST(mid + 1, se, 2 * si + 2, arr, tree);
return tree[si];
}
static void updateRec(int ss, int se, int i, int si, int diff, int tree[]) {
if (i < ss || i > se)
return;
tree[si] = tree[si] + diff;
if (se > ss) {
int mid = (ss + se) / 2;
updateRec(ss, mid, i, 2 * si + 1, diff, tree);
updateRec(mid + 1, se, i, 2 * si + 2, diff, tree);
}
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40 }, n = 4;
int tree[] = new int[4 * n];
CST(0, n - 1, 0, arr, tree);
updateRec(0, 3, 1, 0, 5, tree);
}
}
Binary Indexed Tree ( Prefix Sum Implementation )
import java.util.*;
import java.lang.*;
import java.io.*;
class BinaryIndexedTree {
final static int MAX = 1000;
static int BITree[] = new int[MAX];
int getSum(int index) {
int sum = 0;
index = index + 1;
while (index > 0) {
sum += BITree[index];
index -= index & (-index);
}
return sum;
}
public static void updateBIT(int n, int index, int val) {
index = index + 1;
while (index <= n) {
BITree[index] += val;
index += index & (-index);
}
}
void constructBITree(int arr[], int n) {
for (int i = 1; i <= n; i++)
BITree[i] = 0;
for (int i = 0; i < n; i++)
updateBIT(n, i, arr[i]);
}
public static void main(String args[]) {
int freq[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
int n = freq.length;
BinaryIndexedTree tree = new BinaryIndexedTree();
tree.constructBITree(freq, n);
System.out.println("Sum of elements in arr[0..5]" + " is " + tree.getSum(5));
}
}
Binary Indexed Tree ( Update Operation )
import java.util.*;
import java.lang.*;
import java.io.*;
class BinaryIndexedTree {
final static int MAX = 1000;
static int BITree[] = new int[MAX];
public static void updateBIT(int n, int index, int val) {
index = index + 1;
while (index <= n) {
BITree[index] += val;
index += index & (-index);
}
}
void constructBITree(int arr[], int n) {
for (int i = 1; i <= n; i++)
BITree[i] = 0;
for (int i = 0; i < n; i++)
updateBIT(n, i, arr[i]);
}
public static void main(String args[]) {
int freq[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
int n = freq.length;
BinaryIndexedTree tree = new BinaryIndexedTree();
tree.constructBITree(freq, n);
updateBIT(n, 2, 35);
}
}
Segment Tree ( simple )
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int getSum(int arr[], int qs, int qe) {
int sum = 0;
for (int i = qs; i <= qe; i++)
sum = sum + arr[i];
return sum;
}
static void update(int arr[], int i, int newVal) {
arr[i] = newVal;
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40, 50 }, n = 5;
System.out.print(getSum(arr, 0, 2) + " ");
System.out.print(getSum(arr, 1, 3) + " ");
update(arr, 1, 60);
System.out.print(getSum(arr, 0, 2) + " ");
System.out.print(getSum(arr, 1, 3) + " ");
}
}
Segment Tree Prefix Sum
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int getSum(int pre_sum[], int qs, int qe) {
if (qs == 0)
return pre_sum[qe];
else
return pre_sum[qe] - pre_sum[qs - 1];
}
static void update(int pre_sum[], int arr[], int i, int newVal, int n) {
int diff = newVal - arr[i];
for (int j = i; j < n; j++)
pre_sum[j] += diff;
}
static void initialize(int pre_sum[], int arr[], int n) {
pre_sum[0] = arr[0];
for (int i = 1; i < n; i++) {
pre_sum[i] = pre_sum[i - 1] + arr[i];
}
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40, 50 }, n = 5;
int pre_sum[] = new int[n];
initialize(pre_sum, arr, n);
System.out.print(getSum(pre_sum, 0, 2) + " ");
System.out.print(getSum(pre_sum, 1, 3) + " ");
update(pre_sum, arr, 1, 60, n);
System.out.print(getSum(pre_sum, 0, 2) + " ");
System.out.print(getSum(pre_sum, 1, 3) + " ");
}
}
Constructing Segment Tree
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int CST(int ss, int se, int si, int arr[], int tree[]) {
if (ss == se) {
tree[si] = arr[ss];
return arr[ss];
}
int mid = (ss + se) / 2;
tree[si] = CST(ss, mid, 2 * si + 1, arr, tree) + CST(mid + 1, se, 2 * si + 2, arr, tree);
return tree[si];
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40 }, n = 4;
int tree[] = new int[4 * n];
System.out.println(CST(0, n - 1, 0, arr, tree));
}
}
Range Query on Segment Tree
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int CST(int ss, int se, int si, int arr[], int tree[]) {
if (ss == se) {
tree[si] = arr[ss];
return arr[ss];
}
int mid = (ss + se) / 2;
tree[si] = CST(ss, mid, 2 * si + 1, arr, tree) + CST(mid + 1, se, 2 * si + 2, arr, tree);
return tree[si];
}
static int getSumRec(int qs, int qe, int ss, int se, int si, int tree[]) {
if (se < qs || ss > qe)
return 0;
if (qs <= ss && qe >= se)
return tree[si];
int mid = (ss + se) / 2;
return getSumRec(qs, qe, ss, mid, 2 * si + 1, tree) + getSumRec(qs, qe, mid + 1, se, 2 * si + 2, tree);
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40 }, n = 4;
int tree[] = new int[4 * n];
CST(0, n - 1, 0, arr, tree);
System.out.println(getSumRec(0, 2, 0, 3, 0, tree));
}
}
Update Query on Segment Tree
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG {
static int CST(int ss, int se, int si, int arr[], int tree[]) {
if (ss == se) {
tree[si] = arr[ss];
return arr[ss];
}
int mid = (ss + se) / 2;
tree[si] = CST(ss, mid, 2 * si + 1, arr, tree) + CST(mid + 1, se, 2 * si + 2, arr, tree);
return tree[si];
}
static void updateRec(int ss, int se, int i, int si, int diff, int tree[]) {
if (i < ss || i > se)
return;
tree[si] = tree[si] + diff;
if (se > ss) {
int mid = (ss + se) / 2;
updateRec(ss, mid, i, 2 * si + 1, diff, tree);
updateRec(mid + 1, se, i, 2 * si + 2, diff, tree);
}
}
public static void main(String args[]) {
int arr[] = { 10, 20, 30, 40 }, n = 4;
int tree[] = new int[4 * n];
CST(0, n - 1, 0, arr, tree);
updateRec(0, 3, 1, 0, 5, tree);
}
}
Binary Indexed Tree ( Prefix Sum Implementation )
import java.util.*;
import java.lang.*;
import java.io.*;
class BinaryIndexedTree {
final static int MAX = 1000;
static int BITree[] = new int[MAX];
int getSum(int index) {
int sum = 0;
index = index + 1;
while (index > 0) {
sum += BITree[index];
index -= index & (-index);
}
return sum;
}
public static void updateBIT(int n, int index, int val) {
index = index + 1;
while (index <= n) {
BITree[index] += val;
index += index & (-index);
}
}
void constructBITree(int arr[], int n) {
for (int i = 1; i <= n; i++)
BITree[i] = 0;
for (int i = 0; i < n; i++)
updateBIT(n, i, arr[i]);
}
public static void main(String args[]) {
int freq[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
int n = freq.length;
BinaryIndexedTree tree = new BinaryIndexedTree();
tree.constructBITree(freq, n);
System.out.println("Sum of elements in arr[0..5]" + " is " + tree.getSum(5));
}
}
Binary Indexed Tree ( Update Operation )
import java.util.*;
import java.lang.*;
import java.io.*;
class BinaryIndexedTree {
final static int MAX = 1000;
static int BITree[] = new int[MAX];
public static void updateBIT(int n, int index, int val) {
index = index + 1;
while (index <= n) {
BITree[index] += val;
index += index & (-index);
}
}
void constructBITree(int arr[], int n) {
for (int i = 1; i <= n; i++)
BITree[i] = 0;
for (int i = 0; i < n; i++)
updateBIT(n, i, arr[i]);
}
public static void main(String args[]) {
int freq[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
int n = freq.length;
BinaryIndexedTree tree = new BinaryIndexedTree();
tree.constructBITree(freq, n);
updateBIT(n, 2, 35);
}
}