Cod sursa(job #854963)

Utilizator RamaStanciu Mara Rama Data 14 ianuarie 2013 14:11:22
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>

using namespace std;
FILE*g;
int v[100001];
int n,m;
void do_this(int nr)
{
    int st=1,dr=n;
    int mid;
    mid=st+(dr-st)/2;
    while(st < dr)
    {
        if(v[mid]<=nr)st=mid+1;
           else dr=mid-1;
        mid=st+(dr-st)/2;
    }
    if(v[mid]>nr)mid--;
    if(v[mid]!=nr)fprintf(g,"-1\n");
          else fprintf(g,"%d\n",mid);
}

void do_that(int nr)
{
    int st=1,dr=n;
    int mid;
    mid=st+(dr-st)/2;
    while(st<dr)
    {
        if(v[mid]<=nr) st=mid+1;
           else dr=mid-1;
        mid=st+(dr-st)/2;
    }
    if(v[mid]>nr)mid--;
    fprintf(g,"%d\n",mid);
}

void do_smth(int nr)
{
    int st=1,dr=n;
    int mid;
    mid=st+(dr-st)/2;
    while(st<dr)
    {
        if(v[mid]<nr) st=mid+1;
           else dr=mid-1;
        mid=st+(dr-st)/2;
    }
    if(v[mid]<nr) mid++;
    fprintf(g,"%d\n",mid);
}


int main()
{
    FILE*f;
    f=fopen("cautbin.in","r");
    g=fopen("cautbin.out","w");
    fscanf(f,"%d",&n);
    for(int i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    fscanf(f,"%d",&m);
    int op,x;
    for(int i=1;i<=m;i++)
    {
        fscanf(f,"%d",&op);
        fscanf(f,"%d",&x);
        switch(op)
        {
            case 0: {do_this(x); break;}
            case 1: {do_that(x); break;}
            case 2: {do_smth(x); break;}
        }
    }
    return 0;
}