Cod sursa(job #1873052)

Utilizator shantih1Alex S Hill shantih1 Data 8 februarie 2017 19:16:38
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <iostream>
#include <fstream>
using namespace std;

int N, M, j;
int i, nr, x, v[100], c, st, dr, mid;
int main () {
    
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    
    fin >> N;
    for (i = 1; i <= N; i++)    fin >> v[i];
    fin >> M;
    for (i = 1; i <= M; i++)
    {
        fin >> c >> x;
        st = 1;   dr = N;
        if (c == 0)
        {
            bool gasit = false;
            while (st <= dr && gasit == false)
            {
                mid = st + (dr-st)/2;
                if (mid == x)   gasit = true;
                if (mid < x)    st = mid+1;
                else if (mid > x)   dr = mid-1;
            }
            
            if (gasit == true)
            {
                st = 1;     dr = N;
                while (st <= dr)
                {
                    mid = st + (dr-st) / 2;
                    if (v[mid] <= x)    st = mid+1;
                    else if (v[mid] > x)     dr = mid-1;
                    if (v[mid+1] != x && v[mid] == x)     {   st = dr+1;    cout << mid << "\n";   }
                }
            }
            else cout << -1 << "\n";
            st = 1;   dr = N;
        }
        
        if (c == 1)
        {
            while (st <= dr)
            {
                mid = st + (dr-st) / 2;
                if (v[mid] <= x)    st = mid+1;
                if (v[mid] > x)     dr = mid-1;
                if (v[mid+1] > x || mid == N)   {   st = dr+1;   cout << mid << "\n";   }
                cout << mid << "\n";
            }
        }
        
        if (c == 2)
        {
            while (st <= dr)
            {
                mid = st + (dr-st) / 2;
                if (v[mid] > x)     dr = mid-1;
                else if (v[mid+1] <= x)  st = mid+1;
                if ((v[mid] <= x && v[mid+1] > x) || mid == N || mid == 1)  {   st = dr+1;   cout << mid << "\n";   }
            }
        }
    }
}
/*
 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 */