Cod sursa(job #2845831)

Utilizator shirokumaShiro Kuma shirokuma Data 8 februarie 2022 13:50:50
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define N 100010
using namespace std;
int v[N];//={0,1,1,1,2,3,3,3,5,5,5,7};
///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
int bsearch0 (int st, int dr, int x)
{
    int m,poz=-1;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(v[m]<=x)
        {
            poz=m;
            st=m+1;
        }
        else
        {
            dr=m-1;
        }
    }
    if(v[poz]!=x)
        poz=-1;
    return poz;

}
///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

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

    return poz;
}
///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 bsearch_prim (int st, int dr, int x)
{
   int m,poz;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(v[m]>=x)
        {
            poz=m;
            dr=m-1;
        }
        else
        {
            st=m+1;
        }
    }

    return poz;
}

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

    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    scanf("%d", &n);
    for (i = 1; i <= n; ++ i)
        scanf("%d", &v[i]);

    scanf("%d", &m);
    while (m --)
    {
        scanf("%d%d", &tip, &val);
        if (tip == 0)
            printf("%d\n", bsearch0(1, n, val));
        if (tip == 1)
            printf("%d\n", bsearch_ultim(1, n, val));
        if (tip == 2)
            printf("%d\n", bsearch_prim(1, n, val));
    }
    exit(0);
}