Cod sursa(job #3250456)

Utilizator EdaterHunterDavid Horia EdaterHunter Data 21 octombrie 2024 09:40:08
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>

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

struct cerinte{
    int index;
    int nr;
};

int cerinta_0(int *sir, int nr, int n){
    int dr = n, st = 1;
    int mij;
    while(st<=dr){
        mij = st + (dr - st)/2;
        if(nr == sir[mij] && sir[mij+1] != nr)
            return mij;
        else if(nr >= sir[mij])
            st = mij+1;
        else 
            dr = mij - 1;
            
    }
    return -1;
}


int cerinta_1(int *sir, int nr, int n){
    int dr = n, st = 1;
    int mij;
    int max = 0;
    if(nr < sir[n]){
        while(st<=dr){
            mij = st + (dr - st)/2;
            if(nr == sir[mij] && sir[mij+1] != nr)
                return mij;
            if(dr - st == 1 && dr != nr)
                return st;
            if(nr >= sir[mij])
                st = mij + 1;
            else
                dr = mij -1;
        }   
    }
    
}

int cerinta_2(int *sir, int nr, int n){
    int dr = n, st = 1;
    int mij;
        while(st<=dr){
            mij = st + (dr - st)/2;
            if(sir[mij] == nr && sir[mij - 1] != nr)
                return mij;
            if(dr - st == 1 && st != nr)
                return dr;
            if(nr <=  sir[mij])
                dr = mij;
            else
                st = mij;
        }   
    }
    
int main()
{
    int n,m;
    fin >> n;
    int sir[n+2];
    for(int i=1; i<=n; i++){
        fin>>sir[i];
    }
    fin>>m;
    struct cerinte lista[m+1];
    for(int i=1; i<=m; i++){
        fin>>lista[i].index;
        fin>>lista[i].nr;
        if(lista[i].index == 0)
            fout<<cerinta_0(sir, lista[i].nr, n)<<'\n';
        if(lista[i].index == 1)
            fout<<cerinta_1(sir, lista[i].nr, n)<<'\n';
        if(lista[i].index == 2)
            fout<<cerinta_2(sir, lista[i].nr, n)<<'\n';
    }
    
//    for(int i=1; i<=m; i++){
//        fout<<lista[i].index<<' ';
//        fout<<lista[i].nr<<'\n';
//    }
    return 0;
}