-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsegmentTreeArray.py
60 lines (50 loc) · 1.47 KB
/
segmentTreeArray.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Segment Tree Array
from math import log2, ceil
#Defaults
def f(*args, **kwargs):
return max(*args, **kwargs)
default = 0
def create_tree(temp):
#Initialising
n = len(temp)
m = 2**(ceil(log2(n)))
data = [(n,m,n+m)] + [(-1,-1,default)]*(m-1)
for i,value in enumerate(temp):
data.append((i,i,value))
#Framing Tree
i=data[0][2]-1
if i%2==0:
data[i//2]=data[i]
i-=1
while i>1:
data[i//2]=( data[i-1][0], data[i][1], f(data[i-1][2],data[i][2]) )
i-=2
return data
def update(data, pos, value):
i = data[0][1]+pos
data[i] = (data[i][0], data[i][1] ,value)
if i%2==0:
if i+1<data[0][2]:
data[i//2]=( data[i][0], data[i+1][1], f(data[i][2],data[i+1][2]) )
else:
data[i//2]=data[i]
i-=1
while i>1:
data[i//2]=( data[i-1][0], data[i][1], f(data[i-1][2],data[i][2]) )
i-=2
def query(data,x,y):
def recurse(data,i,x,y):
#print(i)
if x == data[i][0] and y == data[i][1]:
ans=data[i][2]
elif y <= data[i][1]:
ans=recurse(data,i*2,x,y)
elif x > data[i][1]:
ans=recurse(data,i+1,x,y)
else:
ans = f( recurse(data,i,x,data[i][1]), recurse(data,i+1,data[i+1][0],y) )
return ans
return recurse(data,1,x,y)
#Driver
raw = list(map(int, input().split()))
tree = create_tree(raw)