Cod sursa(job #1774575)

Utilizator MirceaTMircea Timpuriu MirceaT Data 9 octombrie 2016 07:12:05
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
using namespace std;
int n,v[100020],up,down,mid,log;
int lo(int x)
{
    int poz=0;
    for(int i=log;i>=0;i--)
        if(poz+(1<<i)<=n && v[poz+(1<<i)]<x)
        {
            poz+=1<<i;
        }
    return poz+1;
}

int hi(int x)
{
    int poz=0;
    for(int i=log;i>=0;i--)
        if(poz+(1<<i)<=n && v[poz+(1<<i)]<=x) poz+=1<<i;
    return poz;
}

int main()
{
    int h,i,j,k,a,b,m;
    ifstream fin ("cautbin.in");
    ofstream fout ("cautbin.out");
    fin>>n;
    for(i=1;i<=n;++i)
    {
        fin>>v[i];
    }
    fin>>m;
     for(log=1;(1LL<<log)<=n;log++);log--;
    for(i=1;i<=m;++i)
    {
        fin>>a>>b;
       if(a==1)
       {
           fout<<hi(b)<<endl;
       }
       else if(a==2)
       {
           fout<<lo(b)<<endl;
       }
       else
       {
           h=hi(b);
           if(v[h]==b)
           {
               fout<<h<<endl;
           }
           else
           {
               fout<<"-1"<<endl;
           }
       }


    }
    return 0;
}