Cod sursa(job #1107609)

Utilizator FlowstaticBejan Irina Flowstatic Data 13 februarie 2014 23:47:16
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
using namespace std;

FILE* fin=fopen("cautbin.in","r");
FILE* fout=fopen("cautbin.out","w");
int vec[100005];

int cauta0 (int nr) ;
int cauta1 (int nr);
int cauta2 (int nr);
int n;
int main ()
{
    int i,m,q,x;
    fscanf(fin,"%d", &n);
    for (i=1; i<=n; ++i)
        fscanf(fin,"%d", &vec[i]);
    fscanf(fin,"%d", &m);
    for(i=1;i<=m;i++)
    {
          fscanf(fin,"%d %d",&q, &x);
          if(q==1)
             fprintf(fout,"%d\n",cauta0(x));
          if (q==1)
             fprintf(fout,"%d\n",cauta1(x));
          if (q==2)
             fprintf(fout,"%d\n",cauta2(x));
    }
    return 0;
}

int cauta0 (int nr)
{
     int st, fi, mid;
    for (st = 1,fi = n;st <= fi; )
    {
        mid = st + (fi-st) / 2;
        if (nr < vec[mid]) fi = mid-1;
        else if (vec[mid] < nr) st = mid+1;
        else return mid;
    }
    return -1;
}

int cauta1 (int nr)
{
    int st, fi, mid, last = 0;
    for (st = 1, fi = n; st <= fi; )
    {
        mid = st + (fi-st) / 2;
        if (vec[mid] <= nr) last = mid, st = mid+1;
        else fi = mid-1;
    }
    return last;
}

int cauta2 (int nr)
{
  int st, fi, mid, last = n+1;

    for (st = 1, fi = n; st <= fi; )
    {
        mid = st + (fi-st) / 2;
        if (nr <= vec[mid]) last = mid, fi = mid-1;
        else st = mid+1;
    }
    return last;
}