Cod sursa(job #1517627)

Utilizator sing_exFMIGhita Tudor sing_ex Data 4 noiembrie 2015 17:24:15
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.87 kb
#include <stdio.h>
#include <stdlib.h>

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

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