Cod sursa(job #3030666)

Utilizator SamurayxJackDiaconescu Octavian SamurayxJack Data 17 martie 2023 19:59:42
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include<bits/stdc++.h>
using namespace std;

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

const int Nmax=1e5+1;

int n,m,v[Nmax];

int cb1(int,int,int,int);
int cb2(int,int,int,int);
int cb3(int,int,int,int);

int main(){
    fin>>n;
    for(int i=1;i<=n;i++)
      fin>>v[i];
    fin>>m;
    int t,a;
    for(int i=1;i<=m;i++){
        fin>>t>>a;
        if(t==0) fout<<cb1(1,n,a,n+1)<<'\n';
        else if(t==1) fout<<cb2(1,n,a,n+1)<<'\n';
        else fout<<cb3(1,n,a,n+1)<<'\n';
    }
    return 0;
}

int cb1(int st, int dr, int x,int poz){
    if(st<=dr){
        int m=(st+dr)/2;
        if(v[m]==x) return cb1(m+1,dr,x,m);
        else if(v[m]>x) return cb1(st,m-1,x,poz);
        else return cb1(m+1,dr,x,poz);
    }
    else{
        if(poz==n+1) return -1;
        else return poz;
    }
}
int cb2(int st, int dr, int x,int poz){
    if(st<=dr){
        int m=(st+dr)/2;
        if(v[m]<=x) return cb1(m+1,dr,x,m);
        else return cb1(st,m-1,x,poz);
    }
    else return poz;
}
int cb3(int st, int dr, int x,int poz){
    if(st<=dr){
        int m=(st+dr)/2;
        if(v[m]>=x) return cb1(st,m-1,x,m);
        else return cb1(m+1,dr,x,poz);
    }
    else return poz;
}