Cod sursa(job #490321)

Utilizator JulotMMihnea M. JulotM Data 5 octombrie 2010 23:20:03
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include "stdio.h"

using namespace std;

int n,v[100];

int cerinta1(int x)
{
    int p,u,m,maxpoz(0),ok(0);

    p=1;
    u=n;
    while(p<=u)
    {
        m=(p+u)/2;
        if(v[m]==x && m>maxpoz)
        {
            maxpoz=m;
            p=m+1;
            ok=1;
        }
        else
        {
            if(v[m]<x)
                p=m+1;
            else
                u=m-1;
        }
    }

    if(ok==0)
        return 1;
    else
        return maxpoz;
}

int cerinta2(int x)
{
    int p,u,m,maxpoz(0);

    p=1;
    u=n;
    while(p<=u)
    {
        m=(p+u)/2;
        if(v[m]<=x && m>maxpoz)
        {
            maxpoz=m;
            p=m+1;
        }
        else
        {
            if(v[m]<x)
                p=m+1;
            else
                u=m-1;
        }
    }


    return maxpoz;

}

int cerinta3(int x)
{
    int p,u,m,minpoz(0x3f3f3f3f);

    p=1;
    u=n;
    while(p<=u)
    {
        m=(p+u)/2;
        if(v[m]>=x && m<minpoz)
        {
            minpoz=m;
            u=m-1;
        }
        else
        {
            if(v[m]<x)
                p=m+1;
            else
                u=m-1;
        }
    }


    return minpoz;
}


int main()
{
    FILE* f=fopen("cautbin.in","r");
    FILE* g=fopen("cautbin.out","w");

    int x,caz,M,i;

    fscanf(f,"%i",&n);
    for(i=1;i<=n;i++)
        fscanf(f,"%i",&v[i]);
    fscanf(f,"%i",&M);

    for(i=1;i<=M;i++)
    {
        fscanf(f,"%i %i",&caz,&x);
        switch(caz)
        {
            case 0:
                fprintf(g,"%i\n",cerinta1(x));
                break;

            case 1:
                fprintf(g,"%i\n",cerinta2(x));
                break;

            case 2:
                fprintf(g,"%i\n",cerinta3(x));
                break;
        }
    }
    return 0;
}