Cod sursa(job #2544535)

Utilizator dvp123Pescariu David dvp123 Data 12 februarie 2020 10:51:13
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <cmath>
#define LIM 1000001
using namespace std;

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

int n;
int v[LIM];
int m;
int a,b;

int cerinta0(int nr){
    int poz = 0;

    for(int p = pow(2, 30); p > 0; p /= 2){
        if(poz + p <= nr && v[poz + p] <= nr){
            poz += p;
            
        }
    }

    if(v[poz] != nr){
        return -1;
    }
    
    while(v[poz + 1] == nr){
                ++poz;
            }

    return poz;
}

int cerinta1(int nr){
    int poz = 0;

    for(int p = pow(2, 30); p > 0; p /= 2){
        if(poz + p <= nr && v[poz + p] <= nr){
            poz += p;
            
        }
    }

    if(v[poz] != nr){
        return -1;
    }
    
    while(v[poz + 1] <= nr){
                ++poz;
            }
    
    return poz;
}

int cerinta2(int nr){
    int poz = 0;
    
    for(int p = 1; p < pow(2, 30); p *= 2){
        if(poz + p <= nr && v[poz + p] <= nr){
            poz += p;
            
        }
    }

    if(v[poz] != nr){
        return -1;
    }
    
    while(v[poz - 1] == nr){
                --poz;
            }

    return poz;
}

int main(){
    fin >> n;
    for(int i=1; i<=n; ++i){
        fin >> v[i];
    }
    fin >> m;
    for(int i=0; i<m; ++i){
        fin >> a >> b;
        /// a - cerinta | b - nr cautat
        if(a == 0){
            fout << cerinta0(b) << "\n";
        }else if(a == 1){
            fout << cerinta1(b) << "\n";
        }else{
            fout << cerinta2(b) << "\n";
        }
    }


    return 0;
}