# your code goes here
def orderStat( A, l, r, K) :
k = K - 1
#if l == r:
# return A[l]
if r - l <= 25 :
order5( A, l, r)
return ( A[ k] )
m = ( r - l) //5 + 1
#test
print ( 'm is' , m)
#
B = [ ]
for i in range ( m) :
B[ i] = orderStat( A, 5 *i, min ( 5 *i+4 , len ( A) -1 ) , 3 )
mom = orderStat( B, 0 , len ( B) -1 , len ( B) //2 )
p = partition( A, l, r)
pl = p - l + 1
if k < pl:
return orderStat( A, l, p-1 , K)
elif k > pl:
return orderStat( A, p+1 , r, K - p -1 )
else :
return mom
pass
def partition( A, l, r) :
x = A[ l]
i = l
for j in range ( l+1 , r) :
if A[ j] <= x:
i += 1
A[ i] , A[ j] = A[ j] , A[ i]
A[ i] , A[ l] = A[ l] , A[ i]
return i
pass
# Return the approximate median among elements A[l ... r]
def approxMed( A, l, r) :
pass
# Rearrange A[start, start+1, ..., min(start+4, len(A)-1)] in ascending order
def order5( A, start, stop) :
i = start+1
for i in range ( start+1 , min ( stop+1 , len ( A) ) ) :
j = i
while start+1 <= j and A[ j-1 ] > A[ j] :
A[ j-1 ] , A[ j] = A[ j] , A[ j-1 ]
j -= 1
list = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 14 , 15 , 16 , 18 , 19 , 20 , 22 , 26 , 28 , 29 , 30 , 37 , 38 , 39 , 50 , 52 , 127 , 46 , 48 ]
#result = order5(list, 0, len(list)-1)
result = orderStat( list , 0 , len ( list ) -1 , 5 )
print ( result)
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCmRlZiBvcmRlclN0YXQoQSwgbCwgciwgSyk6CiAgICBrID0gSyAtIDEKICAgICNpZiBsID09IHI6CiAgICAjICAgIHJldHVybiBBW2xdCiAgICBpZiByIC0gbCA8PSAyNToKICAgICAgICBvcmRlcjUoQSwgbCwgcikKICAgICAgICByZXR1cm4oQVtrXSkKICAgIG0gPSAociAtIGwpLy81ICsgMQogICAgI3Rlc3QKICAgIHByaW50KCdtIGlzJywgbSkKICAgICMKICAgIEIgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UobSk6CiAgICAgICAgQltpXSA9IG9yZGVyU3RhdChBLCA1KmksIG1pbig1KmkrNCxsZW4oQSktMSksIDMpCiAgICBtb20gPSBvcmRlclN0YXQoQiwgMCwgbGVuKEIpLTEsIGxlbihCKS8vMikKIAogICAgcCA9IHBhcnRpdGlvbihBLCBsLCByKQogICAgcGwgPSBwIC0gbCArIDEKIAogICAgaWYgayA8IHBsOgogICAgICAgIHJldHVybiBvcmRlclN0YXQoQSwgbCwgcC0xLCBLKQogICAgZWxpZiBrID4gcGw6CiAgICAgICAgcmV0dXJuIG9yZGVyU3RhdChBLCBwKzEsIHIsIEsgLSBwIC0xKSAgICAgCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtb20KICAgIHBhc3MKIApkZWYgcGFydGl0aW9uKEEsIGwsIHIpOgogICAgeCA9IEFbbF0KICAgIGkgPSBsCiAgICBmb3IgaiBpbiByYW5nZShsKzEsIHIpOgogICAgICAgIGlmIEFbal0gPD0geDoKICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgIEFbaV0sQVtqXSA9IEFbal0sQVtpXQogICAgQVtpXSxBW2xdID0gQVtsXSxBW2ldCiAKICAgIHJldHVybiBpCiAKICAgIHBhc3MKIyBSZXR1cm4gdGhlIGFwcHJveGltYXRlIG1lZGlhbiBhbW9uZyBlbGVtZW50cyBBW2wgLi4uIHJdCmRlZiBhcHByb3hNZWQoQSwgbCwgcik6CiAgICBwYXNzCiAKIyBSZWFycmFuZ2UgQVtzdGFydCwgc3RhcnQrMSwgLi4uLCBtaW4oc3RhcnQrNCwgbGVuKEEpLTEpXSBpbiBhc2NlbmRpbmcgb3JkZXIKZGVmIG9yZGVyNShBLCBzdGFydCwgc3RvcCk6CiAgICBpID0gc3RhcnQrMQogICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnQrMSwgbWluKHN0b3ArMSwgbGVuKEEpKSk6CiAgICAgICAgaiA9IGkKICAgICAgICB3aGlsZSBzdGFydCsxPD1qIGFuZCBBW2otMV0+QVtqXToKICAgICAgICAgICAgQVtqLTFdLEFbal0gPSBBW2pdLEFbai0xXQogICAgICAgICAgICBqIC09IDEKIApsaXN0ID0gWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDE0LDE1LDE2LDE4LDE5LDIwLDIyLDI2LDI4LDI5LDMwLDM3LDM4LDM5LDUwLDUyLDEyNyw0Niw0OF0KI3Jlc3VsdCA9IG9yZGVyNShsaXN0LCAwLCBsZW4obGlzdCktMSkKcmVzdWx0ID0gb3JkZXJTdGF0KGxpc3QsIDAsIGxlbihsaXN0KS0xLCA1KQpwcmludChyZXN1bHQp