Cod sursa(job #820421)

Utilizator doomaSalagean Calin dooma Data 20 noiembrie 2012 20:17:15
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<fstream>
using namespace std;

int a[100000],N,i;
ofstream fout("cautbin.out");
ifstream fin("cautbin.in");

int binarySearch(int x){
    int mid, hi = N, lo = -1;
    while (hi - lo > 1){
        mid = lo + (hi - lo)/2;
        if(a[mid] < x) lo = mid;
        else hi = mid;
    }
    if(hi == N || a[hi] != x) return -1;
    else return hi;
}
void zero(int x){
    int tmp;
    tmp = binarySearch(x);
    if(tmp >= 0){
        for(i = 0; i + tmp < N && a[i+tmp] == x; i++);
        fout << tmp + i <<"\n";
    }
    else fout << "-1\n";
}
void one(int x){
    int tmp,ok = 0;
    tmp = binarySearch(x);
    if(tmp >= 0){
        for(i = 0; i + tmp < N && a[i+tmp] == x; i++);
        fout << tmp + i <<"\n";
    }
    else{
        for(i = x - 1; i >= a[0] && !ok; i--){
            tmp = binarySearch(i);
            if(tmp > -1){
                fout << tmp << "\n";
                ok = 1;
            }
        }
        if(!ok) fout << "-1\n";
    }
}
void two(int x){
    int tmp, ok = 0;
    tmp = binarySearch(x);
    if(tmp >= 0){
        for(i = 0; tmp - i >= 0 && a[tmp - i] == x; i++);
        fout << tmp - i + 2<<"\n";
    }
    else{
        for(i = x + 1; i <= a[N-1] && !ok; i++){
            tmp = binarySearch(i);
            if(tmp > -1){
                fout << tmp << "\n";
                ok = 1;
            }
        }
        if(!ok) fout << "-1\n";
    }
}
int main()
{

    int M,i,sType,x;
    fin >> N;
    for(i = 0 ; i < N; i++){
        fin >> a[i];
    }

    fin >> M;
    for(i = 0; i < M; i++){
        fin >> sType >> x;
        switch(sType){
            case 0: zero(x);
            break;
            case 1: one(x);
            break;
            case 2: two(x);
            break;
            default: break;
        }
    }

    fin.close();
    fout.close();
    return 0;
}