Cod sursa(job #1335460)

Utilizator TataruTataru Mihai Tataru Data 5 februarie 2015 15:59:02
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#define inFile "cautbin.in"
#define outFile "cautbin.out"

using namespace std;

int n, t, tip, nr, v[100001];

int c_fix(int begg, int endd)
{
    int k;
    while(begg <= endd){
        k = (begg + endd) / 2;
        if(v[k] > nr) endd = k - 1;
        else begg = k + 1;
    }
    k = (begg + endd) / 2;
    if(v[k] > nr) k--;
    if(v[k] == nr)
    return k;
    return -1;
}

int c_less(int begg, int endd)
{
    int k;
    while(begg < endd){
        k = (begg + endd) / 2;
        if(v[k] > nr) endd = k;
        else begg = k + 1;
    }
    k = (begg + endd) / 2;
    if(v[k] > nr) k--;
    return k;
}

int c_big(int begg, int endd)
{
    int k;
    while(begg < endd){
        k = (begg + endd) / 2;
        if(v[k] >= nr) endd = k;
        else begg = k + 1;
    }
    k = (begg + endd) / 2;
    if(v[k] < nr) k++;
    return k;
}



void solve()
{
    ifstream fin(inFile);
    ofstream fout(outFile);

    fin>>n;
    for(int i = 1; i <= n; ++i) fin>>v[i];
    fin>>t;
    for(int k = 1; k <= t; ++k){
        fin>>tip>>nr;
        switch(tip){
            case 0:fout<<c_fix(1,n)<<"\n"; break;
            case 1:fout<<c_less(1,n)<<"\n"; break;
            case 2:fout<<c_big(1,n)<<"\n"; break;
        }
    }
}

int main()
{
    solve();
}