Cod sursa(job #2277692)

Utilizator LucianTLucian Trepteanu LucianT Data 6 noiembrie 2018 18:50:58
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
using namespace std;

const int maxN=1e5+1;

int n,q;
int pow2n;

int v[maxN];

int binSearch1(int val){
    int res;
    int step=pow2n;

    for(res=1;step>0;step>>=1)
        if(res+step<=n && v[res+step]<=val)
            res+=step;

    if(v[res]==val)
        return res;
    return -1;
}

int binSearch2(int val){
    int res;
    int step=pow2n;

    for(res=1;step>0;step>>=1)
        if(res+step<=n && v[res+step]<=val)
            res+=step;

    return res;
}

int binSearch3(int val){
    int res;
    int step=pow2n;

    for(res=n;step>0;step>>=1)
        if(res-step>=1 && v[res-step]>=val)
            res-=step;

    return res;
}

int main(){
    ifstream cin("cautbin.in");
    ofstream cout("cautbin.out");

    cin>>n;
    for(pow2n=1;pow2n<n;pow2n<<=1);

    for(int i=1;i<=n;i++)
        cin>>v[i];

    cin>>q;
    while(q--){
        int op,x;
        cin>>op>>x;

        if(op==0)
            cout<<binSearch1(x)<<'\n';
        else if(op==1)
            cout<<binSearch2(x)<<'\n';
        else cout<<binSearch3(x)<<'\n';
    }

    return 0;
}