Cod sursa(job #884297)

Utilizator roparexRoparex roparex Data 20 februarie 2013 20:45:59
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
int n,a[101],m;
int cautbin0(int imin,int imax,int k)
{
        int imid=(imin+imax)/2;
        if(a[imid]>k) return cautbin0(imid,imax,k);
        if(a[imid]<k) return cautbin0(imin,imid,k);
        if(a[imid]==k) {if(a[imid+1]>k){if(imid>0) return imid; else return -1;}else return cautbin0(imid+1,imax,k);}
}
    int cautbin1(int imin,int imax,int k)
{
        int imid=(imin+imax)/2;
        if(a[imid]>k) return cautbin1(imin,imid-1,k);
        if(a[imid]<=k) {if(a[imid+1]>k) return imid; else cautbin1(imid+1,imax,k);}
}
int cautbin2(int imin,int imax,int k)
{
        int imid=(imin+imax)/2;
        if(a[imid]<k) return cautbin2(imid+1,imax,k);
        if(a[imid]>=k
           ){if(a[imid-1]<k) return imid; else return cautbin2(imin,imid-1,k);}
}
int main()
{
    int x,k,i;
    freopen("cautbin.in","rt",stdin);
    freopen("cautbin.out","wt",stdout);
    scanf("%ld",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%ld",&a[i]);
    }
    scanf("%ld",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%ld%ld",&x,&k);
        switch(x)
        {
            case 0:printf("%ld ",cautbin0(1,n,k));break;
            case 1:printf("%ld ",cautbin1(1,n,k));break;
            case 2:printf("%ld ",cautbin2(1,n,k));break;
        }
    }
    return 0;
}