Cod sursa(job #1164273)

Utilizator SRaduRadu Szasz SRadu Data 1 aprilie 2014 23:06:31
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>

using namespace std;

const int MAX = 100050;

int N, M;

int V[MAX];

inline int LowerBound(int X) {
    int Ans = 0;
    for(int step = (1 << 17); step; step >>= 1) {
        if(Ans + step <= N && V[Ans + step] <= X)
            Ans += step;
    } return Ans;
}

inline int UpperBound(int X) {
    int Ans = 0; 
    for(int step = (1 << 17); step; step >>= 1) {
        if(Ans + step <= N && V[Ans + step] < X) 
            Ans += step;
    } return Ans + 1;
}

int main() {
    ifstream in("cautbin.in"); ofstream out("cautbin.out");
    in >> N;
    for(int i = 1; i <= N; i++)
        in >> V[i];
    in >> M;
    for(int i = 1, op, A, poz; i <= M; i++) {
        in >> op >> A;
        switch(op) {
        case 0: 
            poz = LowerBound(A);
            if(V[poz] != A) 
                out << "-1\n";
            else 
                out << poz << "\n";
            break;
        case 1:
            out << LowerBound(A) << "\n";
            break;
        case 2:
            out << UpperBound(A) << "\n";
            break;
        }
    }
}