Cod sursa(job #2374163)

Utilizator PopeangaMihneaPopeanga Mihnea- Stefan PopeangaMihnea Data 7 martie 2019 17:17:18
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

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

int n, t, tip, nr;
int x[100001];

int bs0(int st, int dr, int nr)
{
    int m;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(x[m]<=nr) st=m+1;
        else dr=m-1;
    }
    m=(st+dr)/2;
    if(x[m]>nr) --m;
    if(x[m]==nr) return m;
    return -1;
}

int bs1(int st, int dr, int nr)
{
    int m;
    while(st<dr)
    {
        m=(st+dr)/2;
        if(x[m]<=nr) st=m+1;
        else dr=m;
    }
    m=(st+dr)/2;
    if(x[m]>nr) --m;
    return m;
}

int bs2(int st, int dr, int nr)
{
    int m;
    while(st<dr)
    {
        m=(st+dr)/2;
        if(x[m]<nr) st=m+1;
        else dr=m;
    }
    m=(st+dr)/2;
    if(x[m]<nr) ++m;
    return m;
}

int main()
{
    fin>>n;
    for(int i=1; i<=n; ++i) fin>>x[i];
    fin>>t;
    for(int q=1; q<=t; ++q)
    {
        fin>>tip>>nr;
        if(tip==0)
        {
            int poz=upper_bound(x+1, x+n+1, nr)-x-1;
            if(poz>=1 && poz<=n && x[poz]==nr) fout<<poz<<"\n";
            else fout<<"-1\n";
        }
        if(tip==1)
        {
            int poz=upper_bound(x+1, x+n+1, nr)-x-1;
            fout<<poz<<"\n";
        }
        if(tip==2)
        {
            int poz=lower_bound(x+1, x+n+1, nr)-x;
            fout<<poz<<"\n";
        }
    }
    return 0;
}