Cod sursa(job #833728)

Utilizator whoasdas dasdas who Data 12 decembrie 2012 22:55:08
Problema Cautare binara Scor 0
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], m, l, r;


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

static inline int first_ge(int x) {
	l = 0, r = n; // l incl; r excl
    while (l < r) {
        m = (l - r) / 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<<"\n"; break;
        case 1: out<<last_le(x) + 1<<"\n"; break;
        case 2: out<<first_ge(x) + 1<<"\n"; break;
        }
    }
    return 0;
}