Cod sursa(job #1773314)

Utilizator danielNiculaeDaniel Niculae danielNiculae Data 7 octombrie 2016 18:49:10
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include "fstream"

using namespace std;

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

const int NMAX = 100005;

int N, M;

int a[NMAX];

int getBiggest(int x) {
    int pow = 1;
    int res = 0;
    while(pow * 2 <= N) {
        pow *= 2;
    }
    while(pow) {
        if(res + pow <= N && a[res + pow] <= x) {
            res += pow;
        }
        pow /= 2;
    }
    return res;
}

int getSmallest(int x) {
    int pow = 1;
    int res = 0;
    while(pow * 2 <= N) {
        pow *= 2;
    }
    while(pow) {
        if(res + pow <= N && a[res + pow] < x) {
            res += pow;
        }
        pow /= 2;
    }
    return res + 1;
}

int main() {

    fin >> N;

    for(int i = 1 ; i <= N ; i++) {
        fin >> a[i];
    }

    fin >> M;


    int type, x;
    for(int i = 1 ; i <= M ; i++) {
        fin >> type >> x;
        if(type < 2) {
            int res = getBiggest(x);
            if(type == 0 && a[res] != x) {
                res = -1;
            }
            fout << res << '\n';
        }
        else {
            fout << getSmallest(x) << '\n';
        }
    }


    return 0;
}