Cod sursa(job #2092967)

Utilizator mihaicivMihai Vlad mihaiciv Data 22 decembrie 2017 17:57:09
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <fstream>
#define nmax 100001
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int n,v[nmax];
int cautarebin(int st,int dr,int x)
{
    if (st>dr)
    {
        return -1;
    }
    else if (st==dr)
    {
        if (v[st]==x)
        {
            return st;
        }
        else return -1;
    }
    else
    {
        int m=(st+dr)/2;
        if (v[m]==x)
        {
            return max(m,cautarebin(m+1,dr,x));
        }
        else if (v[m]>x)
        {
            //cout<<st<<" "<<dr<<"\n";
            return cautarebin(st,m,x);
        }
        else if (v[m]<x)
        {
            return cautarebin(m+1,dr,x);
        }
    }
}
void reza()
{
    int val;
    f>>val;
    g<<cautarebin(1,n,val)<<"\n";
}
int cautarebin2(int st,int dr,int x)
{
    //cout<<st<<" "<<dr<<"\n";
    if (st==dr)
    {
        if (v[st]<=x)
        {
            return st;
        }
        else return -1;
    }
    else
    {
        int m=(st+dr)/2;
        if (v[m]==x && v[m+1]!=x)
        {
            return m;
        }
        else
        {
            if (x>v[m])
            {
                return max(cautarebin2(m+1,dr,x),m);
            }
            else
            {
                cautarebin2(st,m,x);
            }
        }
    }
}
void rezb()
{
    int val;
    f>>val;
    g<<cautarebin2(1,n,val)<<"\n";
}
int cautarebin3(int st,int dr,int x)
{
    if (st==dr)
    {
        return st;
    }
    else
    {
        int m=(st+dr)/2;
        if (v[m]==x && v[m-1]!=x)
        {
            return m;
        }
        else
        {
            if (v[m]>=x)
            {
                cautarebin3(st,m,x);
            }
            else
            {

                return cautarebin3(m+1,dr,x);
            }
        }
    }
}
void rezc()
{
    int val;
    f>>val;
    g<<cautarebin3(1,n,val)<<"\n";
}
void citire()
{
   f>>n;
   for (int i=1;i<=n;i++)
   {
       f>>v[i];
   }
   int q,x;
   f>>q;
   for (int i=1;i<=q;i++)
   {
       f>>x;
       if (x==0)
       {
           reza();
       }
       else if (x==1)
       {
           rezb();
       }
       else rezc();
   }
}
int main()
{
    citire();
    return 0;
}