Cod sursa(job #2076720)

Utilizator FredyLup Lucia Fredy Data 26 noiembrie 2017 23:49:36
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 100010
int t,a,b,n,ini[lim];

/// returneaza cea mai mare poz pe care e x in sir sau -1 daca nu e
int sol0 (int x)
{
    int mask, pos=0;
    for (mask=1; mask<n; mask<<=1);
    for (; mask; mask>>=1)
        if (pos+mask<=n)
            if (ini[pos+mask]<=x)
                pos+=mask;
    if (ini[pos]==x)    return pos;
    return -1;
}

/// returneaza cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir
int sol1 (int x)
{
    int mask, pos=0;
    for (mask=1; mask<n; mask<<=1);
    for (; mask; mask>>=1)
        if (pos+mask<=n)
            if (ini[pos+mask]<=x)
                pos+=mask;
    return pos;
}

/// returneaza cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir
int sol2 (int x)
{
    int mask, pos=0;
    for (mask=1; mask<n; mask<<=1);
    for (pos=n; mask; mask>>=1)
        if (pos-mask>=0)
            if (ini[pos-mask]>=x)
                pos-=mask;
    return pos;
}

int main()
{
    fin>>n;
    for (int i=1; i<=n; i++)
        fin>>ini[i];
    fin>>t;
    while (t--)
    {
        fin>>a>>b;
        if (a==0)
            fout<<sol0(b)<<'\n';
        if (a==1)
            fout<<sol1(b)<<'\n';
        if (a==2)
            fout<<sol2(b)<<'\n';
    }

    return 0;
}