Cod sursa(job #1602438)

Utilizator LurchssLaurentiu Duma Lurchss Data 16 februarie 2016 19:41:14
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define nmax 100005
using namespace std;

int n,m;
int a[nmax];

void read()
{
    scanf("%d\n",&n);
    for(int i=1;i<=n;i++)
        scanf("%d ",&a[i]);
    scanf("%d\n",&m);
}

int task_1(int st,int dr,int x)
{
    if(st==dr)
        if(a[st]==x)
            return st;
        else return -1;
    int mij=(st+dr)/2;
    return max(task_1(st,mij,x),task_1(mij+1,dr,x));
}

int task_2(int st,int dr,int x)
{
    if(st==dr)
        if(a[st]<=x)
            return st;
        else return -1;
    int mij=(st+dr)/2;
    return max(task_2(st,mij,x),task_2(mij+1,dr,x));
}

int task_3(int st,int dr,int x)
{
    if(st==dr)
        if(a[st]>=x)
            return st;
        else return nmax;
    int mij=(st+dr)/2;
    return min(task_3(st,mij,x),task_3(mij+1,dr,x));
}
int main()
{
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    read();
    int tip,x;
    for(int i=1;i<=m;i++,printf("\n"))
        {
            scanf("%d %d",&tip,&x);

            if(tip==0)
                printf("%d",task_1(1,n,x));
            if(tip==1)
                printf("%d",task_2(1,n,x));
            if(tip==2)
                printf("%d",task_3(1,n,x));
        }
    return 0;
}