Cod sursa(job #2537028)

Utilizator UtilizatorGBGeorge Bodea UtilizatorGB Data 2 februarie 2020 22:11:29
Problema Cautare binara Scor 10
Compilator py Status done
Runda Arhiva educationala Marime 1.74 kb
f=open('cautbin.in')
n=int(f.readline())
l_elem=[int(x) for x in f.readline().split()]
x=int(f.readline())


def cautare_binara_tip_0(st,dr):
    if st>=dr:
        if l_elem[st]==x:
            return st
        else:
            return -1
    else:
        mij=(st+dr)//2
        if l_elem[mij]==x:
            speranta=cautare_binara_tip_0(mij+1,dr)
            return max(mij,speranta)
        elif l_elem[mij]>x:
            return cautare_binara_tip_0(st,mij-1)
        else:
            return cautare_binara_tip_0(mij+1,dr)

def cautare_binara_tip_1(st,dr):
    if st>=dr:
        if l_elem[st]<=x:
            return st
        return -1
    else:
        mij=(st+dr)//2
        if l_elem[mij]<=x:
            speranta=cautare_binara_tip_1(mij+1,dr)
            return max(mij,speranta)
        elif l_elem[mij]>x:
            return cautare_binara_tip_1(st,mij-1)

def cautare_binara_tip_2(st,dr):
    if st>=dr:
        if l_elem[st]>=x:
            return st
        else:
            return 1<31
    else:
        mij=(st+dr)//2
        if l_elem[mij]>=x:
            speranta=cautare_binara_tip_2(st,mij-1)
            return min(mij,speranta)
        elif l_elem[mij]<x:
            return cautare_binara_tip_2(mij+1,dr)
g=open('cautbin.out','w')
for linie in f:
    linie=linie.split()
    linie[0]=int(linie[0])
    x=int(linie[1])
    if linie[0]==0:
        t=cautare_binara_tip_0(0,len(l_elem)- 1)
        if t!=-1:
            g.write(str(t+1)+'\n')
        else:
            g.write('-1'+ '\n')
    elif linie[0]==1:
        g.write(str(cautare_binara_tip_1(0, len(l_elem) - 1) + 1)+'\n')
    else:
        g.write(str(cautare_binara_tip_2(0, len(l_elem) - 1) + 1)+'\n')
f.close()
g.close()