Cod sursa(job #3247827)

Utilizator EdaterHunterDavid Horia EdaterHunter Data 9 octombrie 2024 12:44:39
Problema Cautare binara Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 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,i = 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, i = 1;
    int mij;
    int max = 0;
    for(int i = 1; i <= n; i++)
        if(max < sir[i] && sir[i] <= nr)
            max = sir[i];
    if(nr < sir[n]){
        while(st<=dr){
            mij = st + (dr - st)/2;
            if(max == sir[mij] && sir[mij+1] != max)
                return mij;
            if(max >= 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, mim = 0;
    for(int i=1; i<=n; i++)
        if(sir[i] >= nr){
            return i;
            break;
        }
}
int main()
{
    int n,m,c;
    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';
    }
    
    return 0;
}