Cod sursa(job #1968147)

Utilizator the.manIon Man the.man Data 17 aprilie 2017 15:15:44
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
using namespace std;
ifstream fi("cautbin.in");
ofstream fo("cautbin.out");
int v[100001];

int binary_search (int p, int u, int key)
{
    while (p <= u)
    {
      int m = (p + u) / 2;
      if (v[m] == key) return 1;
      if (v[m] <  key) p = m + 1;
      if (v[m] >  key) u = m - 1;
    }
return 0;
}

int upper_bound(int p, int u, int key)
{
    int m;

    while (p < u){
        m = (p + u) / 2;
        if (v[m] <= key)
            p = m + 1;
        else
            u = m;
    }

    m = (p + u) / 2;
    if (v[m] > key)
       -- m;
    return m;
}

int lower_bound (int p, int u, int key) {
    int m;

    while (p < u) {
        m = (p + u) / 2;
        if (v[m] < key)
            p = m + 1;
        else
            u = m;
    }

    m = (p + u) / 2;
    if (v[m] < key)
       ++ m;
    return m;
}

int main () {
    int i, n, m, tip, val;

    fi>>n;
    for (i = 1; i <= n; ++ i) fi>>v[i];

     fi>>m;
    while (m --)
    {
          fi>>tip>>val;

          if (tip == 0)
             if (binary_search(1, n, val)==1)
                fo<< upper_bound (1, n, val)<<'\n';
                    else fo<<"-1"<<'\n';

          if (tip == 1)
             fo<< upper_bound (1, n, val)<<'\n';
          if (tip == 2)
             fo<< lower_bound (1, n, val)<<'\n';
    }

}