Cod sursa(job #540751)

Utilizator SadmannCornigeanu Calin Sadmann Data 24 februarie 2011 12:50:09
Problema Generare de permutari Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>
FILE *in,*out;
int n,m,i,tip,val;
long int v[100001];

int bsearch0(int,int,long int);
int bsearch1(int,int,long int);
int bsearch2(int,int,long int);

int main()
{
    in=fopen("cautbin.in","rt");
    out=fopen("cautbin.out","wt");
    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(in,"%ld",&v[i]);
    fscanf(in,"%d",&m);
    while(m--)
    {
        fscanf(in,"%d %d",&tip,&val);
        if(!tip)
            fprintf(out,"%d\n",bsearch0(1,n,val));
        if(tip==1)
            fprintf(out,"%d\n",bsearch1(1,n,val));
        if(tip==2)
            fprintf(out,"%d\n",bsearch2(1,n,val));
    }

    return 0;
}

int bsearch0(int st,int dr,long int key)
{
    int mid;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(v[mid]<=key)
            st=mid+1;
        else
            dr=mid-1;
    }
    mid=(st+dr)/2;
    if(v[mid]>key)
        mid--;
    if(v[mid]==key)
        return mid;
    return -1;
}

int bsearch1(int st,int dr,long int key)
{
    int mid;
    while(st<dr)
    {
        mid=(st+dr)/2;
        if(v[mid]<=key)
            st=mid+1;
        else
            dr=mid-1;
    }
    mid=(st+dr)/2;
    if(v[mid]>key)
        mid--;
    return mid;
}

int bsearch2(int st,int dr,long int key)
{
    int mid;
    while(st<dr)
    {
        mid=(st+dr)/2;
        if(v[mid]<key)
            st=mid+1;
        else
            dr=mid-1;
    }
    mid=(st+dr)/2;
    if(v[mid]<key)
        mid++;
    return mid;
}