class Node:
def __init__(self, key, val):
self.key = key
self.value = val
self.left = None
self.right = None
self.count = 1
class BST:
def __init__(self):
self.__root = None
def size(self, x=None):
if x is None:
x = self.__root
return 0 if x is None else x.count
def put(self, key, val):
self.__root = self.__put(self.__root, key, val)
def __put(self, x, key, val):
if x is None:
return Node(key, val)
if key < x.key:
x.left = self.__put(x.left, key, val)
elif key > x.key:
x.right = self.__put(x.right, key, val)
else:
x.value = val
x.count = 1 + self.size(x.left) + self.size(x.right)
return x
def get(self, key):
x = self.__root
while x is not None:
if key < x.key:
x = x.left
elif key > x.key:
x = x.right
else:
return x.value
return None
def min(self, x=None):
if x is None:
x = self.__root
if x is None:
return None
while x.left is not None:
x = x.left
return x
def delete_min(self, x=None):
if x is None:
x = self.__root
if x is None:
return None
self.__root = self.__delete_min(x)
else:
return self.__delete_min(x)
def __delete_min(self, x):
if x.left is None:
return x.right
x.left = self.__delete_min(x.left)
x.count = 1 + self.size(x.left) + self.size(x.right)
return x
def delete(self, key):
self.__root = self.__delete(self.__root, key)
def __delete(self, x, key):
if x is None:
return None
if key < x.key:
x.left = self.__delete(x.left, key)
elif key > x.key:
x.right = self.__delete(x.right, key)
else:
if x.right is None:
return x.left
if x.left is None:
return x.right
t = x
x = self.min(t.right)
x.right = self.__delete_min(t.right)
x.left = t.left
x.count = self.size(x.left) + self.size(x.right) + 1
return x
x.count = 1 + self.size(x.left) + self.size(x.right)
return x
def inorder(self):
keys = []
self.__inorder(self.__root, keys)
return keys
def __inorder(self, x, keys):
if x is None:
return
self.__inorder(x.left, keys)
keys.append(x.key)
self.__inorder(x.right, keys)
Y2xhc3MgTm9kZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgc2VsZi5rZXkgPSBrZXkKICAgICAgICBzZWxmLnZhbHVlID0gdmFsCiAgICAgICAgc2VsZi5sZWZ0ID0gTm9uZQogICAgICAgIHNlbGYucmlnaHQgPSBOb25lCiAgICAgICAgc2VsZi5jb3VudCA9IDEKCmNsYXNzIEJTVDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9fcm9vdCA9IE5vbmUKICAgIAogICAgZGVmIHNpemUoc2VsZiwgeD1Ob25lKToKICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgIHggPSBzZWxmLl9fcm9vdAogICAgICAgIHJldHVybiAwIGlmIHggaXMgTm9uZSBlbHNlIHguY291bnQKICAgIAogICAgZGVmIHB1dChzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgc2VsZi5fX3Jvb3QgPSBzZWxmLl9fcHV0KHNlbGYuX19yb290LCBrZXksIHZhbCkKICAgIAogICAgZGVmIF9fcHV0KHNlbGYsIHgsIGtleSwgdmFsKToKICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb2RlKGtleSwgdmFsKQogICAgICAgIGlmIGtleSA8IHgua2V5OgogICAgICAgICAgICB4LmxlZnQgPSBzZWxmLl9fcHV0KHgubGVmdCwga2V5LCB2YWwpCiAgICAgICAgZWxpZiBrZXkgPiB4LmtleToKICAgICAgICAgICAgeC5yaWdodCA9IHNlbGYuX19wdXQoeC5yaWdodCwga2V5LCB2YWwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeC52YWx1ZSA9IHZhbAogICAgICAgIHguY291bnQgPSAxICsgc2VsZi5zaXplKHgubGVmdCkgKyBzZWxmLnNpemUoeC5yaWdodCkKICAgICAgICByZXR1cm4geAogICAgCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgeCA9IHNlbGYuX19yb290CiAgICAgICAgd2hpbGUgeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYga2V5IDwgeC5rZXk6CiAgICAgICAgICAgICAgICB4ID0geC5sZWZ0CiAgICAgICAgICAgIGVsaWYga2V5ID4geC5rZXk6CiAgICAgICAgICAgICAgICB4ID0geC5yaWdodAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWUKICAgICAgICByZXR1cm4gTm9uZQogICAgCiAgICBkZWYgbWluKHNlbGYsIHg9Tm9uZSk6CiAgICAgICAgaWYgeCBpcyBOb25lOgogICAgICAgICAgICB4ID0gc2VsZi5fX3Jvb3QKICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgd2hpbGUgeC5sZWZ0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB4ID0geC5sZWZ0CiAgICAgICAgcmV0dXJuIHgKICAgIAogICAgZGVmIGRlbGV0ZV9taW4oc2VsZiwgeD1Ob25lKToKICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgIHggPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBzZWxmLl9fcm9vdCA9IHNlbGYuX19kZWxldGVfbWluKHgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZWxldGVfbWluKHgpCiAgICAKICAgIGRlZiBfX2RlbGV0ZV9taW4oc2VsZiwgeCk6CiAgICAgICAgaWYgeC5sZWZ0IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiB4LnJpZ2h0CiAgICAgICAgeC5sZWZ0ID0gc2VsZi5fX2RlbGV0ZV9taW4oeC5sZWZ0KQogICAgICAgIHguY291bnQgPSAxICsgc2VsZi5zaXplKHgubGVmdCkgKyBzZWxmLnNpemUoeC5yaWdodCkKICAgICAgICByZXR1cm4geAogICAgCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgc2VsZi5fX3Jvb3QgPSBzZWxmLl9fZGVsZXRlKHNlbGYuX19yb290LCBrZXkpCiAgICAKICAgIGRlZiBfX2RlbGV0ZShzZWxmLCB4LCBrZXkpOgogICAgICAgIGlmIHggaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBrZXkgPCB4LmtleToKICAgICAgICAgICAgeC5sZWZ0ID0gc2VsZi5fX2RlbGV0ZSh4LmxlZnQsIGtleSkKICAgICAgICBlbGlmIGtleSA+IHgua2V5OgogICAgICAgICAgICB4LnJpZ2h0ID0gc2VsZi5fX2RlbGV0ZSh4LnJpZ2h0LCBrZXkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgeC5yaWdodCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIHgubGVmdAogICAgICAgICAgICBpZiB4LmxlZnQgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiB4LnJpZ2h0CiAgICAgICAgICAgIAogICAgICAgICAgICB0ID0geAogICAgICAgICAgICB4ID0gc2VsZi5taW4odC5yaWdodCkKICAgICAgICAgICAgeC5yaWdodCA9IHNlbGYuX19kZWxldGVfbWluKHQucmlnaHQpCiAgICAgICAgICAgIHgubGVmdCA9IHQubGVmdAogICAgICAgICAgICB4LmNvdW50ID0gc2VsZi5zaXplKHgubGVmdCkgKyBzZWxmLnNpemUoeC5yaWdodCkgKyAxCiAgICAgICAgICAgIHJldHVybiB4CiAgICAgICAgCiAgICAgICAgeC5jb3VudCA9IDEgKyBzZWxmLnNpemUoeC5sZWZ0KSArIHNlbGYuc2l6ZSh4LnJpZ2h0KQogICAgICAgIHJldHVybiB4CiAgICAKICAgIGRlZiBpbm9yZGVyKHNlbGYpOgogICAgICAgIGtleXMgPSBbXQogICAgICAgIHNlbGYuX19pbm9yZGVyKHNlbGYuX19yb290LCBrZXlzKQogICAgICAgIHJldHVybiBrZXlzCiAgICAKICAgIGRlZiBfX2lub3JkZXIoc2VsZiwgeCwga2V5cyk6CiAgICAgICAgaWYgeCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl9faW5vcmRlcih4LmxlZnQsIGtleXMpCiAgICAgICAga2V5cy5hcHBlbmQoeC5rZXkpCiAgICAgICAgc2VsZi5fX2lub3JkZXIoeC5yaWdodCwga2V5cyk=