Cod sursa(job #1767176)

Utilizator jason2013Andronache Riccardo jason2013 Data 28 septembrie 2016 19:37:34
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<bits/stdc++.h>
#define NMax 100100
using namespace std;

ofstream out("cautbin.out");

//array
int v[NMax];

//variables
int n,m,x,y;

//Function
int first();
int sec();
int third();
int midd(int x, int y);

int main()
{
    ifstream in("cautbin.in");
    in>>n;
    for(int i = 1; i<=n; i++)
        in>>v[i];
    in>>m;
    for(int i = 1; i<=m; i++)
    {
        in>>x>>y;
        if(x == 0)
           out<< first() << "\n";
        if(x == 1)
           out<< sec() <<"\n";
        if(x == 2)
           out<< third() <<"\n";
    }
}

int first()
{
    int l, r, midd;
    l = 1; r = n;
    while( l < r )
    {
        midd = (l + r) / 2;
        if(v[midd] <= y)
            l = midd + 1;
        else
            r = midd - 1;
    }

    if(v[midd] > y )
        midd = midd - 1;
    if(v[midd] == y) return midd;
    return -1;
}

int cMidd(int x, int y){
    return (x+y)/2;
}

int sec()
{
    int l = 1, r = n, midd;
    while(l < r)
    {
        midd = cMidd(l, r);
        if(v[midd] < y)
            l = midd + 1;
        else
            r = midd;
    }
    midd = cMidd(l, r);
    if(v[midd] > y) midd --;
    return midd;
}

int third()
{
    int l = 1, r = n, midd;
    while(l < r)
    {
        midd = cMidd(l, r);
        if(v[midd] < y)
            l = midd + 1;
        else
            r = midd - 1;
    }
    midd = cMidd(l, r);
    if(v[midd] < y && midd < n)
        midd++;
    if(v[midd] < y)
        --midd;
    return midd;
}