Cod sursa(job #833723)

Utilizator whoasdas dasdas who Data 12 decembrie 2012 22:47:28
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
using namespace std;

ifstream in("cautbin.in");
ofstream out("cautbin.out");
int n, v[100000];


int last_le(int x) {
	int l = -1, r = n-1; // l excl; r incl
    int m;
    while (l < r) {
        m = l + (r - l + 1) / 2;
        if (v[m] <= x)
            l = m;
        else
            r = m - 1;
    }
    return l; /* == r_i */
}

int first_ge(int x) {
	int l = 0, r = n; // l incl; r excl
    int m;
    while (l < r) {
        m = l + (r - l) / 2;
        if (v[m] < x)
            l = m + 1;
        else
            r = m;
    }
    return l; /* == r */
}

int main() {
	int i, tmp, op, x, m;
    in>>n;
    for (i = 0; i < n; ++i)
        in>>v[i];
    in>>m;
    for (i = 0; i < m; ++i) {
        in>>op>>x;
        switch (op) {
        case 0: tmp = last_le(x);
                out<<(tmp >= 0 ? (v[tmp] == x ? tmp : -2) : -2) + 1<<endl; break;
        case 1: out<<last_le(x) + 1<<endl; break;
        case 2: out<<first_ge(x) + 1<<endl; break;
        }
    }
    return 0;
}