Lesson 2 � Advanced

Segment Tree: Range Queries

Segment Tree ek binary tree data structure hai jo arrays pe efficient range queries aur point updates karta hai. Prefix sum sirf prefix ke liye kaam karta hai, but segment tree kisi bhi range ke liye O(log n) mein answer deta hai!

? 35 min✓ Advanced✓ Trees basics

Segment Tree hota kya hai?

WHAT

Segment Tree ek binary tree hai jismein har node array ke ek segment (range) ka result store karta hai. Root poora array represent karta hai, leaves single elements. Har node apne dono children ka combined result rakhta hai.

WHEN

Jab array pe baar baar range queries ho (range sum, range min/max) aur point updates bhi ho. Prefix sum O(1) query deta hai but O(n) update. Segment Tree dono O(log n) mein karta hai!

WHERE

Competitive coding mein bahut common � range queries, interval problems, 2D range queries. Real world mein stock prices ka range analysis, game scores tracking.

Visual: Segment Tree kaise banta hai

Array: [1, 3, 5, 7, 9, 11]

 [36] ✓ total sum (0-5)
 / \
 [9] [27] ✓ sum of halves
 / \ / \
 [4] [5] [16] [11] ✓ sum of quarters
 / \ / \ / \ \
 [1][3][5][7][9][11] ✓ leaves (original array)

Har node ek range ka sum store karta hai:
Node [36] = range(0,5) = 1+3+5+7+9+11 = 36
Node [9] = range(0,2) = 1+3+5 = 9
Node [27] = range(3,5) = 7+9+11 = 27
Node [4] = range(0,1) = 1+3 = 4
Node [16] = range(3,4) = 7+9 = 16

Query: sum(1,4) = ?
Path: range(1,4) = range(0,2)[1,2] + range(3,4)[3,4]
 = (3+5) + (7+9) = 24 ?

Build the Segment Tree

def build(arr, node, start, end):
 if start == end:
 # Leaf node � single element
 tree[node] = arr[start]
 else:
 mid = (start + end) // 2
 # Left child: range(start, mid)
 build(arr, 2 * node + 1, start, mid)
 # Right child: range(mid+1, end)
 build(arr, 2 * node + 2, mid + 1, end)
 # Parent = sum of children
 tree[node] = tree[2 * node + 1] + tree[2 * node + 2]

# Usage
arr = [1, 3, 5, 7, 9, 11]
n = len(arr)
tree = [0] * (4 * n) # 4*n space sufficient
build(arr, 0, 0, n - 1)
print(tree) # [36, 9, 27, 4, 5, 16, 11, 1, 3, 5, 7, 9, 11]

Range Query

def query(node, start, end, l, r):
 # Query range [l, r] se overlap nahi karta
 if r < start or end < l:
 return 0
 
 # Query range poora cover karta hai
 if l <= start and end <= r:
 return tree[node]
 
 # Partial overlap � dono sides check karo
 mid = (start + end) // 2
 left_sum = query(2 * node + 1, start, mid, l, r)
 right_sum = query(2 * node + 2, mid + 1, end, l, r)
 return left_sum + right_sum

# Usage: sum of range [1, 4]
print(query(0, 0, n - 1, 1, 4)) # 3+5+7+9 = 24

Point Update

def update(node, start, end, idx, val):
 if start == end:
 # Leaf node � value update karo
 tree[node] = val
 else:
 mid = (start + end) // 2
 if idx <= mid:
 update(2 * node + 1, start, mid, idx, val)
 else:
 update(2 * node + 2, mid + 1, end, idx, val)
 tree[node] = tree[2 * node + 1] + tree[2 * node + 2]

# Usage: arr[2] = 10 update karo
update(0, 0, n - 1, 2, 10)
print(query(0, 0, n - 1, 0, 5)) # new total sum
Prefix Sum vs Segment Tree: Prefix sum O(1) query deta hai but O(n) update. Segment Tree dono O(log n) mein karta hai. Agar sirf queries hain aur updates nahi, toh prefix sum enough hai. Agar dono hain toh segment tree use karo.

Segment Tree ke Types

# Range Sum Query
def combine_sum(left, right):
 return left + right

# Range Minimum Query
def combine_min(left, right):
 return min(left, right)

# Range Maximum Query
def combine_max(left, right):
 return max(left, right)

# GCD Query
from math import gcd
def combine_gcd(left, right):
 return gcd(left, right)

# Har type ke liye same structure hai,
# sirf combine function alag hai!

Try it: code khud likho

Exercise

Question: Array [2, 4, 6, 8, 10] pe segment tree banao. Range [1, 3] ka sum kya hai✓ Answer mein number daalo.

Question: Array ke n elements ke liye segment tree mein kitni space lagti hai (approximate)✓ Answer mein formula daalo (n ke terms mein).

Common mistakes

Lesson complete?

Segment Tree samajh aa gaya✓ Ab Bit Manipulation dekhte hain � ye tricks interview mein bahut kaam aati hain!