Cod sursa(job #2139873)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 22 februarie 2018 20:43:26
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#define N 100005

using namespace std;

int n, m, a[N], op, x;

void citire()
{
    scanf("%d\n", &n);
    for(int i=0;i<n;i++)
        scanf("%d ", &a[i]);
    sort(a, a+n);
}

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

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

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

int main()
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);

    citire();
    scanf("%d\n", &m);
    for(int i=0;i<m;i++)
    {
        scanf("%d %d\n", &op, &x);
        switch(op)
        {
            case 0: printf("%d\n", caut(x)); break;
            case 1: printf("%d\n", caut_min(x)); break;
            case 2: printf("%d\n", caut_max(x));
        }
    }
    return 0;
}