Cod sursa(job #1389002)

Utilizator daniel.grosuDaniel Grosu daniel.grosu Data 15 martie 2015 21:15:11
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <cstdlib>

using namespace std;

ifstream fin("cautbin.in");
ofstream fout("cautbin.out");

int s[100001];
int t; // nr de teste
int n; // length of the serie

int binary(int val)
{
    int i, step;
    for(step=1;step<n;step<<=1);
    
    for(i=0; step; step>>=1)
        if(i+step<n && s[i+step] <= val)
            i+=step;
    return i;
}

int binary2(int val)
{
    int i, step;
    for(step=1;step<n;step<<=1);
    
    for(i=0; step; step>>=1)
        if(i+step<n && s[i+step] < val)
            i+=step;
    return i;
}

int main() {
    fin>>n;
    for(int i=1; i<=n; ++i)
        fin>>s[i];
    
    fin>>t;
    for(;t>0; --t)
    {
        int a,x,i;
        fin>>a>>x;
        switch(a)
        {
            case 0:
                i=binary(x);
                if(s[i]==x)
                    fout<<i;
                else
                    fout<<-1;
                break;
            case 1:
                i=binary(x);
                fout<<i;
                break;
            case 2:
                i=binary2(x);
                fout<<i+1;
                break;
        }
        fout<<"\n";
    }
    return 0;
}