Cod sursa(job #2418373)

Utilizator ViAlexVisan Alexandru ViAlex Data 4 mai 2019 19:13:15
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
int n,m,elem[100000];
void read()
{
    in>>n;
    for(int i=0; i<n; i++)
    {
        in>>elem[i];
    }
}
int f1(int x)
{
    int index=-1;
    int st=0,dr=n-1,middle,aux;
    while(st<dr)
    {
        middle=(st+dr)/2;
        aux=elem[middle];
        if(aux==x)
            index=max(index,middle);
        if(aux<=x)
            st=middle+1;
        else if(aux>x)
            dr=middle;
        if(st==dr &&elem[st]==x)
        {
            index=max(index,st);
        }
    }
    return index;
}
int f2(int x)
{
    int st=0,dr=n-1,middle,aux;
    int to_return=-1;
    while(st<dr)
    {
        middle=(st+dr)/2;
        aux=elem[middle];
        if(aux<=x)
        {
            to_return=max(to_return,middle);
        }
        if(x>aux)
        {
            st=middle+1;
        }
        else
            dr=middle;
    }
    if(elem[st]<=x)
        to_return=max(to_return,st);
    return to_return;
}
int f3(int x)
{
    int st=0,dr=n-1,middle,aux;
    while(st<dr)
    {
        middle=(st+dr)/2;
        aux=elem[middle];
        if(x>aux)
        {
            st=middle+1;
        }
        else
            dr=middle;
    }
    return st;
}
void solve()
{
    int aux,tip;
    in>>m;
    for(int i=0; i<m; i++)
    {
        in>>tip>>aux;
        if(tip==0)
        {
            int p=f1(aux);
            if(p==-1)
                out<<-1<<'\n';
            else
                out<<p+1<<'\n';
        }
        else if(tip==1)
        {
            out<<f2(aux)+1<<'\n';
        }
        else
            out<<f3(aux)+1<<'\n';
    }
}
int main()
{
    read();
    solve();
}