Skip to content

Instantly share code, notes, and snippets.

@codefever
Created August 24, 2019 09:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codefever/ef37cc8eaccb5f9797a1a34bab22342b to your computer and use it in GitHub Desktop.
Save codefever/ef37cc8eaccb5f9797a1a34bab22342b to your computer and use it in GitHub Desktop.
SegmentTree in python
#!/usr/bin/env python
# Inspired by: https://www.youtube.com/watch?v=Oq2E2yGadnU
# What i did was moving the first index to 0.
class SegmentTree(object):
def __init__(self, data):
n = len(data)
self.offset = n - 1
self.nodes = [0 for _ in range(n * 2 - 1)]
for i in range(n):
self.nodes[self.offset + i] = data[i]
for i in range(self.offset-1, -1, -1):
self.nodes[i] = self.nodes[i*2+1] + self.nodes[i*2+2]
def get_sum(self, left, right):
# [left, right)
left += self.offset
right += self.offset
ret = 0
while left < right:
if left & 1 == 0: # on right child
ret += self.nodes[left]
left += 1
if right & 1 == 0: # on right child
right -= 1
ret += self.nodes[right]
left //= 2
right //= 2
return ret
import random
N = 100
nums = [i for i in range(N)]
for _ in range(1000):
random.shuffle(nums)
t = SegmentTree(nums)
for i in range(N):
for j in range(i+1, N):
a = t.get_sum(i,j)
b = sum(nums[i:j])
assert a==b, '%d!=%d, %s %s %s'%(a, b, nums, i, j)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment