Cod sursa(job #1872986)

Utilizator alexge50alexX AleX alexge50 Data 8 februarie 2017 18:41:36
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>

#define MAX_N 5000


int v[MAX_N];


int algBinarySearchL(int n, int x)
{
    int i, step;

    for(step = 1; step < n; step *= 2)

    i = 0;
    while(step != 0)
    {
        if(i + step < n && v[i + step] <= x)
            i += step;
        step /= 2;
    }

    return i;
}

int algBinarySearchH(int n, int x)
{

    int i, step;

    i = n;
    step = 1;
    while(step < n)
    {
        if(i - step < n && v[i - step] >= x)
            i -= step;
        step *= 2;
    }

    return i;
}



int main()
{
    FILE *fin = fopen("cautbin.in", "r"),
         *fout = fopen("cautbin.out", "w");
    int n;
    int t;

    fscanf(fin, "%d", &n);
    for(int i = 0; i < n; i++)
        fscanf(fin, "%d",  &v[i]);

//    int x = 3;
//
//    printf("%d\n", algBinarySearchL(n, x));
//    printf("%d\n", algBinarySearchH(n, x));

    for(fscanf(fin, "%d", &t); t; t--)
    {
        int c, x;
        fscanf(fin, "%d %d", &c, &x);

        int l = algBinarySearchL(n, x);

        if(c == 0)
            fprintf(fout, "%d\n", v[l] == x ? l + 1 : -1);
        else if(c == 1)
            fprintf(fout, "%d\n", l + 1);
        else if(c == 2)
            fprintf(fout, "%d\n", algBinarySearchH(n, x));

    }


    fclose(fin);
    fclose(fout);
    return 0;
}