Cod sursa(job #2514701)

Utilizator ionuttiplea2001Tiplea Ionut ionuttiplea2001 Data 26 decembrie 2019 17:08:07
Problema Cautare binara Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#define Nmax 100000
using namespace std;
ifstream fi("cautbin.in");
ofstream fo("cautbin.out");
unsigned int v[Nmax];

int c2(int lo,unsigned int x, int hi)
{
    int mid = lo + (hi-lo)/2;
    do
    {
        if(v[mid] <= x)
        {
            lo = mid +1;
        }
        else hi = mid-1;
        mid = lo + (hi-lo)/2;
    }
    while(v[hi] > x );
    return hi;
}
int c1(int lo, unsigned int x, int hi)
{
    int mid = lo + (hi-lo)/2;
    if(hi < lo) return -1;
    if(v[mid] == x) {
         return c2(mid,x,hi);
    }
    else if(v[mid] > x) return c1(lo,x,mid-1);
    else if(v[mid] < x) return c1(mid+1,x,hi);
    return mid;
}

int c3(int lo,unsigned int x, int hi)
{
     int mid = lo + (hi-lo)/2;
    do
    {
       if(v[mid] < x )
       {
           lo = mid+1;
       }
       else hi = mid-1;
        mid = lo + (hi-lo)/2;
    }
    while(v[lo] < x );
    return lo;
}
int caut(int a,unsigned int b,int n)
{
    if(a == 0) return c1(1,b,n);
    if(a == 1) return c2(1,b,n);
    if(a == 2) return c3(1,b,n);
}

int main()
{
    int n;
    fi >> n;
    for(int i = 1; i <= n; i ++)
    {
        fi >> v[i];
    }
    int m;
    fi >> m;
    for(int i = 0; i < m; i ++)
    {
        int a;
        unsigned int b;
        fi >> a >> b;
        fo <<caut(a,b,n) << '\n';
    }
    fi.close();
    fo.close();
    return 0;
}