Cod sursa(job #1387289)

Utilizator teoceltareconstantin teodor teoceltare Data 13 martie 2015 22:37:44
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
unsigned long long v[100010];
int n,m,x;
void citire()
{
    fin>>n;
    for(int a1=1;a1<=n;a1++)
    {
        fin>>v[a1];
    }
    fin>>m;
}
void fct0(int min1,int max1)
{
    int k;
    if(min1!=max1)
    {
        k=(min1+max1)/2;
        if(v[k]==x)
        {
            while(v[k]==x)
            {
                k++;
            }
            fout<<k-1<<'\n';
        }
        else if(v[k]>x)
        {
            fct0(min1,k);
        }
        else
        {
            fct0(k+1,max1);
        }
    }
    else if(v[min1]==x)
    {
            while(v[min1]==x)
            {
                min1++;
            }
            fout<<min1-1<<'\n';
    }
    else fout<<"-1"<<'\n';
}
void fct1(int min1,int max1)
{
    int k;
    if(min1!=max1)
    {
        k=(min1+max1)/2;
        if(v[k]==x)
        {
            while(v[k]==x)
            {
                k++;
            }
            fout<<k-1<<'\n';
        }
        else if(v[k]>x)
        {
            fct1(min1,k);
        }
        else
        {
            fct1(k+1,max1);
        }
    }
    else if(v[min1]==x)
    {
            while(v[min1]==x)
            {
                min1++;
            }
            fout<<min1-1<<'\n';
    }
    else
    {
        if(v[min1]<x)
        {
            fout<<min1<<'\n';
        }
        else fout<<min1-1<<'\n';
    }
}
void fct2(int min1,int max1)
{
    int k;
    if(min1!=max1)
    {
        k=(min1+max1)/2;
        if(v[k]==x)
        {
            while(v[k]==x)
            {
                k--;
            }
            fout<<k+1<<'\n';
        }
        else if(v[k]<x)
        {
            fct2(k+1,max1);
        }
        else
        {
            fct2(min1,k);
        }
    }
    else if(v[min1]==x)
    {
        while(v[min1]==x)
        {
            min1--;
        }
        fout<<min1+1<<'\n';
    }
    else
    {
        if(v[min1]<x) fout<<min1+1<<'\n';
        else fout<<min1<<'\n';
    }
}
int main()
{
    citire();
    int t;
    for(int a=1;a<=m;a++)
    {
        fin>>t>>x;
        if(t==0) fct0(1,n);
        if(t==1) fct1(1,n);
        if(t==2) fct2(1,n);
    }
}