Cod sursa(job #1515670)

Utilizator sing_exFMIGhita Tudor sing_ex Data 1 noiembrie 2015 23:58:14
Problema Cautare binara Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>

int bin1(int *v,int n,int x) {
    int i,j,m;
    i = 1; j = n;
    while (i < j) {
        m = (i + j) / 2;
        if (x == v[m]) {
            m++;
            while (x == v[m]) m++;
            return m-1;
        }
        if (x < v[m]) j = m;
        if (x > v[m]) i = m;
        if (i == j-1) break;
    }
    return -1;
}

int bin2(int *v,int n,int x) {
    int i,j,m;
    i = 1; j = n;
    while (i < j) {
        m = (i + j) / 2;
        if (x == v[m]) {
            m++;
            while (x == v[m]) m++;
            return m-1;
        }
        if (x < v[m]) j = m;
        if (x > v[m]) i = m;
        if (i == j-1) return i;
    }
    return 0;
}

int bin3(int *v,int n,int x) {
    int i,j,m;
    i = 1; j = n;
    while (i < j) {
        m = (i + j) / 2;
        if (x == v[m]) {
            m--;
            while (x == v[m]) m--;
            return m+1;
        }
        if (x < v[m]) j = m;
        if (x > v[m]) i = m;
        if (i == j-1) {
            return j;
        }
    }
    return 0;
}

int main()
{
    FILE *f = fopen("cautbin.in","r");
    FILE *g = fopen("cautbin.out","w");
    int n,m,*v,i,x,y;
    fscanf(f,"%d",&n);
    v = (int*)malloc((n+1)*sizeof(int));
    for (i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    fscanf(f,"%d",&m);
    for (i=0;i<m;i++) {
        fscanf(f,"%d %d",&x,&y);
        if (x == 0) fprintf(g,"%d\n",bin1(v,n,y));
        if (x == 1) fprintf(g,"%d\n",bin2(v,n,y));
        if (x == 2) fprintf(g,"%d\n",bin3(v,n,y));
    }
    fclose(f);
    fclose(g);
    return 0;
}