Cod sursa(job #2627453)

Utilizator andreic06Andrei Calota andreic06 Data 10 iunie 2020 21:17:43
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>

using namespace std;
const int N = 1e5;
const int M = 1e5;
int v[N+1];

ifstream fin ( "cautbin.in" );
ofstream fout ( "cautbin.out" );

int cb_poz_max_x ( int x, int n ) {
   int st, dr, poz = -1;

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

int cb_poz_max_less_equal_x ( int x, int n ) {
   int st, dr, poz;

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

int cb_poz_min_bigger_equal_x ( int x, int n ) {
   int st, dr, poz;

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

int main()
{
   int n, m;
   int tip, x;

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

   fin >> m;
   for ( int i = 1; i <= m; i ++ ) {
      fin >> tip >> x;

      if ( tip == 0 )
        fout << cb_poz_max_x ( x, n );
      else if ( tip == 1 )
        fout << cb_poz_max_less_equal_x ( x, n );
      else if ( tip == 2 )
        fout << cb_poz_min_bigger_equal_x ( x, n );
      fout << '\n';
   }



    return 0;
}