Cod sursa(job #3001262)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 13 martie 2023 14:05:27
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

///#include <tryhardmode>
///#include <GODMODE::ON>
///PRACTICE

using namespace std;

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

const int NMAX=5e5+5;
int v[NMAX];

int lower_b(int x,int st,int dr)
{
    int mij,ans=-1;
    while(st<=dr)
    {
        mij=st+dr;
        mij/=2;
        if(v[mij]<=x)
        {
            st=mij+1;
            if(v[mij]==x)
                ans=mij;
        }
        else
            dr=mij-1;
    }
    return ans;
}

int lower_b2(int x,int st,int dr)
{
    int mij,ans=-1;
    while(st<=dr)
    {
        mij=st+dr;
        mij/=2;
        if(v[mij]<=x)
        {
            st=mij+1;
            ans=mij;
        }
        else
            dr=mij-1;
    }
    return ans;
}

int upper_b(int x,int st,int dr)
{
    int mij,ans;
    while(st<=dr)
    {
        mij=st+dr;
        mij/=2;
        if(v[mij]>=x)
        {
            dr=mij-1;
            ans=mij;
        }
        else
            st=mij+1;
    }
}

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