Cod sursa(job #1374204)

Utilizator StefanMudragMudrag Stefan StefanMudrag Data 5 martie 2015 00:08:10
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<iostream>
#include<fstream>
#define NMAX 100001
#define inf 10000000
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n,m,v[NMAX],mx=0,mn=inf;
void caut0(int st,int dr,int x)
{
         int mij;mx=0;
     while(st<=dr)
     {


         mij=(st+dr)>>1;
         if(x==v[mij])if(mij>mx)mx=mij;
         if(x<v[mij])dr=mij-1;
         if(x>=v[mij])st=mij+1;

     }
    if(mx==0)fout<<-1<<'\n';
    else
        fout<<mx<<'\n';
}
void caut1(int st,int dr,int x)
{  int mij;mx=0;
    while(st<=dr)
    {

        mij=(st+dr)>>1;
        if(x>=v[mij])if(mij>mx)mx=mij;
        if(x<v[mij])dr=mij-1;
        if(x>=v[mij])st=mij+1;


    }
    fout<<mx<<'\n';
}
void caut2(int st,int dr,int x)
{ int mij;mn=inf;
    while(st<=dr)
    {

        mij=(st+dr)>>1;
        if(x<=v[mij])if(mn>mij)mn=mij;
        if(x<=v[mij])dr=mij-1;
        if(x>v[mij])st=mij+1;
    }
    fout<<mn<<'\n';
}

int main()

{
    fin>>n;int op,x;
    for(int i=1;i<=n;i++)
        fin>>v[i];
        fin>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>op;
        if(!op)
            fin>>x,caut0(1,n,x);
        else
            if(op==1)fin>>x,caut1(1,n,x);
        else
            fin>>x,caut2(1,n,x);
    }

    fin.close();
    fout.close();

    return 0;
}