Cod sursa(job #833733)

Utilizator whoasdas dasdas who Data 12 decembrie 2012 23:01:33
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
using namespace std;

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


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 */
}

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, mm;
    in>>n;
    for (i = 0; i < n; ++i)
        in>>v[i];
    in>>mm;
    for (i = 0; i < mm; ++i) {
        in>>op>>x;
        switch (op) {
        case 0: tmp = last_le(x);
                out<<(tmp >= 0 ? (v[tmp] == x ? tmp + 1 : -1) : -1)<<"\n"; break;
        case 1: out<<last_le(x) + 1<<"\n"; break;
        case 2: out<<first_ge(x) + 1<<"\n"; break;
        }
    }
    return 0;
}