Cod sursa(job #890509)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 25 februarie 2013 10:03:33
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<iostream>
#include<fstream>
using namespace std;

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

int n, k, v[100001], x, y, i;

inline void caut0(int g) {
    int in = 1, sf = n, mij;
    while(in < sf) {
        mij = (sf - in) / 2 + in;
        if(v[mij] <= g) {
            in = mij + 1;
        }
        else {
            sf = mij - 1;
        }
    }
    if(v[mij] > g) {
        mij--;
    }
    if(v[mij] == g) {
        fout << mij << '\n';
    }else fout << -1 << '\n';
}

inline void caut1(int g) {
    int in = 1, sf = n, mij;
    while(in < sf) {
        mij = (sf - in) / 2 + in;
        if(v[mij] <= g) {
            in = mij + 1;
        }
        else {
            sf = mij;
        }
    }
    if(sf == in) {
        mij = sf;
    }
    if(v[mij] > g) {
        mij--;
    }
    fout << mij << '\n';
}

inline void caut2(int g) {
    int in = 1, sf = n, mij;
    while(in < sf) {
        mij = (sf - in) / 2 + in;
        if(v[mij] < g) {
            in = mij + 1;
        }
        else {
            sf = mij;
        }
    }
    if(sf == in) {
        mij = sf;
    }
    if(v[mij] < g) {
        mij++;
    }
    fout << mij << '\n';
}

int main() {
    fin >> n;
    for(i = 1; i <= n; ++i) {
        fin >> v[i];
    }
    fin >> k;
    for(i = 0; i < k; ++i) {
        fin >> x;
        fin >> y;
        if(x == 0) {
            caut0(y);
        }
        if(x == 1) {
            caut1(y);
        }
        if(x == 2) {
            caut2(y);
        }
    }
    fin.close();
    fout.close();
    return 0;
}