#(Number of odd, Number of even)
def build(a, v, sl, sr):
if sl == sr:
if a[sl] % 2 == 1:
st[v] = [1, 0]
else:
st[v] = [0, 1]
return
else:
m = (sl+sr) // 2
build(a, 2*v, sl, m)
build(a, 2*v + 1, m+1, sr)
st[v][0] = st[v*2][0] + st[v*2 + 1][0]
st[v][1] = st[v*2][1] + st[v*2 + 1][1]
def update(a, v, sl, sr, qi, nval):
if sl == sr:
a[sl] = nval
if a[sl] % 2 == 1:
st[v] = [1, 0]
else:
st[v] = [0, 1]
#a[sl] = nval
return
m = (sl+sr) // 2
if qi <= m:
update(a, v*2, sl, m, qi, nval)
else:
update(a, v*2+1, m+1, sr, qi, nval)
st[v][0] = st[v*2][0] + st[v*2 + 1][0]
st[v][1] = st[v*2][1] + st[v*2 + 1][1]
def getodd(v, sl, sr, l, r):
if sl > r or sr < l: return 0
if sl >= l and sr <= r: return st[v][0]
m = (sl + sr) // 2
return getodd(2*v, sl, m, l, r) + getodd(2*v+1, m+1, sr, l, r)
def geteven(v, sl, sr, l, r):
if sl > r or sr < l: return 0
if sl >= l and sr <= r: return st[v][1]
m = (sl + sr) // 2
return geteven(2*v, sl, m, l, r) + geteven(2*v+1, m+1, sr, l, r)
a = [1, 2, 3, 4, 5, 6]
st = [[None, None]]*len(a)*4
build(a, 0, 0, len(a)-1)
Here is my python code for finding number of even and odd numbers within a range. Everything is working find except the update function. It is returning wrong results. Could anyone please help me with that?