chore(CPlusPlus): add iterative segment tree (#521)

pull/543/head
Krishan Kant Agnihotri 2021-10-08 00:17:14 +05:30 committed by GitHub
parent a012b6568f
commit 4b7a342198
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 92 additions and 1 deletions

View File

@ -117,7 +117,7 @@
10. [Finding the height of a given tree](Trees/Height-Of-Tree.cpp)
11. [Finding the elements of a tree visible from top view](Trees/Top-View-Of-A-Tree.cpp)
12. [Binary Tree Implementation](Trees/binary-tree-implementation.cpp)
13. [Iterative Segment Tree](Trees/IterativeSegmentTree.cpp)
# Maths
1. [Kaprekar Number](Maths/Kaprekar-number.cpp)

View File

@ -0,0 +1,91 @@
//Find the Maximum in given range with updates.
#include <bits/stdc++.h>
using namespace std;
//struct s(n,x);
struct SegTree
{
typedef int T;
static constexpr T unit = -1e9;
T f(T a, T b) { return max(a, b); } // (any associative fn)
vector<T> s;
int n;
SegTree(int _n = 0, T def = unit) : s(2 * _n, def), n(_n) {}
//O(logn)
void update(int pos, T val)
{
for (s[pos += n] = val; pos /= 2;)
s[pos] = f(s[pos * 2], s[pos * 2 + 1]);
}
//O(logn)
T query(int b, int e)
{ // query [b, e)
T ra = unit, rb = unit;
for (b += n, e += n; b < e; b /= 2, e /= 2)
{
if (b % 2)
ra = f(ra, s[b++]);
if (e % 2)
rb = f(s[--e], rb);
}
return f(ra, rb);
}
};
int main()
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
SegTree s(n + 1);
//Building of Segment Tree in O(n*(log(n)))
for (int i = 0; i < n; i++)
{
s.update(i + 1, v[i]);
}
//queries
int q;
cin >> q;
while (q--)
{
int t;
//two types of queries
//1) t = 1 change element at index i to u
//2) t = 2 print the sum of elements in range [l,r]
cin >> t;
if (t == 1)
{
int id, u;
cin >> id >> u;
id--; //changing to zero base
s.update(id + 1, u); //updating the delta
}
else
{
int l, r;
cin >> l >> r;
cout << s.query(l, r + 1) << endl;
}
}
}
// Time Complexity:
// O(nlogn)
// Space Complexity:
// O(n)
// Test Cases:
// Input:
// 5
// 1 3 4 7 -15
// 3
// 2 2 5
// 1 3 15
// 2 2 5
// Output:
// 7
// 15