Cod sursa(job #912042)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 12 martie 2013 01:01:57
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <cstdio>
FILE *f=fopen("cautbin.in","r");
FILE *g=fopen("cautbin.out","w");
using namespace std;
int n,v[100001],times,operation,poz;
int bs0(int elem) // cautare binara pt caz 0
{
    int li,lf,m;
    li=1;lf=n,m=(li+lf)/2;
    while(li<=lf)
    {
        if(v[m]<elem)
            li=m+1;
        else
            if(v[m]>elem)
                lf=m-1;
            else
                if(v[m]==elem)
                    {
                        while(v[m+1]==elem) m++;
                        return m;
                    }
        m=(li+lf)/2;
    }
    if(li>lf)
        return -1;

}
int bs1(int elem) // cautare binara caz 1
{
    int li,lf,m;
    li=1;lf=n,m=(li+lf)/2;
    while(li<=lf)
    {
        if(v[m]<elem)
            li=m+1;
        else
            if(v[m]>elem)
                lf=m-1;
            else
                if(v[m]==elem)
                    {
                        while(v[m+1]==elem) m++;
                        return m;
                    }
        m=(li+lf)/2;
    }
    if(li>lf)
        return lf;

}
int bs2(int elem) // cautare binara caz 2
{
    int li,lf,m;
    li=1;lf=n,m=(li+lf)/2;
    while(li<=lf)
    {
        if(v[m]<elem)
            li=m+1;
        else
            if(v[m]>elem)
                lf=m-1;
            else
                if(v[m]==elem)
                    {
                        while(v[m-1]==elem) m--; // cautam cea mai mica poz care comvine
                        return m;
                    }
        m=(li+lf)/2;
    }
    if(li>lf)
        return li; // li va fi > lf => li=primu' elem>m deci va fi elem cautat

}

int main()
{
    fscanf(f,"%d",&n);
    int i,sol;
    for(i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    fscanf(f,"%d",&times);
    for(i=1;i<=times;i++)
    {
        fscanf(f,"%d%d",&operation,&poz);
        if(operation==0)
            sol=bs0(poz);
        else
            if(operation==1)
                sol=bs1(poz);
             else
                if(operation==2)
                    sol=bs2(poz);

        fprintf(g,"%d\n",sol);
    }
    return 0;
}