Cod sursa(job #1263074)

Utilizator diana97Diana Ghinea diana97 Data 13 noiembrie 2014 21:35:28
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("cautbin.in");
ofstream g ("cautbin.out");

const int NMAX = 100000 + 1;

int n;
int v[NMAX];

void citeste() {
    f >> n;
    for (int i = 1; i <= n; i++) f >> v[i];
}

/*
0 x - cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
1 x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
*/

int caut0(int x) {
    int m, st = 1, dr = n;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (v[m] == x) return m;
        if (v[m] < x) st = m + 1;
        else dr = m - 1;
    }
    return -1;
}

int caut1(int x) {
    int m, st = 1, dr = n, sol;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (v[m] <= x) {sol = m; st = m + 1;}
        else dr = m - 1;
    }
    return sol;
}

int caut2(int x) {
    int m, st = 1, dr = n, sol;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (v[m] >= x) {sol = m; dr = m - 1;}
        else st = m + 1;
    }
    return sol;
}

void rezolva() {
    int m, q, x;
    f >> m;
    while (m--) {
        f >> q >> x;
        if (q == 0) g << caut0(x) << '\n';
        else if (q == 1)  g << caut1(x) << '\n';
        else  g << caut2(x) << '\n';
    }
}

int main() {
    citeste();
    rezolva();
}