Cod sursa(job #1770076)

Utilizator Grama911Grama Andrei Grama911 Data 3 octombrie 2016 18:52:19
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <iostream>
#define N 100010
int n, v[N];

int solve0(int val)
{
    int li = 1;
    int lf = n;
    int m = (li + lf) / 2;
    while (li<=lf)
    {
        if (v[m] == val&&v[m] < v[m + 1])
            return m;
        if (v[m] <= val)
            li = m + 1;
        else
            lf = m - 1;
        m = (li + lf) / 2;
    }
    return -1;
}

int solve1(int val)
{
    int li = 1;
    int lf = n;
    int m = (li + lf) / 2;
    while (li <= lf)
    {
        if (v[m] <= val||v[m]==v[m+1])
            li = m + 1;
        else
            lf = m - 1;
        m = (li + lf) / 2;
    }
    return m;
}
int solve2(int val)
{
    int li = 1;
    int lf = n;
    int m = (li + lf) / 2;
    while (li <= lf)
    {
        if (v[m] >= val)
            lf = m - 1;
        else
            li = m + 1;
        m = (li + lf) / 2;
    }
    if (li <= lf)
        return m;
}
int main()
{
    int i, m, val, tip;
    FILE *fin=fopen("grader_test1.in", "r");
    FILE *fout=fopen("cautbin.out", "w");
    fscanf(fin,"%d", &n);
    for (i = 1; i <= n; ++i)
        fscanf(fin,"%d", &v[i]);
    fscanf(fin,"%d", &m);
    while (m--)
    {
        fscanf(fin,"%d%d", &tip, &val);
        if (tip == 0)
            fprintf(fout,"%d\n", solve0(val));
        if (tip == 1)
            fprintf(fout,"%d\n", solve1(val));
        if (tip == 2)
            fprintf(fout,"%d\n", solve2(val));
    }
    return 0;
}