Cod sursa(job #2450129)

Utilizator modulopaulModulopaul modulopaul Data 21 august 2019 23:59:11
Problema Cautare binara Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#define sh short
#define MAXN 100001


using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int v[MAXN];
int CB(int n,int x){
    int st=1,dr=n,mij=(st+dr)/2;
    while(st<dr){
        mij=(st+dr)/2;
        if(v[mij]>x)
            dr=mij-1;
        else if(v[mij]<x)
            st=mij+1;
        else if(v[mij]==x)
            st=dr=mij;
    }
    return st;
}
int main(){
    int n,m;
    fin>>n;
    for(int i=1;i<=n;i++){
       fin>>v[i];
    }
    fin>>m;
    for(int i=1;i<=m;i++){
        sh q;
        int x,poz;
        fin>>q>>x;
        poz=CB(n,x);
        if(q==0){
            if(v[poz]!=x)
                fout<<-1<<'\n';
            else{
                while(v[poz+1]==x)
                    poz++;
                fout<<poz<<'\n';
            }
        }
        else if(q==1){
            if(v[poz]==x){
                while(v[poz+1]==x)
                    poz++;
                fout<<poz<<'\n';
            }
            else if(v[poz]<x){
                while(v[poz+1]<=x)
                    poz++;
                fout<<poz<<'\n';
            }
            else if(v[poz]>x){
                while(v[poz]>x)
                    poz--;
                fout<<poz<<'\n';
            }
        }
        else if(q==2){
            if(v[poz]==x){
                while(v[poz-1]==x)
                    poz--;
                fout<<poz<<'\n';
            }
            else if(v[poz]<x){
                while(v[poz]<x)
                    poz++;
                fout<<poz<<'\n';
            }
            else if(v[poz]>x){
                while(v[poz-1]>=x)
                    poz--;
                fout<<poz<<'\n';
            }
        }
    }
    return 0;
}