Cod sursa(job #3208614)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 29 februarie 2024 00:36:03
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <cstdio>
#include <climits>

using namespace std ;
FILE *fin, *fout ;

#define NMAX 100000
int v[NMAX + 5] ;
int n ;

int task0 (int nr)
{
    nr++;
    int left = 1, right = n, mid;
    bool ok = false;

    while(left <= right)
    {
        mid = (left + right) / 2;

        if(v[mid] < nr and v[mid + 1] >= nr)
            return mid;

        else if(v[mid] < nr)
            left = mid + 1;
        else if(v[mid] >= nr)
            right = mid - 1;
    }

    if(ok == false)
        return -1;
}



int task1 (int nr)
{
    int left = 1, right = n, mid;

    while(left <= right)
    {
        mid = (left + right) / 2;

        if(v[mid] <= nr and v[mid + 1] > nr)
            return mid;
        else if(v[mid] <= nr)
            left = mid + 1;
        else if(v[mid] > nr)
            right = mid - 1;
    }
}

int task2 (int nr)
{
    int left = 1, right = n, mid;

    while(left <= right)
    {
        mid = (left + right) / 2;

        if(mid == 0)
            return 1;

        if(v[mid] >= nr and v[mid - 1] < nr)
            return mid;
        else if(v[mid] < nr)
            left = mid + 1;
        else if(v[mid]>= nr)
            right = mid - 1;
    }
}

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

    fscanf(fin, "%d", &n) ;

    for(int i = 1 ; i <= n ; i++)
        fscanf(fin, "%d", &v[i]) ;

    v[n + 1] = INT_MAX;

    int m ;
    fscanf(fin, "%d", &m) ;

    for(int i = 1 ; i <= m; i++)
    {
        int task, nr ;
        fscanf(fin, "%d%d", &task, &nr);

        if(task == 0)
        {
            int t0 = task0(nr);

            if(t0 == -1)
                fprintf(fout, "%d\n", t0);
            else if(v[t0] == nr)
                fprintf(fout, "%d\n", t0);
            else fprintf(fout, "-1\n");
        }
        else if(task == 1)
            fprintf(fout, "%d\n", task1(nr)) ;
        else if(task == 2)
            fprintf(fout, "%d\n", task2(nr)) ;
    }
    fclose(fin) ;
    fclose(fout) ;
    return 0 ;
}