Use this to learn the idea, then write your own version.
1234 5import random6 7 89class TreapNode(object):10 __slots__ = ('value', 'prior', 'cnt', 'xor_sum', 'rev', 'l', 'r')11 12 def __init__(self, value):13 self.value = value14 self.prior = random.randint(1, 1 << 30)15 self.cnt = 116 self.xor_sum = value17 self.rev = False18 self.l = None19 self.r = None20 21def cnt(t):22 return t.cnt if t else 023 24def xor_sum(t):25 return t.xor_sum if t else 026 27def upd_cnt(t):28 if t:29 t.cnt = 1 + cnt(t.l) + cnt(t.r)30 t.xor_sum = t.value ^ xor_sum(t.l) ^ xor_sum(t.r)31 32def push(t):33 if t and t.rev:34 t.rev = False35 t.l, t.r = t.r, t.l36 if t.l:37 t.l.rev ^= True38 if t.r:39 t.r.rev ^= True40 41def merge(l, r):42 push(l)43 push(r)44 if not l or not r:45 return l or r46 if l.prior > r.prior:47 l.r = merge(l.r, r)48 upd_cnt(l)49 return l50 else:51 r.l = merge(l, r.l)52 upd_cnt(r)53 return r54 55def split(t, key, add=0):56 if not t:57 return (None, None)58 push(t)59 cur_key = add + cnt(t.l)60 if key <= cur_key:61 l, t.l = split(t.l, key, add)62 upd_cnt(t)63 return (l, t)64 else:65 t.r, r = split(t.r, key, add + 1 + cnt(t.l))66 upd_cnt(t)67 return (t, r)68 69def reverse(t, l, r):70 t1, t2 = split(t, l)71 t2, t3 = split(t2, r - l + 1)72 if t2:73 t2.rev ^= True74 return merge(merge(t1, t2), t3)75 76def heapify(t):77 if not t:78 return79 mx = t80 if t.l and t.l.prior > mx.prior:81 mx = t.l82 if t.r and t.r.prior > mx.prior:83 mx = t.r84 if mx != t:85 t.prior, mx.prior = mx.prior, t.prior86 heapify(mx)87 88def build(a, i, n):89 if not n:90 return None91 mid = n 292 t = TreapNode(a[i + mid])93 t.l = build(a, i, mid)94 t.r = build(a, i + mid + 1, n - mid - 1)95 heapify(t)96 upd_cnt(t)97 return t98 99100class Solution(object):101 def getResults(self, nums, queries):102 """103 :type nums: List[int]104 :type queries: List[List[int]]105 :rtype: List[int]106 """107 def update(root, index, value):108 left, mid = split(root, index)109 mid, right = split(mid, 1)110 mid.value = value111 upd_cnt(mid)112 return merge(merge(left, mid), right)113 114 def query(root, left, right):115 t1, t2 = split(root, left)116 t2, t3 = split(t2, right - left + 1)117 result = xor_sum(t2)118 return merge(merge(t1, t2), t3), result119 120 result = []121 root = build(nums, 0, len(nums))122 for q in queries:123 if q[0] == 1:124 root = update(root, q[1], q[2])125 elif q[0] == 2:126 root, x = query(root, q[1], q[2])127 result.append(x)128 elif q[0] == 3:129 root = reverse(root, q[1], q[2])130 return result131