Cod sursa(job #2690950)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 26 decembrie 2020 15:18:42
Problema Cautare binara Scor 10
Compilator py Status done
Runda Arhiva educationala Marime 1.47 kb
def read_gen(filename):
    with open(filename, 'rt') as fin:
        for line in fin:
            for x in line.split():
                yield int(x)

def bs_bigger_or_none(v, x):
    n = len(v)
    step = 1
    while step <= n: step <<= 1
    
    pos = 1
    while step > 0:
        if pos + step <= n and v[pos + step] <= x:
            pos += step
        step >>= 1
    return pos if v[pos] == x else -1


def bs_less_or_equal(v, x):
    n = len(v)
    step = 1
    while step <= n:    step <<= 1
    
    pos = 1
    while step > 0:
        if pos + step <= n and v[pos + step] <= x:
            pos += step
        step >>= 1
    return pos if v[pos] <= x else -1

def bs_least_greater(v, x):
    n = len(v)
    step = 1
    while step <= n: step <<= 1

    pos = 1
    while step > 0:
        if pos + step <= n and v[pos + step] < x:
            pos += step
        step >>= 1
    
    return -1 if pos == n else pos + 1

if __name__ == '__main__':
    it = read_gen(filename='cautbin.in')
    n = next(it)
    v = [0] + [next(it) for _ in range(n)]

    with open('cautbin.out', 'wt') as fout:
        m = next(it)
        for _ in range(m):
            t, x = next(it), next(it)
            if t == 0:
                ans = bs_bigger_or_none(v, x)
            elif t == 1:
                ans = bs_less_or_equal(v, x)
            elif t == 2:
                ans = bs_least_greater(v, x)
            fout.write('{0}\n'.format(ans))