Cod sursa(job #1168523)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 8 aprilie 2014 20:19:23
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
using namespace std;
static const int NMAX=100005;
int main()
{
    int n,m,v[NMAX],i,t,nr,l,dr,mid,sol;
    fstream f("cautbin.in",ios::in),g("cautbin.out",ios::out);
    f>>n;
    for(i=1; i<=n; ++i) f>>v[i];
    f>>m;
    for(i=1; i<=m; ++i)
    {
        f>>t>>nr;
        l=1;
        dr=n;
        sol=-1;
        if(!t)
        {
            while(v[l]<=nr&&v[dr]>=nr)
            {
                mid=(v[dr]!=v[l]) ? l+((nr-v[l])*(dr-l))/(v[dr]-v[l]) : 0;
                if(v[mid]<nr) l=mid+1;
                else if(v[mid]>nr) dr=mid-1;
                else
                {
                    sol=mid;
                    l=mid+1;
                }
            }
            if(v[l]==nr) sol=l;
            g<<sol<<'\n';
        }
        else if(t==1)
        {
            while(v[l]<=nr&&v[dr]>=nr)
            {
                mid=(v[dr]!=v[l]) ? l+((nr-v[l])*(dr-l))/(v[dr]-v[l]) : 0;
                if(v[mid]<=nr)
                {
                    l=mid+1;
                    sol=mid;
                }
                else dr=mid-1;
            }
            if(v[l]<=nr) sol=l;
            g<<sol<<'\n';
        }
        else
        {
            while(v[l]<=nr&&v[dr]>=nr)
            {
                mid=(v[dr]!=v[l]) ? l+((nr-v[l])*(dr-l))/(v[dr]-v[l]) : 0;
                if(v[mid]<nr) l=mid+1;
                else
                {
                    dr=mid-1;
                    sol=mid;
                }
            }
            if(v[dr]>=nr) sol=dr;
            g<<sol<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}