Cod sursa(job #1910479)

Utilizator TzeentchIoan-Teodor Tzeentch Data 7 martie 2017 17:07:45
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

FILE* in = fopen("cautbin.in", "r");
FILE* out = fopen("cautbin.out", "w");

int a[100000];

int cbin1(int n, int st, int dr){
    if(st>dr){
        return -1;
    }
    int p=st+(dr-st)/2;
    if(a[p]==n&&a[p+1]!=n){
        return p+1;
    }
    else {
        if(a[p]>n){
            return cbin1(n, st, p-1);
        }
        else return cbin1(n, p+1, dr);
    }
}

int cbin2(int n, int st, int dr){
    if(st>dr){
        return dr+1;
    }
    int p=st+(dr-st)/2;
    if(a[p]<=n&&a[p+1]>n){
        return p+1;
    }
    else {
        if(a[p]>n){
            return cbin2(n, st, p-1);
        }
        else return cbin2(n, p+1, dr);
    }
}

int cbin3(int n, int st, int dr){
    if(st>dr){
        return dr+1;
    }
    int p=st+(dr-st)/2;
    if(a[p]>=n&&a[p-1]<n){
        return p+1;
    }
    else {
        if(a[p]>=n){
            return cbin3(n, st, p-1);
        }
        else return cbin3(n, p+1, dr);
    }
}

int main()
{
    int n, i;
    fscanf(in, "%d", &n);
    for(i=0;i<n;i++){
        fscanf(in, "%d", &a[i]);
    }
    int t;
    fscanf(in, "%d", &t);
    for(i=0;i<t;i++){
        int x, y;
        fscanf(in, "%d%d", &x, &y);
        if(x==0){
            fprintf(out, "%d\n",
                    cbin1(y, 0, n-1));
        }
        else if(x==1){
            fprintf(out, "%d\n",
                    cbin2(y, 0, n-1));
        }
        else {
            fprintf(out, "%d\n",
                    cbin3(y, 0, n-1));
        }
    }
    return 0;
}