Cod sursa(job #484143)

Utilizator CossAlbulescu Cosmina Coss Data 12 septembrie 2010 14:42:08
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <stdio.h>
using namespace std;

int v[100001];
int n, m, i, j, k;
int quest, nr;

int cautare0 (int x)
{
    int st, dr, mijl;
    st = 1;
    dr = n;

    while (st <= dr)
    {
        mijl = st + (dr - st) / 2;
        if (v[mijl] == x && v[mijl+1] > x && v[mijl-1] <= x)
            return mijl;
        else if (v[mijl] == x && v[mijl+1] == x)
            st = mijl;
        else if (v[mijl] == x && mijl == n)
            return mijl;
        else if (v[mijl] < x)
            st = mijl + 1;
        else
            dr = mijl - 1;
    }

    return -1;
}

int cautare1 (int x)
{
    int st, dr, mijl;
    st = 1;
    dr = n;

    while (st <= dr)
    {
        mijl = st + (dr - st) / 2;
        if (v[mijl] <= x && v[mijl+1] > x)
            return mijl;
        else if (v[mijl] <= x && v[mijl-1] <= x)
            st = mijl + 1;
        else if (v[mijl] <= x && mijl == 1)
            return mijl;
        else if (v[mijl] < x)
            st = mijl + 1;
        else
            dr = mijl - 1;
    }
}

int cautare2 (int x)
{
    int st, dr, mijl;
    st = 1;
    dr = n;

    while (st <= dr)
    {
        mijl = st + (dr - st) / 2;
        if (v[mijl] == x && v[mijl-1] < x && v[mijl+1] >= x)
            return mijl;
        else if (v[mijl] == x && v[mijl-1] <= x)
            dr = mijl - 1;
        else if (v[mijl] > x)
            dr = mijl - 1;
        else if (v[mijl] < x)
            st = mijl + 1;
    }
}

int main ()
{
    FILE *f = fopen ("cautbin.in","r");
    FILE *g = fopen ("cautbin.out","w");
    fscanf (f,"%d", &n);
    for (i=1; i<=n; ++i)
        fscanf (f,"%d", &v[i]);

    fscanf (f,"%d", &m);
    for (k=1; k<=m; ++k)
    {
        fscanf (f,"%d %d", &quest, &nr);

        if (quest == 0)
            fprintf (g, "%d\n", cautare0 (nr));
        else if (quest == 1)
            fprintf (g, "%d\n", cautare1 (nr));
        else
            fprintf (g, "%d\n", cautare2 (nr));
    }

    fclose (g);
    fclose (f);
    return 0;
}