Cod sursa(job #2884021)

Utilizator FredyLup Lucia Fredy Data 2 aprilie 2022 11:26:35
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define limn 100001
int v[limn];
int n, m;

/// cea mai mare pozitie pe care se afla un element cu valoarea val
/// sau -1 daca aceasta valoare nu se gaseste in sir
int query0(int val)
{
    int mask, pos;
    /// construim masca initiala
    for(mask = 1; mask <= n; mask <<= 1);
    mask >>= 1;

    ///construim pozitia
    pos = 0;
    for(; mask; mask >>=1){
        if(pos+mask <= n && v[pos+mask]<=val)
            pos += mask;
    }

    if(v[pos] == val)
        return pos;
    return -1;
}

/// cea mai mare pozitie pe care se afla un element cu valoarea
/// mai mica sau egala cu x in sir
int query1(int val){
    int mask, pos;
    /// construim masca initiala
    for(mask = 1; mask <= n; mask <<= 1);
    mask >>= 1;

    ///construim pozitia
    pos = 0;
    for(; mask; mask >>=1){
        if(pos+mask <= n && v[pos+mask]<=val)
            pos += mask;
    }
    return pos;
}

/// cea mai mica pozitie pe care se afla un element cu
/// valoarea mai mare sau egala cu VAL in sir
int query2(int val){
     int mask, pos;
    /// construim masca initiala
    for(mask = 1; mask <= n; mask <<= 1);
    mask >>= 1;

    ///construim pozitia
    pos = n;
    for(; mask; mask >>=1){
        if(pos-mask >= 1 && v[pos-mask]>=val)
            pos -= mask;
    }
    return pos;
}

int main()
{
    int tipq, val;
    fin>>n;
    for(int i = 1; i <= n; i++)
        fin>>v[i];
    fin>>m;
    while(m--){
        fin>>tipq>>val;
        if(tipq == 0)
            fout<<query0(val)<<'\n';
        else if(tipq == 1)
            fout<<query1(val)<<'\n';
        else if(tipq == 2)
            fout<<query2(val)<<'\n';
    }

    fin.close();
    return 0;
}