Cod sursa(job #1160960)

Utilizator BologaDragosBologa Dragos BologaDragos Data 30 martie 2014 22:11:44
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <fstream>

using namespace std;

ifstream f("cautbin.in") ;
ofstream g("cautbin.out") ;

int v[100001],k,n ;

int cautare0(int k)
{
    int p,u,i,mij ;
    for(i=1;i<=4;i++)
        if(v[i]==k)
        {
            while(v[i]==k)
                i++ ;
            return i-1 ;
        }
    for(i=n;i>=n-4;i--)
        if(v[i]==k)
            return i ;
    p=1 ;
    u=n ;
    while(p<u)
    {
        mij=p+(u-p)/2 ;
        if(v[mij]==k)
        {
            while(v[mij]==k)
                mij++ ;
            return mij-1 ;
        }
        if(v[mij]<k)
            p=mij+1 ;
        else
            u=mij-1 ;
    }
    return -1 ;

}

int cautare1(int k)
{
    int p,u,i,mij,max ;
    for(i=1;i<=4;i++)
        if(v[i]>k)
            return i-1 ;
    for(i=n;i>=n-4;i--)
        if(v[i]<=k)
            return i ;
    p=1 ;
    u=n ;
    while(p<u)
    {
        mij=p+(u-p)/2 ;
        if(v[mij]==k)
        {
            while(v[mij]==k)
                mij++ ;
            return mij-1 ;
        }
        if(v[mij]<k)
        {
            p=mij+1 ;
            max=mij ;
        }
        else
            u=mij-1 ;
    }
    return max ;
}

int cautare2(int k)
{
    int p,u,i,mij,max ;
    for(i=1;i<=4;i++)
        if(v[i]>=k)
            return i ;
    for(i=n;i>=n-4;i--)
    {
        if(v[i]==k)
        {
            while(v[i]==k)
                i-- ;
            return i+1 ;
        }
        if(v[i]<k)
            return i ;
    }
    p=1 ;
    u=n ;
    while(p<u)
    {
        mij=p+(u-p)/2 ;
        if(v[mij]==k)
        {
            while(v[mij]==k)
                mij++ ;
            return mij-1 ;
        }
        if(v[mij]<k)
            p=mij+1 ;
        else
        {
            u=mij-1 ;
            max=mij ;
        }
    }
    return max ;
}

int main()
{
    int i,a,m ;
    f>>n ;
    for(i=1;i<=n;i++)
        f>>v[i] ;
    f>>m ;
    for(i=1;i<=m;i++)
    {
        f>>a>>k ;
        if(a==0)
            g<<cautare0(k)<<"\n" ;
        if(a==1)
            g<<cautare1(k)<<"\n" ;
        if(a==2)
            g<<cautare2(k)<<"\n" ;
    }
    return 0;
}