Cod sursa(job #2635237)

Utilizator irimia_alexIrimia Alex irimia_alex Data 13 iulie 2020 18:59:43
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#define NMAX 100000

using namespace std;

FILE* fin, * fout;
int n, m, v[NMAX];

int type0(int x) {
    int i = 0, j = n - 1;
    while (i <= j) {
        int m = i + (j - i) / 2;
        if (v[m] == x && (m == n - 1 || v[m + 1] != x))
            return m + 1;
        if (v[m] <= x)
            i = m + 1;
        else
            j = m - 1;
    }
    return -1;
}

int type1(int x) {
    int i = 0, j = n - 1;
    while (i <= j) {
        int m = i + (j - i) / 2;
        if (v[m] <= x && (m == n - 1 || v[m + 1] > x))
            return m + 1;
        if (v[m] <= x)
            i = m + 1;
        else
            j = m - 1;
    }
}

int type2(int x) {
    int i = 0, j = n - 1;
    while (i <= j) {
        int m = i + (j - i) / 2;
        if (v[m] >= x && (m == 0 || v[m - 1] < x))
            return m + 1;
        if (v[m] < x)
            i = m + 1;
        else
            j = m - 1;
    }
}

int main()
{
    fin = fopen("cautbin.in", "r");
    fout = fopen("cautbin.out", "w");

    fscanf(fin, "%i", &n);
    for (int i = 0;i < n;++i)
        fscanf(fin, "%i ", &v[i]);
    fscanf(fin, "%i", &m);
    while (m--) {
        int t, x;
        fscanf(fin, "%i %i", &t, &x);
        int res;
        if (t == 0) res = type0(x);
        else if (t == 1) res = type1(x);
        else res = type2(x);
        fprintf(fout,"%i\n", res);
    }

  
    return 0;
}