Cod sursa(job #1050679)

Utilizator rcalitaCalita Raluca rcalita Data 8 decembrie 2013 22:52:18
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int v[100000];
void cautbin1(int low, int high, int x)
{ //0 x - cea mai mare pozitie pe care se afla un element cu valoarea x
  //sau -1 daca aceasta valoare nu se gaseste in sir
    int gasit=0,mid;
    mid=low+(high-low)/2;
    if(v[mid]==x)
    {
        while(v[mid+1]==x)
            mid=mid+1;
        g<<mid<<endl;
        gasit=1;
    }
    if(v[mid]<x)
        cautbin1(1,mid,x);
    if(v[mid]>x)
        cautbin1(mid,1,x);
    if(gasit==0)
        g<<-1<<endl;
}
/*1 x - cea mai mare pozitie pe care se afla un
element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca
cel mai mic numar al sirului este mai mic sau egal decat x */
void cautbin2(int low, int high, int x)
{
    int gasit=0,mid;
    mid=low+(high-low)/2;
    if(v[mid]<=x)
    {
        while(v[mid+1]<=x)
            mid=mid+1;
        g<<mid<<endl;
        gasit=1;
    }
    if(v[mid]<x)
        cautbin1(1,mid,x);
    if(v[mid]>x)
        cautbin1(mid,1,x);
    if(gasit==0)
        g<<-1<<endl;
}
/*2 x - cea mai mica pozitie pe care se afla un element cu valoarea
mai mare sau egala cu x in sir. Se garanteaza ca
cel mai mare numar din sir este mai mare sau egal decat x*/
void cautbin3(int low, int high, int x)
{
    int gasit=0,mid;
    mid=low+(high-low)/2;
    if(v[mid]>=x)
    {
        while(v[mid-1]>=x)
            mid=mid-1;
        g<<mid<<endl;
        gasit=1;
    }
    if(v[mid]<x)
        cautbin1(1,mid,x);
    if(v[mid]>x)
        cautbin1(mid,1,x);
    if(gasit==0)
        g<<-1<<endl;
}
int main()
{
    int n,i,nr_i,x,y;
    f>>n;
    for(i=1;i<=n;i++)
        f>>v[i];
    f>>nr_i;
    for(i=1;i<=nr_i;i++)
    {
        f>>x;
        f>>y;
        if(x==0)
            cautbin1(1,n,y);
        if(x==1)
            cautbin2(1,n,y);
        if(x==2)
            cautbin3(1,n,y);
    }
    return 0;
}